历史上的今天
今天是:2024年10月10日(星期四)
2020年10月10日 | STM32待机模式测试
2020-10-10 来源:eefocus
环境:
主机: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);}
史海拾趣
|
1 引言 为了以更低的功耗获得更高的速度和更佳的性能,要求电源电压越来越低,瞬态性能指标越来越高,因此对开关电源提出了越来越高的要求。用原有的电路拓扑及整流方式已不能满足现在的要求,为了适应IC芯片发展的需要,人们开始研 ...… 查看全部问答> |
|
硬件结构图 这是我的源代码: #include #include typedef unsigned char byte; typedef unsigned int byte2; typedef unsigned long byte4; typedef byte bool; #define TRUE 1 #define FALSE 0 sbit CS = P0^0; sbit WR_CLK = P0^1; sbit ...… 查看全部问答> |
|
我用的是YLP2440的开发板,通过CE\\windows\\cpucheck.exe查看FCLK=200M。我在BSP中看到的MPLLCON=0X5C011,计算出来的FCLK=400。请问该板子FCLK究竟是多少?如果需要更改的话,是不是改BSP中MPLLCON就可以了?… 查看全部问答> |
|
SESSION_POS_S *pTestpos1, *pTestpos2, *pTestpos3, *pPos; LIST *pMyList = NULL; int NodeIndex = 0; DPRINT(\"-------- lstAdd测试 -------\\n\" ...… 查看全部问答> |
|
我的毕业设计是DS18B20温度传感 + nRF24L01无线数传 + 232串口发送给PC + 上位机显示但是,师兄的要求是要图表形式显示温度变化串口助手见得多了,找一个也不费事。但是好像就没见过能用图表显示的。最开始的打算是自己把当初上课学过的LABVIEW重新 ...… 查看全部问答> |




