软件定时器的定义和作用
FreeRTOS软件定时器工作原理
软件定时器函数应用
功能需求
- 使用软件定时器功能完成闹钟功能设计
- 当闹钟到达时,可根据执行动作,触发相关的led亮灭
API
xTimerCreate()
xTimerStart()
xTimerReset()
pvTimerGetTimerID()
xTimerChangePeriod()
功能设计实验
1、硬件功能框架
串口命令定义
功能业务划分
功能实现流程一:
1.1配置RTC
使能开发板外部晶振为低速时钟
在RTC配置里使能时钟源,使能日历功能
在configuration里将数据格式配置为二进制
在FreeRTOS里配置使能软件定时器
创建任务
创建消息队列:1、用于消息命令解析
2、用于LED消息传输
实时时钟的读写操作
//RTC初始化
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime = {
0};
RTC_DateTypeDef sDate = {
0};
/**Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
/* USER CODE END Check_RTC_BKUP */
/**Initialize RTC and set the Time and Date
*/
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
void SetRTC(RTCTimeDates *pRTCTimeDate){
if (HAL_RTC_SetTime(&hrtc, &pRTCTimeDate->RtcTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
if (HAL_RTC_SetDate(&hrtc, &pRTCTimeDate->RtcDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
RTCTimeDates GetRTC(void){
RTCTimeDates RTCTimeDate;
if (HAL_RTC_GetTime(&hrtc, &RTCTimeDate.RtcTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
if (HAL_RTC_GetDate(&hrtc, &RTCTimeDate.RtcDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
printf("Real Time:%d-%d-%d %d:%d:%d\n",
RTCTimeDate.RtcDate.Year + 2000,
RTCTimeDate.RtcDate.Month,
RTCTimeDate.RtcDate.Date,
RTCTimeDate.RtcTime.Hours,
RTCTimeDate.RtcTime.Minutes,
RTCTimeDate.RtcTime.Seconds
);
return RTCTimeDate;
}
功能实现流程二
使能串口接收中断
串口中断发送消息队列
解析命令字符串
void vCmdParseString(uint8_t *buff){
//判断是否为实时时钟设置
if(strncmp((char const*)buff,REALTIME,strlen(REALTIME)) == 0){
ParseRealTimeString(buff);
}
//判断是否为闹钟设置
else if(strncmp((</