目录

  • 一、中断介绍
  • 二、中断方式实现串口通信
    • 1. 新建工程
    • 2. 工程设置
    • 3.代码编写
    • 4. 烧录验证
  • 三、总结
  • 四、参考

一、中断介绍

具体介绍参考文章:
【STM32】基于STM32F407的中断开关点灯

二、中断方式实现串口通信

1. 新建工程

创建一个STM32F407STM2CubeMX项目:

2. 工程设置

  1. 设置RCC
    设置高速外部时钟HSE,选择外部时钟源

  2. 设置串口
    1)点击USART1
    2)设置MODE异步通信
    3)基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1,接收和发送都使能
    4)GPIO引脚设置 USART1_RX/USART_TX(这里一般自动设置好了)
    5)NVIC Settings一栏使能接收中断

  3. 时钟设置

  4. 设置Project Manager后,生成代码:

3.代码编写

  1. printf函数设置
    main.cusart.c中添加头文件#include "stdio.h"
    并在usart.c文件中,添加如下代码,进行重定义
/* USER CODE BEGIN 1 *///加入以下代码,支持printf函数,而不需要选择use MicroLIB
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#if 1
//#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  return ch;
}
#endif
/* USER CODE END 1 */

  1. main.c主函数中,添加发送数据
    /* USER CODE END WHILE */printf("Hello windows!\r\n");HAL_Delay(500);/* USER CODE BEGIN 3 */

  1. main.c中添加如下定义,用来接收串口数据
uint8_t aRxBuffer;           //接收中断缓冲
uint8_t Uart1_RxBuff[256];      //接收缓冲
uint8_t Uart1_Rx_Cnt = 0;      //接收缓冲计数
uint8_t cAlmStr[] = "数据溢出(大于256)\r\n";

  1. 添加开启接收中断的语句
/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */
  1. 添加中断回调函数
/* 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_TxCpltCallback could be implemented in the user file*/if(Uart1_Rx_Cnt >= 255)  //溢出判断{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);  }else{Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位{HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
/* USER CODE END 4 */


编译一下,没有出错

4. 烧录验证

  1. 将代码烧录到核心板中
  2. 利用XCOM串口助手进行通信

    串口每隔0.5s输出Hello windows
    当下方发送数据,例如stop,串口会进入中断,再发送stop,之后回到原循环,继续发送Hello windows。

三、总结

  本文通过了解中断的相关知识,基于STM32F407使用STM32CubeMX实现了串口通信。中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。

四、参考

【STM32】基于STM32F407的中断开关点灯
【嵌入式11】HAL库实验中断开关点灯及串口通信

【STM32】基于STM32F407中断方式实现串口通信相关推荐

  1. stm32中断方式的串口通信——上位机控制串口收发

    文章目录 前言 一.什么是串口通信 二.什么是中断--STM32 1.中断的概念 2.STM32下NVIC的介绍 3.中断优先级的介绍 4.外部中断的介绍 三.串口通信keil工程文件 1.新建工程模 ...

  2. STM32之中断方式实现串口通信

    中断方式实现串口通信 一.创建项目 二.编写代码 三.运行 四.总结 一.创建项目 创建一个STM32f103c8的STM32CubeMX项目: SYS设置: RCC设置: 时钟树设置,输入72后回车 ...

  3. HAL库中断方式实现串口通信操作

    文章目录 一.实验工具 二.CubeMX配置项目 1.引脚配置 2.RCC设置 3.SYS设置 4.USART设置 5.NVIC设置 6.创建项目 三.keil中配置代码 1.main函数前定义全局变 ...

  4. 使用51单片机采用中断方式进行串口通信的学习记录:

    使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...

  5. 使用串口中断方式实现串口通信

    文章目录 一. 实验环境 二.实验目标 三.串口中断方式特点 四.HAL配置串口通信 五.开发板引脚连接 六.程序代码 (1)接收单个字符控制串口发送 (2)接收多个字符控制串口发送 七.总结 一. ...

  6. 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”

    文章目录 一.stm32接收到字符"s"/"t"时停止/持续发送"hello windows!" 1.STM32CubeMX工程创建 2.程 ...

  7. 采用串口中断方式实现串口通信

    文章目录 前言 一.中断介绍 1.中断方式 2.中断优先级 3.中断向量 二.利用STM32CubeMX配置项目 三.在keil配置代码 四.实际效果 五.总结 六.参考资料 前言 一.中断介绍 1. ...

  8. STM32通过DMA方式实现串口通信

    目录 一.DMA工作原理 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码 四.编译烧录 1.编译运行 2.烧录结果 五.总结 六.参考 ...

  9. STM32CubeMX基于HAL库实现简单串口通信

    STM32CubeMX基于HAL库实现简单串口通信 板子:STM32F103C8 编译工具:Keil+STM32CubeMX 烧录工具:FlyMcu 串口调试程序:XCOM 实验要求: 1)设置波特率 ...

最新文章

  1. 邮件内容被分析抛售,你的企业邮箱安全吗?
  2. Javascript 获取页面高度(多种浏览器)【转】
  3. Android绘图机制与处理技巧-更新中
  4. Eureka服务注册中心---SpringCloud
  5. 隐藏Content-Location标头带的内部IP地址的执行语句以及其可能会带来的问题
  6. c++ List(双向链表)
  7. 您访问的页面不在地球上卡通错误页面源码
  8. centos7系统引导自动重启_分享一个实用的脚本——全自动一键批量性安装Linux系统...
  9. [导入]Mobile Media API概述
  10. JM代码阅读之一SODB RBSP EBSP NALU
  11. 远程读取mysql_远程获取数据库和文件的方法
  12. 微信公众号php支付设置回调,php微信公众号支付讲解(JSAPI)
  13. vue2.x 如何更换网页logo
  14. VRCORE开发者大赛圆满落幕,中国虚拟现实内容大集结
  15. 智齿调用a标签时触发绑定事件
  16. Xara3Dnbsp;6.0动画文字软件教程(一)
  17. 页面里的在线实时聊天实现
  18. 14.什么是响应式设计?响应式设计的基本原理是什么?如何做?
  19. dedecms 无法采集 php.ini,解决织梦DEDECMS换空间不能采集的问题
  20. CC2 条理分明-----独立思考

热门文章

  1. cryptoJS 安装与使用
  2. C++结构体定义及初始化
  3. 遗传算法 二进制编码 matlab实现
  4. 负载均衡(BLB)发布HTTPS监听器服务
  5. vb.net 对文本文件的操作
  6. 这篇CVPR文章真是妙蛙种子到了妙妙屋
  7. 情人节肉麻短信排行榜中榜
  8. 副业什么最赚钱?多说人都选择这5个副业!
  9. 魔兽世界是一个大的浩方
  10. 涂料(涂料)添加剂行业调研报告 - 市场现状分析与发展前景预测