CubeMX STM32 FreeRTOS二值信号量同步任务和中断

本文介绍如何使用STM32F106ZET6开发板配合MDK-ARM5和STM32CubeMX软件,通过串口接收中断与FreeRTOS二值信号量同步机制实现数据接收及任务调度。当串口助手发送特定长度字符串时,触发中断并改变信号量状态,使任务函数能打印接收到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

软件:
1、MDK-ARM 5
2、STM32CubeMX
3、开发板:STM32F106ZET6
4、串口调试助手

二、主要内容

通过二值信号量同步中断与任务。
本例内容:通过串口助手发送5个字节长度的字符串后,触发接收中断,同时发生二值信号量变化,然后在任务函数1里面打印出相关信息字符串。
cubemx:版本5.2.1
STM32:stm32f103zet6
系统时钟:72M
辅助工具:串口助手
配置方法如下图所示:
1、RCC配置
在这里插入图片描述
2、SYS配置,注意Timebase Source的选择
在这里插入图片描述
3、串口配置,需在NVIC Setting中打开串口中断在这里插入图片描述
4、FreeRTOS :二值信号量配置
在这里插入图片描述
5、FreeRTOS :Task配置,创建一个任务即可
在这里插入图片描述

三、程序实现

1、修改main.c文件内容,首先添加串口重定向,定义变量等

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern osSemaphoreId myBinarySem01Handle;
//osEvent event;
uint8_t res[5]={0};
/* USER CODE END PV */

/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据 */
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
	return ch;
}
/* USER CODE END 0 */

2、启动串口接收中断

/* USER CODE BEGIN 2 */

	HAL_UART_Receive_IT(&huart1,res,5);//开启串口接收中断 一直中断的话需循环调用
  /* USER CODE END 2 */

3、编写中断处理函数

/* USER CODE BEGIN 4 */
/**
  * @brief  Rx Transfer completed callbacks.
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
	printf("SEND SUCCESS\r\n");
	HAL_UART_Receive_IT(&huart1,res,5);  //重新启动串口1接收中断
	osSemaphoreRelease(myBinarySem01Handle);//释放信号量
}
/* USER CODE END 4 */

4、修改freertos.c 内容

/* USER CODE BEGIN Variables */
extern uint8_t res[5];
/* USER CODE END Variables */

/* USER CODE BEGIN Header_StartTask01 */
/**
  * @brief  Function implementing the myTask01 thread.
  * @param  argument: Not used 
  * @retval None
  */
/* USER CODE END Header_StartTask01 */
void StartTask01(void const * argument)
{
  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
  for(;;)
  {
		if(osOK == osSemaphoreWait(myBinarySem01Handle,10))//Èç¹û½ÓÊÕµ½ÐźÅÁ¿
	  	{
		  printf("Semaphore Print\r\n");
		  printf("%s\r\n",res);
		}
	}
  /* USER CODE END StartTask01 */
}

5、烧写程序,通过调试助手验证
在这里插入图片描述
由于上位机串口发送时带有\D \A,所以发送456 即是发送4 5 6 \D \A 五个字节,可以看出接收完5个字节长度的字符串后,触发接收中断,同时发生二值信号量变化,然后在任务函数1里面将接收到的字符串成功打印出来。
不足之处请指出,有点帮助请鼓励!

参考资源链接:[STM32CubeMXFreeRTOS二值信号量实战教程](https://wenku.youkuaiyun.com/doc/6412b5e5be7fbd1778d44c98?utm_source=wenku_answer2doc_content) 要在STM32F1xx微控制器上通过STM32CubeMX正确配置FreeRTOS二值信号量以控制LED闪烁,关键在于理解任务创建、信号量的初始化与同步机制。以下步骤将引导你完成任务创建同步过程: 1. 使用STM32CubeMX配置你的项目,确保已经选择了合适的STM32F1xx微控制器型号,并配置了必要的时钟、GPIO以及定时器资源。 2. 在项目设置中启用FreeRTOS,并且在‘Pinout & Configuration’部分选择‘Timers and Semaphores’选项卡。在此配置你的二值信号量,例如,创建一个名为bSem01的二值信号量。 3. 通过STM32CubeMX生成代码,然后在MDK V5开发环境中打开项目。 4. 在main函数中,首先进行硬件FreeRTOS的初始化。然后创建两个任务:`PeriodicTask``HandleTask`。这两个任务通过之前配置的二值信号量进行同步。 5. `PeriodicTask`任务被设计为定时发送信号量,可以使用FreeRTOS的API函数`xSemaphoreGive`来发送。该任务通常会与一个定时器中断关联,每秒执行一次。 6. `HandleTask`任务会等待二值信号量,可以使用`xSemaphoreTake`函数来实现等待。当该任务接收到`PeriodicTask`发送的信号量时,根据信号量的状态执行特定的操作,例如切换LED的状态。 7. 最后,启动FreeRTOS调度器,调用`vTaskStartScheduler`函数,让FreeRTOS接管任务的调度。 通过以上步骤,你可以完成二值信号量的初始化任务同步,实现两个任务的协调工作,从而控制LED的闪烁。为了更好地理解这个过程,你可以参考《STM32CubeMXFreeRTOS二值信号量实战教程》。该教程详细讲解了从配置到代码实现的整个过程,并且提供了具体的代码示例操作步骤,确保你能跟随实践并掌握二值信号量任务同步中的应用。 参考资源链接:[STM32CubeMXFreeRTOS二值信号量实战教程](https://wenku.youkuaiyun.com/doc/6412b5e5be7fbd1778d44c98?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DHZFSYJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值