可以看到停止模式和待机模式唯一的不同就是PDDS位设置相反,然后就是选择是否要开启电压调节器,并且这个和停止模式一样在固件库中有函数可以调用,进入停止模式还是简单的,接下来是退出同样也是只要一个中断都可以唤醒处理器,和前面差不多。论坛上说唤醒后处理器速度很慢,唤醒后我也遇到这个问题led闪烁的频率变慢很多,
96ce2b9a93b0a1fc4fac900873d02ab2_64.png (0 Bytes, 下载次数: 8)
2010-12-14 22:54 上传
就是说唤醒后变成内部时钟,所以我们要做的是在唤醒后就把时钟想复位那样的初始化一遍,于是我想用已经有的系统初始化函数,来初始化时钟来达到目的,所以要做的是在唤醒处理器的那个中断服务函数中加入初始化函数,我照搬system_stm32x.c中的函数写了一下函数
[mw_shl_code=c,true]void clock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}[/mw_shl_code]
因为我是一只用库函数写的这里有些寄存器看不懂不过还好能达到目的,看来要真正的掌握32,对寄存器操作也要了解,我这样的菜鸟是心有余力不足,最后附上我用写的停止和睡眠模式代码,因为是直接改原子哥的代码的有些地方注释是没有改的,我是通过LED灯来反应现象的.
眠模式如何实现一个IO来控制进出随眠模式,NVIC的通道挂起位如何清除?这两个问题为能搞清除希望各位能给点提示,以上所说肯定有不对的地方还请大神们批评指正。
3.大家来谈谈低功耗的应用吧,在论坛上我看到http://www.openedv.com/posts/list/18372.htm这篇帖子非常好,让还是学生的我感觉任重道远啊,低功耗还是很有搞头的,这篇贴学到了好多东西就比如不用的IO不要不管,往往他也会耗电
最后顶下原子哥