0、初始化好基础配置,如SYS,RCC,时钟,路径

    1、选择串口1,选择模式为异步通讯
    image.png
    2、配置串口相关数据,波特率此处配置115200,字长此处配置8位,无奇偶校验位,一个停止位,接收和发送都打开。
    image.png
    3、打开串口中断
    image.png
    4、查看引脚是否为想要的引脚,假如引脚和实际引脚对不上,则需在图中修改
    image.png
    5、假如PB6才为板子硬件实际连接的串口输出,则需通过此步修改,注意此步尤为重要,有的时候引脚不对便实现不了功能,此处就是实际连接不做修改。
    image.png
    6、配置中断优先级组数,并设置串口中断优先级,生成代码
    image.png
    7、使能串口的接收中断,HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
    image.png
    8、在stm32f1xx_it.c文件中有串口一的接收中断服务函数,HAL_UART_IRQHandler(&huart1);转到该函数定义。
    image.png
    9、该函数有很多处理,可找到接收中断函数UART_Receive_IT(huart);,然后转到该函数定义,
    image.png
    10、里面也有很多处理,找到HAL_UART_RxCpltCallback(huart);,接收中断的回调函数。转到该函数定义
    image.png
    11、可看到该函数定义,
    weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),是个虚函数,用户可重新定义
    image.png
    12、在main.c函数中重新定义该回调函数,需注意,使用回调函数的接收,必须要先初始化一个接收的数据,HAL_UART_Receive_IT(&huart1,&res,1);此函数要在最开始初始化的时候初始化,而且每次中断执行完毕后也需要一个这个函数,重新定义一个接收空间吧(自己的理解,可能不对)。

    image.png

    1. uint8_t res;//定义一个全局变量
    2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    3. {
    4. if(huart->Instance == USART1)//假如有串口1触发接收中断
    5. {
    6. res = huart->Instance->DR;//保存接收到的数据
    7. if(res == 0x01)//假如接收到的数据是0x01翻转电平
    8. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);
    9. }
    10. //重新定义一个接收,&res是定义的接收数据的地址,1是指1个数据,多个数据接收暂时
    11. //不会处理
    12. HAL_UART_Receive_IT(&huart1,&res,1);
    13. //将接收到的数据发送到上位机
    14. HAL_UART_Transmit(&huart1,&res,sizeof(res),100);
    15. }

    13、在WHILE(1)前记得初始化一个接收地址空间,记得res是全局变量,
    image.png

    1. //使能接收中断
    2. __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
    3. //初始化一个接收的地址空间
    4. HAL_UART_Receive_IT(&huart1,&res,1);
    5. //发送一个字符串
    6. //str:数组起始地址
    7. //sizeof(str):发送的个数
    8. //100时间间隔,好像是100ms后还未触发跳出函数
    9. HAL_UART_Transmit(&huart1,str,sizeof(str),100);

    用串口回调函数写我感觉要调用的函数太多了,而且有些配置也不是很方便,所以我常选择不使用回调函数,若有相关需求,可按以下配置。

    1、在NVIC的code generation 中取消勾选USART1的中断服务函数编写,但还是要使能中断,然后生成代码。
    image.png
    2、在main.c中重新写串口中断函数,记得清除中断标志位,这样写,不使用回调函数,就不需要像之前那样定义一个接收的数据地址。
    image.png

    1. uint8_t res;
    2. if(huart1.Instance->SR & UART_FLAG_RXNE)//判断是否满足接收中断
    3. {
    4. res = huart1.Instance->DR;//获取接收到的数据
    5. __HAL_UART_CLEAR_PEFLAG(&huart1);//清除中断标志位
    6. }
    7. HAL_UART_Transmit(&huart1,&res,sizeof(res),100);//发送接收到的数据,做测试

    3、初始化也只需要打开串口的接收中断就好了
    image.png