官方提高的待机模式例程不能正常工作,烧写后造成进入待机模式无法唤醒,同时还导致无法再次烧写程序。后来我通过官方的MM32-LINK尝试了半天,才把程序擦除,否则就要把芯片吹下来重新焊一颗了。
我对例程做了两点修改:
1 增加状态指示灯。当芯片进入待机模式后,指示灯就会停止闪烁;
2 在main函数内增加WKUP_Init调用,实现芯片待机后,通过PA0-WKUP功能唤醒芯片。mm32f003从待机模式唤醒后,会自动重启。
代码主要分为待机模式设置、唤醒设置和main函数流程三个部分。
1 待机模式设定
在main函数中调用PWR_EnterSTANDBYMode();
函数即可马上进入待机模式。
2 唤醒设置
void WKUP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SYSCFG_EXTILineConfig( EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //config interrupt line
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
PWR_WakeUpPinCmd(ENABLE); //enable wakeup
}
void EXTI0_1_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0);
}
3 main函数流程
int main(void)
{
RCC_ConfigInit();
GPIO_ConfigInit();
Uart_ConfigInit(9600);
UartSendGroup((u8*)printBuf, sprintf(printBuf, "sprintf ok\r\n"));
delay_init();
LED_Init();
LED1_ON();
delay_ms(2000);
LED1_OFF();
delay_ms(2000);
LED1_ON();
delay_ms(2000);
WKUP_Init();
PWR_EnterSTANDBYMode();
while(1) {
LED1_ON();
delay_ms(500);
LED1_OFF();
delay_ms(500);
LED1_ON();
delay_ms(500);
}
}
由于待机模式会造成内存和寄存器数据丢失,所以唤醒后会自动重启。
官方例程的修正已基本完成,需要程序的同学可以到百度网盘下载。
提取码:0o5i
网友评论