STM32CubeMX FreeRTOS二值信号量实验

系统:linux mint xfce 64bit
软件:
1、SW4STM32
2、STM32CubeMX
3、开发板:STM32F407VET6核心

二值信号量作用:
(1)任务间同步
(2)中断与任务间同步

本次实验二值信号量的作用是中断与任务间同步,使用STM32CubeMX配置的freertos其API进行了封装,是CMSIS格式的API,关于二值信号量的操作函数如下图所示
这里写图片描述

实验效果:串口发送5个字节长度的字符串后,触发接收中断,同时发生二值信号量osSemaphoreRelease(myBinarySem01Handle) ,然后在任务函数1里面打印出相关信息已经字符串。

(1)配置RCC(外部晶振8M),SYS(systick设置为TIM4),LED灯所在引脚,串口1(用来打印输出信息),选择FreeRTOS
(2)配置时钟,选择外部晶振,HCLK输入168会自动寻找配置
这里写图片描述
(3)使能USART1中断,在设置了freertos之后串口1默认的中断优先级默认为5,使用默认即可
这里写图片描述
这里写图片描述
(4)在freertos里添加信号量semaphore
这里写图片描述
(5)生成sw4stm32工程,记得在代码生成设置里面勾选为每个外设生成独立的.c/.h 文件
这里写图片描述

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

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
int8_t res[5];	// 接收缓存
extern osSemaphoreId myBinarySem01Handle;

/* USER CODE END PV */
/* USER CODE BEGIN 0 */
int __io_putchar(int ch)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;
}

int _write(int file, char *ptr, int len)
{
    int DataIdx;

    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        __io_putchar(*ptr++);
    }
    return len;
}
/* USER CODE END 0 */

(7)启动串口接收中断

  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart1,res,5);// 启动串口接收中断
  /* USER CODE END 2 */

(8)编写中断处理函数

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	printf("SEND SUCCESS\n");
	HAL_UART_Receive_IT(&huart1,res,5);  // 重新启动串口1接收中断
	osSemaphoreRelease(myBinarySem01Handle);// 释放信号量
}
/* USER CODE END 4 */

(9)修改freertos.c 内容

/* USER CODE BEGIN Variables */
extern uint8_t res[5];
/* USER CODE END Variables */
/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{

  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
	  if(osOK == osSemaphoreWait(myBinarySem01Handle,10))// 如果接收到信号量
	  {
		  printf("Semaphore Print\n");
		  printf("%s\r\n",res);
//		  osDelay(100);
	  }
  }
  /* USER CODE END StartDefaultTask */
}

(10)烧写程序验证
这里写图片描述

相关视频教程请参考:https://www.bilibili.com/video/av63561004

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值