This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[TI]TM4C123GH6PZ sys sleep 模式



由于时间比较紧,关于Sleep功能,刚看了一下,但不确定理解是否正确,以下几个问题希望帮忙确认一下:

1 首先通过调用SysCtlPeripheralSleepDisable()、SysCtlPeripheralSleepEnable() 配置sleep模式下需要Disable、Enable的外设

2 通过调用SysCtlSleep()进入sleep模式(看DataSheet,进入sleep模式后处理器不再执行代码,但实际程序还是RUN的状态,不知道问题出在了哪里)

 3 DataSheet,从sleep模式下被唤醒时,需要有足够优先级的中断产生才能被唤醒 这个不太理解,足够优先级指的是?

4 在Sleep模式下,只要此中断的GPIO是Enable的状态,当有触发时,中断就会产生吗?中断产生之后,需要做什么操作才能从sleep模式拖出。

 5 能否提供一个关于进入sleep 与 从sleep模式拖出的例程?

万分感谢!

  • 先讲下SLEEP和DEEPSLEEP的基本知识。

    M4 有三种工作模式,其中ACTIVE是正常工作模式,这个时候CPU内核从FLASH或RAM中取值执行用户代码。SLEEP模式下,CPU是停止工作的,也就是不再从FLASH、RAM中取指执行,但系统的时钟系统是不停止的。如果开启了PLL,那么PLL会继续工作。这个状态下,需要时钟才能工作的外设是处于工作状态的。比如UART,SPI,TIMER等等。 系统从SLEEP状态恢复到ACTIVE状态,只需要直接把时钟提供给CPU就行了。在DEEP SLEEP模式下 CPU停止工作,外部时钟也会被关闭,如果开启了PLL, PLL会被停止。系统转由内部片上时钟提供时钟源。系统从DEEP SLEEP模式下回到ACTIVE模式时,需要等恢复原来的时钟后才能工作.

    进入睡眠或深度睡眠之前,需要使能在睡眠状态下工作的外设,比如GPIO,

    SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_GPIOG);

    然后调用

    SysCtlSleep或SysCtlDeepSleep让CPU进入睡眠模式.

    只要在睡眠或深度睡眠状态之前被使能的外设,在CPU睡眠后都会继续工作,并产生中断,中断发生后程序会进入中断处理函数执行。中断处理函数结束后,PC指针重新指向调用睡眠的函数后面的第一个语句开始执行。

    而不需要什么把CPU拖出SLEEP的操作。

     

  • 目前我的问题是调用了SysCtlSleep()后,CPU没有进入睡眠模式

     SysCtlPeripheralSleepDisable(SYSCTL_PERIPH_PWM0|SYSCTL_PERIPH_PWM1|SYSCTL_PERIPH_ADC0|SYSCTL_PERIPH_ADC1|SYSCTL_PERIPH_UART2|SYSCTL_PERIPH_UART7|SYSCTL_PERIPH_UART3);
     SysCtlPeripheralSleepDisable(SYSCTL_PERIPH_GPIOA|SYSCTL_PERIPH_GPIOB|SYSCTL_PERIPH_GPIOC|SYSCTL_PERIPH_GPIOD|SYSCTL_PERIPH_GPIOE|SYSCTL_PERIPH_GPIOF|SYSCTL_PERIPH_GPIOH|SYSCTL_PERIPH_GPIOH|SYSCTL_PERIPH_GPIOJ);

    SysCtlSleep();

     

    在进入sleep模式前,已经disable了UART2,但实际上还是能正常输入输出数据,而且TIMER定周期函数也是run的状态。

    不知道问题出在了哪里