实验-uc/os3多任务与实时日历
一.多任务
1、项目创建
选择stm32f103c8
2.创建多任务
定义相关变量以及任务函数
//任务控制块
static OS_TCB AppTaskStartTCB;
OS_TCB LED1TaskTCB;//PA4
OS_TCB LED2TaskTCB;//PA5
OS_TCB USART1TaskTCB;//串口1
//任务堆栈
static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
/* 私有函数原形 --------------------------------------------------------------*/
static void AppTaskCreate(void);
static void AppObjCreate(void);
static void AppTaskStart(void *p_arg);
//任务函数
void LED1_TASK(void *p_arg);
void LED2_TASK(void *p_arg);
void USART1_TASK(void *p_arg);
//任务优先级
#define LED1_TASK_PRIO 5 //PA4优先级
#define LED2_TASK_PRIO 4 //PA5优先级
#define USART1_TASK_PRIO 3 //USART1优先级
//任务栈大小
#define LED1_STK_SIZE 64 //PA4栈大小
#define LED2_STK_SIZE 64 //PA5栈大小
#define USART1_STK_SIZE 64 //串口1栈大小
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];//PA4任务栈
CPU_STK LED2_TASK_STK[LED2_STK_SIZE];//PA5任务栈
CPU_STK USART1_TASK_STK[USART1_STK_SIZE];//串口任务栈
定义相关任务函数
//LED1每秒闪烁一次
void LED1_TASK (void *p_arg)
{
OS_ERR err;
(void)p_arg;
BSP_Init(); /* Initialize BSP functions */
CPU_Init();
Mem_Init(); /* Initialize Memory Management Module */
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif
CPU_IntDisMeasMaxCurReset();
while (DEF_TRUE)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
//延时1秒
OSTimeDlyHMSM(0, 0, 1, 0,
OS_OPT_TIME_HMSM_STRICT,
&err);
}
}
//LED2每3秒闪烁一次
void LED2_TASK (void *p_arg)
{
OS_ERR err;
(void)p_arg;
BSP_Init(); /* Initialize BSP functions */
CPU_Init();
Mem_Init(); /* Initialize Memory Management Module */
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif
CPU_IntDisMeasMaxCurReset();
while (DEF_TRUE)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
//延时3秒
OSTimeDlyHMSM(0, 0, 3, 0,
OS_OPT_TIME_HMSM_STRICT,
&err);
}
}
//串口1每2秒输出一次
void USART1_TASK (void *p_arg)
{
OS_ERR err;
(void)p_arg;
BSP_Init(); /* Initialize BSP functions */
CPU_Init();
Mem_Init(); /* Initialize Memory Management Module */
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif
CPU_IntDisMeasMaxCurReset();
while (DEF_TRUE)
{
printf("hello uc/OS! 欢迎来到RTOS多任务环境\r\n");
//延时2秒
OSTimeDlyHMSM(0, 0, 2, 0,
OS_OPT_TIME_HMSM_STRICT,
&err);
}
}
创建任务
OSTaskCreate((OS_TCB * )&LED1TaskTCB,
(CPU_CHAR * )"pa4 task",
(OS_TASK_PTR )LED1_TASK,
(void * )0,
(OS_PRIO )LED1_TASK_PRIO,
(CPU_STK * )&LED1_TASK_STK[0],
(CPU_STK_SIZE)LED1_STK_SIZE/10,
(CPU_STK_SIZE)LED1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OSTaskCreate((OS_TCB * )&LED2TaskTCB,
(CPU_CHAR * )"pa5 task",
(OS_TASK_PTR )LED2_TASK,
(void * )0,
(OS_PRIO )LED2_TASK_PRIO,
(CPU_STK * )&LED2_TASK_STK[0],
(CPU_STK_SIZE)LED2_STK_SIZE/10,
(CPU_STK_SIZE)LED2_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OSTaskCreate((OS_TCB * )&USART1TaskTCB,
(CPU_CHAR * )"usart1 task",
(OS_TASK_PTR )USART1_TASK,
(void * )0,
(OS_PRIO )USART1_TASK_PRIO,
(CPU_STK * )&USART1_TASK_STK[0],
(CPU_STK_SIZE)USART1_STK_SIZE/10,
(CPU_STK_SIZE)USART1_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_TaskSuspend((OS_TCB*)&AppTaskStartTCB,&err);
3.效果
二.请编程实现STM32的日历读取、设置和输出。
1.创建项目
2.RTC操作
/*设置系统时间*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*设置系统日期*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*启动报警功能*/
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*报警时间回调函数*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*写入后备储存器*/
void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
/*读取后备储存器*/
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
3.读取RTC初始日期
RTC_DateTypeDef date; //获取日期结构体
RTC_TimeTypeDef time; //获取时间结构体
HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
printf("%02d/%02d/%02d %02d:%02d:%02d\r\n",date.Year,date.Month,date.Date,time.Hours,time.Minutes,time.Seconds);
HAL_Delay(1000);
4.结果
5.输出当前时间
date.Year=21;
date.Month=11;
date.Date=29;
date.WeekDay=RTC_WEEKDAY_FRIDAY;
time.Hours=20;
time.Minutes=20;
time.Seconds=20;
HAL_RTC_SetDate(&hrtc,&date,RTC_FORMAT_BIN);
HAL_RTC_SetTime(&hrtc,&time,RTC_FORMAT_BIN);
date.Year=21;
date.Month=11;
date.Date=29;
date.WeekDay=RTC_WEEKDAY_FRIDAY;
time.Hours=20;
time.Minutes=20;
time.Seconds=20;
HAL_RTC_SetDate(&hrtc,&date,RTC_FORMAT_BIN);
HAL_RTC_SetTime(&hrtc,&time,RTC_FORMAT_BIN);
四.参考
STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程
STM32F103基于uCOS实现多任务
【STM32】HAL库 STM32CubeMX教程十三—RTC时钟