博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32待机模式测试
阅读量:3948 次
发布时间:2019-05-24

本文共 4527 字,大约阅读时间需要 15 分钟。

               

STM32待机模式测试

本文博客链接:,作者:jdh,转载请注明.

参考链接:

环境:

主机: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);}

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!

你可能感兴趣的文章
js实现购物时选带属性的商品------Sestid
查看>>
点击出现对应界面(第二个界面可以选择显示内容)------Sestid
查看>>
Js实现炫酷仿抖罗盘时钟------Sestid
查看>>
vivo官网鼠标触碰图片拉长------Sestid
查看>>
canvas画布实现的集中效果
查看>>
Js实现点击置顶效果(带动画)
查看>>
Js实现input全选、全不选、反选功能------Sestid
查看>>
纯css实现好看的背景------Sestid
查看>>
为什么我的CSDN上都是开关灯??????Js实现开灯关灯特效
查看>>
Js实现生成自定义输入行列宽高表格------Sestid
查看>>
Js实现购物车加减,价格计算等功能
查看>>
Js自定义快捷键并实现上下左右移动
查看>>
面试看这里!!!2020年前端面试知识点(持续更新)
查看>>
纯CSS实现轮播图------Sestid
查看>>
CSS实现自动播放相册------Sestid
查看>>
JavaScript四种基础的排序方法
查看>>
这里有美女!!!!抖音上很火的3D立体动态相册的实现(纯CSS)
查看>>
一张图让您看懂git,看不懂我也没办法了。。。。。。。。
查看>>
Es6字符串和数组的新方法---自己在控制台都可以看到
查看>>
喜欢NBA的朋友快来这里看第一阶段的全明星投票结果!!!(更新到第二阶段、第三阶段)
查看>>