天天看點

STM32CubeMX FreeRTOS二值信号量實驗

系統:linux mint xfce 64bit

軟體:

1、SW4STM32

2、STM32CubeMX

3、開發闆:STM32F407VET6核心

二值信号量作用:

(1)任務間同步

(2)中斷與任務間同步

本次實驗二值信号量的作用是中斷與任務間同步,使用STM32CubeMX配置的freertos其API進行了封裝,是CMSIS格式的API,關于二值信号量的操作函數如下圖所示

STM32CubeMX FreeRTOS二值信号量實驗

實驗效果:序列槽發送5個位元組長度的字元串後,觸發接收中斷,同時發生二值信号量

osSemaphoreRelease(myBinarySem01Handle)

,然後在任務函數1裡面列印出相關資訊已經字元串。

(1)配置RCC(外部晶振8M),SYS(systick設定為TIM4),LED燈所在引腳,序列槽1(用來列印輸出資訊),選擇FreeRTOS

(2)配置時鐘,選擇外部晶振,HCLK輸入168會自動尋找配置

STM32CubeMX FreeRTOS二值信号量實驗

(3)使能USART1中斷,在設定了freertos之後序列槽1預設的中斷優先級預設為5,使用預設即可

STM32CubeMX FreeRTOS二值信号量實驗
STM32CubeMX FreeRTOS二值信号量實驗

(4)在freertos裡添加信号量semaphore

STM32CubeMX FreeRTOS二值信号量實驗

(5)生成sw4stm32工程,記得在代碼生成設定裡面勾選為每個外設生成獨立的.c/.h 檔案

STM32CubeMX FreeRTOS二值信号量實驗

(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)燒寫程式驗證

STM32CubeMX FreeRTOS二值信号量實驗

相關視訊教程請參考:https://www.bilibili.com/video/av63561004

繼續閱讀