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