实验-uc/os3多任务与实时日历

本文档详细介绍了如何在STM32F103C8上使用uC/OS-III创建多任务,并实现了RTC的读取、设置和输出功能。首先从项目创建开始,通过HAL库配置多任务,然后进行RTC操作,读取初始日期,最终输出当前时间。
摘要由CSDN通过智能技术生成

一.多任务

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时钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值