在冷链数据采集中,只需要定期唤醒并采集数据上传就行了,在电池供电的环境中是必须的。因此此篇将分享如何实现RTC定期唤醒并上报数据。
1、首先先了解TKB-620的状态机,在FSM_Manager中,有好多种的状态机。在大循环状切换,他的状态如下:
typedef enum {
FSM_RST,
FSM_WAIT_RST_FINISH,
FSM_GET_VER,
FSM_GET_VER_ACK,
FSM_SET_WORKMODE,
FSM_SET_WORKMODE_ACK,
FSM_SET_FREQ,
FSM_SET_FREQ_ACK,
FSM_SET_RATE,
FSM_SET_RATE_ACK,
FSM_SET_TXP,
FSM_SET_TXP_ACK,
FSM_RCVDATA,
FSM_WAKEUP_CFG,
FSM_WAKEUP_CFG_ACK,
FSM_WAKEUPCB_ACK,
FSM_ENTER_SLEEP_ACK,
FSM_MAX,
} FSM_States_e;
只有当状态为FSM_RCVDATA时就可以实现正常的收发了。
2、stm32F103可以由RTC的周期中断来实现休眠后的唤醒。我配置代码如下:
#include "stm32f10x.h"
void RTC_Configuration(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(39999);
RTC_WaitForLastTask();
}
void RTC_AlarmConfig(void) {
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter() + 20);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE);
RTC_WaitForLastTask();
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void RTCAlarm_IRQHandler(void) {
if (RTC_GetITStatus(RTC_IT_ALR) != RESET) {
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
PWR_ClearFlag(PWR_FLAG_WU);
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter() + 20);
RTC_WaitForLastTask();
}
}
在主程序中,唤醒后,判断状态机为FSM_RCVDATA时,采集并发送数据,随后进入休眠:
while (1) {
ScreenRefresh();
KeyInfoUpdate();
FSM_Manager();
if(sys_param.fsmState == FSM_RCVDATA)
{
RF_SendDataOnce();
DelayMs(100);
PWR_EnterSTANDBYMode();
}
}
【实现效果】
可以实现周期的唤醒并发送给上位的数据:
