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

一、概述

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

二、主要内容

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

三、程序实现

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

你可能感兴趣的:(CubeMX STM32 FreeRTOS二值信号量同步任务和中断)