STM32待机模式测试

来源:互联网 发布:软件开发没有银弹 编辑:程序博客网 时间:2024/04/30 02:08

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位(寄存器同步标志)被硬件置1RTC_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位(寄存器同步标志)被硬件置1RTC_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);}




原创粉丝点击