目录

  • 一、STM32CubeMX工程创建
    • 1、题目要求
    • 2、配置STM32CubeMX工程
      • 2.1 时钟的设置
      • 2.2 USART的配置
  • 二、Keil工程的创建
  • 三、效果展示
  • 总结

一、STM32CubeMX工程创建

1、题目要求

完成一个STM32的USART串口通讯程序(中断方式),要求: 1)设置波特率为115200,1位停止位,无校验位;
2)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

根据题目,我设置,串口自动发送Hello windows!,如果接收到其他数据,则返回其他数据,之后继续发送Hello windows

在我的上篇博客中大致介绍了中断方式的使用方法以及作用,我也提到了使用中断方式和传统的扫描方式的区别,简而言之就是 中断方式对CPU的占用率更低,扫描方式对CPU的占用率高。 并且在使用中断方式的时候我们的CPU可以处理其他事情。所以这次我们选择用中断方式来进行串口通信。

2、配置STM32CubeMX工程

2.1 时钟的设置

我们无论完成怎样的工程都需要对时钟进行配置,首先需要我们设置RCC,打开外部时钟HSE,在选择外部时钟源:

设置好RCC以后,还需要我们对时钟树进行配置:

2.2 USART的配置

在我们之前的博客中点亮LED用到的是管脚输出高低电平,在这之前我们对GPIO进行了初始化,现在我们要实现USART串口通信所以我们也要先对对应的串口进行初始化并配置模式等,所以我们要设置串口
点击USART1:
1)将模式改为异步通信——Asynchronous:

2)设置参数,因为我们要求的基本参数是“设置波特率为115200,1位停止位,无校验位”,所以我们要根据题目要求设置基本参数,波特率115200 Bits/s,传输数据长度为8 ,没有奇偶校验位,停止位为1:

3)由于这次要求的是中断方式,所以我们还需要打开中断,点击NVIC Settings,使能中断:

4)现在我们看右边芯片的示意图,发现A9、A10已被配置为USART1传送和接收数据的默认管脚:

二、Keil工程的创建

首先我们需要在main.c和usart.c中添加头文件* #include stdio.h *
这是因为我们需要用到一些库函数,所以要调用这个头文件。
由于我们用的是中断方式,所以我们要先在main.c中开启中断:

HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

接着打开我们的usart.c,在里面加上如下代码,进行重定义:

//加入以下代码,支持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 

接着我们再回到main.c文件中加上我们的串口发送程序,用来向我们电脑的串口助手发送数据:

printf("Hello windows!\r\n");HAL_Delay(500);

既然我们要向串口助手发送数据,所以我们必须要用到一个数组来存放我们当然需要一个数组来存放我们的数据啦,所在我们main.c文件中添加如下定义:

uint8_t aRxBuffer;           //接收中断缓冲
uint8_t Uart1_RxBuff[256];      //接收缓冲
uint8_t Uart1_Rx_Cnt = 0;      //接收缓冲计数
uint8_t cAlmStr[] = "数据溢出(大于256)\r\n";

我们知道中断是需要我们自己来写中断回调函数的,执行到中断时就会跳到回调函数中来,所以我们需要在我们main.c文件中的main函数外添加如下程序:


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);   //再开启接收中断
}

三、效果展示

总结

STM32CubeMX软件配置USART 串口通信按照上面我们就已经完成了,看到这不妨自己动手去试试,整体下来并不是很难,在我们用熟了之后,我们只需简单的看看需要注意的哪些点即可。

STM32CubeMX实现串口通信(中断方式)相关推荐

  1. STM32CubeMX实现串口DMA中断通信

    文章目录 一. 环境 二. 使用STM32CubeMX 三. USART DMA中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm ...

  2. STM32CubeMX实现串口通信

    文章目录 一. 环境 二. 使用STM32CubeMX 1. 安装固件库 2. 工程设置 三. USART串口通信 1. UART函数库介绍 2. 代码编写 3. 最终效果 四. 软件调试 五. 总结 ...

  3. 串口通信校验方式:奇偶校验、累加和校验

    转载自:https://zhuanlan.zhihu.com/p/29693940 串口通信校验方式:奇偶校验.累加和校验 许佳伟 利用串口传输数据时,近距离传输还好,远距离传输由于线路长度影响,可能 ...

  4. 2021-912--51单片机串口通信--SCON方式1

    计算机的通信分为:串行通信和并行通信 串行通信分为:异步通信和同步通信 异步通信:发送设备与接受设备有各自的时钟,通信时双方的时钟尽量保持一致, 以字符为单位进行传输, 字符与字符间的时间间隔是任意的 ...

  5. 51单片机 串口通信 中断

    从一段程序开始 实现电脑向单片机发送一些数据,单片机返回Iget +数据 #include #define uchar unsigned char #define uint unsigned int ...

  6. C++串口通信API方式

    参考 龚建伟 熊光明编著的 <VisualC++ TurboC 串口通信编程实践> 电子版及源码地址 http://u.163.com/jHELKgtJ  提取码: J0NtoY5V 根据 ...

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

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

  8. STM32CubeMX实现串口中断通信

    文章目录 一. 环境 二. 使用STM32CubeMX 三. USART中断通信 1. UART函数库介绍 2. 编写代码 3. 最终效果 四. 软件调试 五. 总结 一. 环境 硬件:stm32f1 ...

  9. 【嵌入式系统基础实验一】-----led流水灯及串口通信的HAL库方式和寄存器编程方式实现,输出波形检测

    文章目录 1.实验知识点简要解析 1.1串口通信协议 1.2 RS232.485电平与TTL电平的区别 1.3 USB/TTL转232"模块 2.LED流水灯的寄存器地址 和HAL库这两种方 ...

最新文章

  1. 图像复原与重建(含傅里叶切片定理推导)
  2. NYOJ 301 递推求值(矩阵快速幂)
  3. 鸿蒙系统发布会16号几点,华为鸿蒙手机系统正式定档发布,12月16日于我们见面...
  4. python程序分析,用Python编写分析Python程序性能的工具的教程
  5. lvs+keepalived实现lvs nat模式热备配置
  6. gtihub第二次上传项目_国道岱山项目双合大桥墩柱桩基打桩施工突破100根
  7. sql server列转行怎么提高效率_行转列、列转行
  8. linux压缩隐藏文件,Linux下查看压缩文件内容的10种方法(小结)
  9. 机器学习、深度学习实战细节(batch norm、relu、dropout 等的相对顺序)
  10. 2022年最佳的9种逆向工程工具[持续更新]
  11. 三维叉乘怎么算_奇技淫巧系列:向量叉乘
  12. 【IDEA 教程系列第 14 篇】idea 快速跳转到错误位置
  13. throw e 和 return 的浅显理解
  14. java面试教程视频
  15. 高标准农田建设通则2014
  16. 第四章 Caché 设计模式 代理模式
  17. c语言里输入12MmAA后回车,Word怎么用语言输入
  18. 基因组序列genbank格式和fasta格式批量下载
  19. DRF中的路由Router使用
  20. Jodconverter-最新无码爽具,你值得拥有!

热门文章

  1. vivoX7的Android版本哪个好,vivo x7有几个版本?vivo x7各版本区别对比评测
  2. (转载)F28x7x TMU介绍及使用方法
  3. html字体阴影设置,css怎么给字体加阴影?
  4. 铁路全电子计算机联锁系统论文,全电子模块化计算机联锁系统探讨
  5. 【腾讯Bugly干货分享】Android 插件技术实战总结
  6. 通过键盘改变背景颜色
  7. 阿里云服务器MySQL安装、登录以及密码的修改
  8. 一周搜索热点20170509
  9. 我智商不高,能学算法吗?
  10. winsock的两篇文章