STM32待机模式测试
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
参考链接:http://www.docin.com/p-114352411.html
环境:
主机:XP
开发环境:MDK4.10
单片机:STM32F103C8
功能:
开启RTC闹钟,然后进入待机模式,用闹钟唤醒后退出.
说明:
1.RTC闹钟唤醒事件发生时,同时进入闹钟中断,必须在初始化时与外部中断线17关联
2.如果仅想退出待机模式,RTC闹钟事件已经足够,不必与外部中断线17关联
3.退出待机模式后,接下来的流程类似于按下复位按键,程序会从头开始执行
源代码:
初始化时钟,配置时钟为内部时钟LSI,配置RTC闹钟唤醒以及外部中断线17
- void RTC_Configuration(void)
- {
- //定义中断结构体
- NVIC_InitTypeDef NVIC_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- //中断时钟使能
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- //中断优先级配置
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- //设置RTC闹钟中断
- NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //闹钟中断接到第17线外部中断
- EXTI_ClearITPendingBit(EXTI_Line17);
- EXTI_InitStructure.EXTI_Line = EXTI_Line17;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- //PWR_WakeUpPinCmd(DISABLE);
- //电源管理部分时钟开启
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- //使能后备寄存器访问
- PWR_BackupAccessCmd(ENABLE);
- BKP_ClearFlag();
- BKP_DeInit();
- //使能LSI
- RCC_LSICmd(ENABLE);
- //等待晶振启动
- while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
- {}
- //设置时钟为内部晶振
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
- RCC_RTCCLKCmd(ENABLE);
- //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
- RTC_WaitForSynchro();
- RTC_WaitForLastTask();
- //使能闹钟中断
- RTC_ITConfig(RTC_IT_ALR, ENABLE);
- RTC_WaitForLastTask();
- //分频系数
- RTC_SetPrescaler(40000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
- RTC_WaitForLastTask();
- //初始计数值
- RTC_SetCounter(0);
- RTC_WaitForLastTask();
- //设置闹钟时间
- RTC_SetAlarm(2);
- RTC_WaitForLastTask();
- }
闹钟唤醒中断代码:
- void RTCAlarm_IRQHandler(void)
- {
- //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1
- RTC_WaitForSynchro();
- if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
- {
- USART_SendData(USART1,'d'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- USART_SendData(USART1,'i'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- // 清EXTI_Line17挂起位
- EXTI_ClearITPendingBit(EXTI_Line17);
- // 检查唤醒标志是否设置
- if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
- {
- // 清除唤醒标志
- PWR_ClearFlag(PWR_FLAG_WU);
- }
- /* Clear the RTC Second interrupt */
- RTC_SetCounter(0);
- RTC_WaitForLastTask();
- RTC_ClearITPendingBit(RTC_IT_ALR);
- RTC_WaitForLastTask();
- //RTC_SetAlarm(2);
- //RTC_WaitForLastTask();
- }
- return;
- }
测试代码: (这是工程中的一部分,包含一些无关代码)
- int main(void)
- {
- struct _match_string_header match_string_header;
- struct _match_string_tail match_string_tail;
- unsigned char buffer[LEN_BUF];
- unsigned char buffer1[LEN_BUF];
- int len = 0;
- int i = 0;
- int j = 0;
- int flag = 0;
- int flag2 = 0;
- int flag3 = 0;
- int baud = 0;
- unsigned short temp = 0;
- //初始化系统
- init();
- //初始化蓝牙
- //读取flash中波特率
- //write_baud(&edit_flash,9600);
- //baud = read_baud(&edit_flash);
- //读取有效
- if (baud > 0)
- {
- set_uart_baud(1,baud);
- set_uart_baud(2,baud);
- }
- else
- {
- //设置默认波特率
- set_uart_baud(1,DEFAULT_BAUD);
- set_uart_baud(2,DEFAULT_BAUD);
- }
- //设置默认波特率
- //Delay(10);
- init_blue(DEFAULT_BAUD);
- set_uart_baud(1,DEFAULT_BAUD);
- set_uart_baud(2,DEFAULT_BAUD);
- //Delay(500);
- init_blue(DEFAULT_BAUD);
- set_uart_baud(1,DEFAULT_BAUD);
- set_uart_baud(2,DEFAULT_BAUD);
- //初始化匹配字符
- init_match_string_header(&match_string_header,"AT+BAUD");
- init_match_string_tail(&match_string_tail,"END",8);
- //读取2号备份寄存器中的值
- temp = BKP_ReadBackupRegister(BKP_DR2);
- if (temp == 0xabcd)
- {
- USART_SendData(USART1,'j'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- USART_SendData(USART1,'d'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- USART_SendData(USART1,'h'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- }
- else
- {
- //写入2号备份寄存器
- BKP_WriteBackupRegister(BKP_DR2,0xabcd);
- USART_SendData(USART1,'9'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- USART_SendData(USART1,'9'); //发送数据
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
- }
- //测试低功耗:待机模式
- for (i = 0;i < 30000;i++)
- {
- for (j = 0;j < 500;j++)
- {
- __nop();
- }
- }
- PWR_EnterSTANDBYMode();
- while (1);}