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

一、概述

软件:
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里面将接收到的字符串成功打印出来。
不足之处请指出,有点帮助请鼓励!

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DHZFSYJ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值