系統: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