STM32单片机开发-UART&USART串口收发-STM32CubeMx项目生成

2023-11-01

目录

一、概述

二、串口通信原理

三、串口调试

四、程序实现

        (一)阻塞模式

        (二)中断模式

五、总结


一、概述

        本篇文章我们进入STM32串口收发功能的教学,主要讲解阻塞模式中断模式两种收发模式,源码将在最后免费提供

        开发工具:STM32CubeMx、STM32开发板(型号不限)


二、串口通信原理

        串口通信的本质,是发送者将信号调制之后通过传输介质被接收者接收并解析的过程。

        数据的发送,则是通过高低电平来实现的:

        串口都是往往是三根线实现的,即RX(接收)、TX(发送)、GND(地)。

        而波特率(bit/s) 常用的有9600,38400,115200等,代表的是每秒传输的bit位数,比特率越高传输速率越快,出现错码的概率越大。

        两个设备必须设置相同的比特率、校验方式、停止位等参数才能正常通信。


三、串口调试

        这里的串口调试我们需要用到USB转TTL,使用线连接开发板的TX与RX,并安装好USB转TTL驱动,打开串口即可。

        USB转TTL串口驱动

        安装完驱动,我们连接好串口,打开串口调试助手,注意波特率等信息需要与程序设置的一致。


四、程序实现

        首先打开STM32CubeMx选择对应开发板的芯片:

        简单做一些基础的配置工作(请以实际开发板电路为准):

         随后我们按照下图配置USART,此处我Mode选择异步、波特率是9600,8位、无校验、停止位1位。

         随后我们进入GPIO的USART菜单,查看USART端口是否正确,此处我们发现位PA9与PA10。

         查看开发板电路图,核对引脚是否正确,发现电路图中引脚为PA9与PA10,引脚正确我们不需要做其他操作。

        至此我们已经完成了工程配置,生成代码并打开:

        (一)阻塞模式

         这里我们写一个读取串口信息并发送回来的程序,在主函数中,代码如下:

        此处我们使用HAL_UART_Transmit函数,参数分别为串口句柄、数据、数据长度、超时时间。

 /* USER CODE BEGIN WHILE */
	while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
        uint8_t receive[10];
		HAL_UART_Receive(&huart1,receive,0xFFFF);
		HAL_UART_Transmit(&huart1,receive,sizeof(receive),0xFFFF);
		
  }
  /* USER CODE END 3 */

         至此,编译并烧写程序以后,我们开始调试。

        可以发现,程序功能已经实现,我们还可以通过对printf与scanf的重定向来实现功能。

/* USER CODE BEGIN 0 */
#include <stdio.h>
int fputc(int c, FILE* stream)
{
	uint8_t ch[]={c};
	HAL_UART_Transmit(&huart1,ch,1,0xffff);
	return c;
}
int fgetc(FILE * stream)
{
	uint8_t ch[1];
	HAL_UART_Receive(&huart1,ch,1,0xffff);
	return ch[0];
}
/* USER CODE END 0 */

        (二)中断模式

        返回到STM32CubeMx,在NVIC选项卡中使能USART1的中断。

        重新编译并生成代码,我们来是实现接收与发送的功能。

  /* USER CODE BEGIN WHILE */
  uint8_t receive[10];
	while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		HAL_UART_Receive_IT(&huart1,receive,10);//接收函数
		HAL_UART_Transmit_IT(&huart1,receive,10);//发送函数
		
  }
  /* USER CODE END 3 */

         本质上,代码是没有什么区别的,不过发送和接收的函数发生了改变,中断接收函数HAL_UART_Receive_IT在接收完毕之后会调用接收完成的中断处理函数,为了实现刚刚的功能,我们重写此函数并进行相关操作以实现功能。

        声明receive为全局变量,在接收完成处理函数中调用发送函数,然后再次进入接收状态。同时在主程序需要调用一次接收函数,使其进入接收状态。

uint8_t receive[10];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart1,receive,10);//发送函数
	HAL_UART_Receive_IT(&huart1,receive,10);//接收函数
}

        至此,串口中断程序完成。


五、总结

         本篇的重点在于阻塞模式与中断模式两种模式的串口通信,需要熟悉并重写中断处理函数,培养编程思维,下次我们将继续介绍DMA相关知识。

        源码:STM32串口通信源码-文章配套资源

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32单片机开发-UART&USART串口收发-STM32CubeMx项目生成 的相关文章

  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • 叫好又叫座!谋定论道·经信研究:船舶屡获韩国船东新船订单

    叫好又叫座 谋定论道 经信研究 船舶屡获韩国船东新船订单 新闻中国采编网 中国新闻采编网 中国企业家手机报 谋定研究中国智库网 国研智库 国情讲坛 商协社团 谋定论道 经信研究 哲商对话 万赢信采编 近日 中国船舶集团有限公司旗下中船黄埔文
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 推动行业未来的八个数字化转型趋势

    根据 Gartner 最新估计 在2023 年 已有40 的组织把虚拟体验与物理体验结合起来 以提高员工生产力和客户覆盖范围 而到 2024 年 工业企业将通过将自我管理技术与重新设计的运营流程相结合 将运营成本降低 30 到 2025 年
  • 如何实现MQTT网关连接各类工业物联设备,实现数据传输与控制

    MQTT是一种轻量级的发布 订阅消息传输协议 专门为低带宽 高延迟或不稳定的网络环境设计 它支持离线消息存储 使客户端在未连接到服务器时也能接收到消息 MQTT网关是一种采用MQTT协议的网关设备 可以连接不同类型的工业物联设备 实现设备之
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 江河湖泊生态水文监测物联网解决方案

    方案背景 江湖湖泊具有重要的经济效益和生态效益 是重要的资源储备 近年来 各级积极采取措施 加强江河湖泊治理 管理和保护 在防洪 供水 发电 航运 养殖等方面的综合发展 随着纳入管理的江河湖泊等水体越来越多 范围越来越广 很多水污染 非法采
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 揭秘看不见人的“黑灯工厂”

    你知道吗 未来工厂不需要人也能24小时运转 未来机器能自己配合的天衣无缝 未来工厂连一点灰尘都进不去 未来自研的智能化设备甚至几秒就能生产出一部手机 千万不要惊讶 其实这样的工厂已经在我们的身边 很可能你在元旦买到的一件衣服 一部手机就是
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL

随机推荐