主页 > 电脑硬件  > 

SMT32串口使用中断和使用RTOS的对比

SMT32串口使用中断和使用RTOS的对比

用cubemx配置时钟,串口,中断和RTOS

STM32的中断在文件 stm32f1xx_it.c 中

其中

void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ }

USART1 中断的服务函数 USART1_IRQHandler() 中断服务函数里面就调用了串口中断处理函数 HAL_UART_IRQHandler() 其主要作用就是判断是哪个串口产生中断,清除中断标识位,然后调用中断回调函数 HAL_UART_RxCpltCallback()。

在文件 stm32f1xx_hal_uart.c 中 有

__weak 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 */ }

可以用户自定义。

在文件 stm32f1xx_it.c 的最下方 重写回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { //HAL库串口发送函数 HAL_UART_Transmit(&huart1,(uint8_t *)Buffer, 1, 0xffff); //串口接收函数 HAL_UART_Receive_IT(&huart1,(uint8_t *)Buffer, 1); } }

这就完成了串口中断的程序

在rots中如此定义,也可以达到类似的效果。轮询vs时间触发

void Led_Task(void const * argument) { /* USER CODE BEGIN Led_Task */ /* Infinite loop */ for(;;) { //HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); //HAL_UART_Receive(&huart1, (uint8_t *)Buffer, 1, 0xffff); //一次 阻塞 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); HAL_UART_Transmit(&huart1,(uint8_t *)Buffer, 1, 0xffff); HAL_UART_Receive_IT(&huart1, (uint8_t *)Buffer, 1); //循环 非阻塞 //HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); osDelay(1000); } /* USER CODE END Led_Task */ }
标签:

SMT32串口使用中断和使用RTOS的对比由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“SMT32串口使用中断和使用RTOS的对比