STM32待机模式测试

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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void RTC_Configuration(void)  
  2. {  
  3.     //定义中断结构体  
  4.     NVIC_InitTypeDef NVIC_InitStructure;  
  5.     EXTI_InitTypeDef EXTI_InitStructure;  
  6.     //中断时钟使能  
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  
  8.   
  9.     //中断优先级配置  
  10.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
  11.     //设置RTC闹钟中断  
  12.     NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;  
  13.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  14.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  15.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  16.     NVIC_Init(&NVIC_InitStructure);  
  17.   
  18.     //闹钟中断接到第17线外部中断  
  19.     EXTI_ClearITPendingBit(EXTI_Line17);  
  20.     EXTI_InitStructure.EXTI_Line = EXTI_Line17;  
  21.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  22.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
  23.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  24.     EXTI_Init(&EXTI_InitStructure);  
  25.   
  26.     //PWR_WakeUpPinCmd(DISABLE);    
  27.   
  28.     //电源管理部分时钟开启  
  29.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);  
  30.     //使能后备寄存器访问  
  31.     PWR_BackupAccessCmd(ENABLE);  
  32.     BKP_ClearFlag();  
  33.     BKP_DeInit();  
  34.     //使能LSI  
  35.     RCC_LSICmd(ENABLE);  
  36.     //等待晶振启动  
  37.     while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)  
  38.     {}  
  39.     //设置时钟为内部晶振  
  40.     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);    
  41.     RCC_RTCCLKCmd(ENABLE);  
  42.     //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1  
  43.     RTC_WaitForSynchro();  
  44.     RTC_WaitForLastTask();  
  45.     //使能闹钟中断  
  46.     RTC_ITConfig(RTC_IT_ALR, ENABLE);  
  47.     RTC_WaitForLastTask();  
  48.     //分频系数  
  49.     RTC_SetPrescaler(40000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */  
  50.     RTC_WaitForLastTask();  
  51.     //初始计数值  
  52.     RTC_SetCounter(0);  
  53.     RTC_WaitForLastTask();  
  54.     //设置闹钟时间  
  55.     RTC_SetAlarm(2);  
  56.     RTC_WaitForLastTask();  
  57. }  

闹钟唤醒中断代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void RTCAlarm_IRQHandler(void)  
  2. {                 
  3.     //等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1  
  4.     RTC_WaitForSynchro();  
  5.   if (RTC_GetITStatus(RTC_IT_ALR) != RESET)  
  6.   {  
  7.     USART_SendData(USART1,'d');                              //发送数据  
  8.     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  9.     USART_SendData(USART1,'i');                              //发送数据  
  10.     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  11.   
  12.     // 清EXTI_Line17挂起位  
  13.     EXTI_ClearITPendingBit(EXTI_Line17);  
  14.     // 检查唤醒标志是否设置  
  15.     if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)  
  16.     {  
  17.         // 清除唤醒标志  
  18.         PWR_ClearFlag(PWR_FLAG_WU);  
  19.     }  
  20.   
  21.     /* Clear the RTC Second interrupt */  
  22.     RTC_SetCounter(0);  
  23.     RTC_WaitForLastTask();  
  24.     RTC_ClearITPendingBit(RTC_IT_ALR);  
  25.     RTC_WaitForLastTask();  
  26.     //RTC_SetAlarm(2);  
  27.     //RTC_WaitForLastTask();  
  28.   }  
  29.   
  30.   return;  
  31. }  

测试代码: (这是工程中的一部分,包含一些无关代码)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int main(void)  
  2. {  
  3.     struct _match_string_header match_string_header;  
  4.     struct _match_string_tail match_string_tail;  
  5.     unsigned char buffer[LEN_BUF];  
  6.     unsigned char buffer1[LEN_BUF];  
  7.     int len = 0;  
  8.     int i = 0;  
  9.     int j = 0;  
  10.     int flag = 0;  
  11.     int flag2 = 0;  
  12.     int flag3 = 0;  
  13.     int baud = 0;  
  14.     unsigned short temp = 0;   
  15.   
  16.     //初始化系统  
  17.     init();  
  18.     //初始化蓝牙  
  19.     //读取flash中波特率  
  20.     //write_baud(&edit_flash,9600);  
  21.     //baud = read_baud(&edit_flash);  
  22.     //读取有效  
  23.     if (baud > 0)  
  24.     {  
  25.         set_uart_baud(1,baud);  
  26.         set_uart_baud(2,baud);  
  27.     }  
  28.     else  
  29.     {  
  30.         //设置默认波特率  
  31.         set_uart_baud(1,DEFAULT_BAUD);  
  32.         set_uart_baud(2,DEFAULT_BAUD);  
  33.     }  
  34.   
  35.     //设置默认波特率  
  36.     //Delay(10);  
  37.     init_blue(DEFAULT_BAUD);  
  38.     set_uart_baud(1,DEFAULT_BAUD);  
  39.     set_uart_baud(2,DEFAULT_BAUD);  
  40.     //Delay(500);  
  41.     init_blue(DEFAULT_BAUD);  
  42.     set_uart_baud(1,DEFAULT_BAUD);  
  43.     set_uart_baud(2,DEFAULT_BAUD);  
  44.   
  45.     //初始化匹配字符  
  46.     init_match_string_header(&match_string_header,"AT+BAUD");  
  47.     init_match_string_tail(&match_string_tail,"END",8);  
  48.   
  49.     //读取2号备份寄存器中的值  
  50.     temp = BKP_ReadBackupRegister(BKP_DR2);  
  51.     if (temp == 0xabcd)  
  52.     {  
  53.         USART_SendData(USART1,'j');                              //发送数据  
  54.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  55.         USART_SendData(USART1,'d');                              //发送数据  
  56.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  57.         USART_SendData(USART1,'h');                              //发送数据  
  58.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  59.     }  
  60.     else  
  61.     {  
  62.         //写入2号备份寄存器  
  63.         BKP_WriteBackupRegister(BKP_DR2,0xabcd);  
  64.         USART_SendData(USART1,'9');                              //发送数据  
  65.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  66.         USART_SendData(USART1,'9');                              //发送数据  
  67.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}   //等待发送结束  
  68.     }  
  69.   
  70.     //测试低功耗:待机模式  
  71.     for (i = 0;i < 30000;i++)  
  72.     {  
  73.         for (j = 0;j < 500;j++)  
  74.         {  
  75.              __nop();  
  76.         }  
  77.     }  
  78.     PWR_EnterSTANDBYMode();  
  79.   
  80.     while (1);}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值