STM32串口接收数据
稍微理一下思路,一个数据从电脑发送到STM32,然后在从STM32返回到电脑显示出来。
如上图所示,发送(1所示的路线)前,STM32的淳口需要初始化的设置。包括:波特率,字长,硬件流,停止位,奇偶校验位,模式(接收,发送,接收和发送),串口的基地址(Instance)。在初始化串口的函数里面,需要调用到HAL_UART_MspInit(),这是一个虚函数(_weak),HAL_UART_MspInit()会调用到HAL_GPIO_Init(),把IO口进行配置。(模式,上下拉,速度,复用)
3.接收中断优先级的配置
HAL_NVIC_EnableIRQ(USART1_IRQn); //接收中断使能 HAL_NVIC_SetPriority(USART1_IRQn,2,2); // 中断优先级的配置
以上两个函数可以放在HAL_UART_MspInit()里面进行
4.使能串口接收中断
HAL_UART_Receive_IT(&usart1_handler,rdula,1);
这个函数可以写在主函数里面,因为在uart.c的文件中是有的。同时可以写在串口配置函数的后面。
5.编写中断服务函数
/***中断服务函数***/ void USART1_IRQHandler() { HAL_UART_IRQHandler(&usart1_handler); //中断处理函数 HAL_UART_Receive_IT(&usart1_handler,rdula,1);//使能接收中断。为什么放在这里,因为是处理完中断处理函数,而接受中断关闭,不在处理相关的接收数据,为了能够再次接收数据,可以把接收中断函数放在中断服务函数逇里面。
}
6.编写中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { u8 temp; if(huart->Instance == USART1) //判断是不是串口一,要对串口一进行回调函数。 { temp=*((huart->pRxBuffPtr)-1); HAL_UART_Transmit(&usart1_handler,&temp,1,1000); } }
上图所示的代码中,void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)是一个虚函数(_weak),所以需要重新定义。其中if是判断这个基地址是不是串口一。
2019-09-06 21:52:36
原文地址:https://www.cnblogs.com/DY004/p/11470799.html
时间: 2024-11-07 19:07:27