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);}
- STM32待机模式测试
- STM32待机模式测试
- STM32待机模式唤醒测试以及独立看门狗测试
- STM32待机模式唤醒测试以及独立看门狗测试
- stm32 待机模式
- STM32待机模式学习笔记
- stm32的待机模式解析
- STM32待机模式Standby Mode与ADC DMA模式测试备忘
- stm32低功耗实验之待机模式
- STM32F103VCT6低功耗测试(待机模式)
- STM32F103VCT6低功耗测试(待机模式)
- STM32之待机唤醒
- STM32 待机唤醒
- STM32-待机唤醒实验
- STM32之待机唤醒
- 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口。
- 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口。
- STM32系列第17篇--待机唤醒
- 验证码识别的网站
- 详细介绍C++中的常用修饰符const
- android在代码里设置margin
- servicemix修改端口并启动
- js动态生成表格,删除表格
- STM32待机模式测试
- 第四周实验报告3
- STL简介
- 安装gcc问题总结
- linux并发控制
- iphone的icon的设置(分辨率显示的比实际图片的分辨率低)
- 继承、多态、重载和重写
- 国外程序员推荐:每个程序员都应读的书
- java.lang.NoClassDefFoundError:javax/el/ExpressionFactory