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