【STM32】串口通讯USART串口中断配置

2023-05-16

目录

STM32 USART 简介

程序编写

硬件接线

实际波形


STM32 USART 简介

  1. STM32的USART通用同步异步收发器是一个串行通信设备,可以灵活的与外部设备进行全双工数据交换
  2. 有别于USART,还有一个UART,它在USART基础上裁减掉了同步通信功能只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
  3. 串口通信一般是以帧格式传输数据,即一帧一帧传输,每帧包含有起始信号数据信息停止信息,可能还有校验信息
  4. USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。
  5. USART支持同步单向通信半双工发单线通信;还支持同步单向通信半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与 IrDA(红外线数据协会) SIR ENDEC规范。
  6. USART支持使用DMA,可实现高速数据通信。


TXD和RXD交叉相连两边共地!

 STM32F103ZET6有三个串口

串口12345都挂载在APB2总线


程序编写

本次使用USART1   PA9 + PA10

GPIOA和串口1都挂载在APB2总线,开启时钟要注意不要开错了,串口属于复用功能,要开启复用时钟
TXD和RXD一个是输出一个是输入,要分别配置

PA9是TXD输出端口,配置复用推挽输出!配置输出速率10MHz即可

PA10是RXD输入端口,模式配置上拉输入浮空输入,不需要配置输出速率

串口配置

设置一个形参,传入波特率

1位停止位,8位数据位,不使用奇偶校验,不使用硬件流控制,模式配置:发送和接收

NVIC配置

USART_FLAG_TXE 发送数据寄存器空标志位

USART_IT_RXNE 接收数据寄存器非空标志位

串口1初始化函数,形参是波特率

//BaudRate = 9600  115200
void USART1_Init(uint32_t BaudRate)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//GPIOA在APB2总线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//串口1在APB2总线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//串口属于复用功能,要开启复用时钟
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	
	//PA9 TXD配置
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;	//配置复用推挽输出!
	GPIO_InitStructure.GPIO_Pin   = TXD;	//output
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(USART_PORT, &GPIO_InitStructure);
	
	//PA10 RXD配置
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;	//上拉输入 或 浮空输入 都行
	GPIO_InitStructure.GPIO_Pin   = RXD;	//input
	//不需要输出速率
	GPIO_Init(USART_PORT, &GPIO_InitStructure);
	
	USART_DeInit(USART1);//先初始化一下
	USART_InitStructure.USART_BaudRate = BaudRate;//波特率设置 由形参传入
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 1位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位 8位
	USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 不使用奇偶校验
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//模式配置:发送和接收
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ClearFlag(USART1, USART_FLAG_TXE);//开启中断之前,要先清空一下中断标志位
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收数据
	USART_Cmd(USART1, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	//中断优先级分组
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	//中断入口
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	//只有一个中断,这两个还是随便写,没有冲突
	NVIC_Init(&NVIC_InitStructure);
}

 

串口1的中断服务函数

void USART1_IRQHandler (void)
{
	//判断中断是否进入 (只要不等于0,就说明产生中断事件了)
	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
	{
		USART_SendData(USART1, USART_ReceiveData(USART1));//发送数据,发送串口1接收的数据
		
		//清除中断事件
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		
		//如果==0,就一直在这循环等待,直到等于1才跳出循环,这个标志位是1的时候,代表发送完成了
		//while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
		while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		
	}
}

 串口2、串口3配置也是一样的

 

然后插上开发板,打开串口调试助手,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,诶嘿,打不开呢~_~

没接USB转TTL当然检测不到串口了!!!

没接USB转TTL当然检测不到串口了!!!

没接USB转TTL当然检测不到串口了!!!


 

硬件接线

参考江科大自化协up主的接线图

USB转串口的RXD接(ZET6)单片机的TXD(PA9),TXD接单片机的RXD(PA10)

单片机和USB转TTL模块共地连接,单片机上电,USB转串口也上电

然后就可以打开串口了!

串口配置,根据上述代码勾选,接收区以ASCII码模式接收

在下边的框里输入要发送给单片机的数据,勾选发送新行、自动发送

效果图如下:


 

实际波形

再用逻辑分析仪抓取一下波形

逻辑分析仪也连接单片机的TXD --- PA9 发送引脚

PA9就一个引脚

这里我用一根杜邦线引出来PA9接到下面这种板子上嘛,逻辑分析仪就可以接到PA9上了(做小车共用VCC和GND的板子~)

我连接的是通道7,然后在USBee软件里双击通道7,弹出下面的窗口,串口波形具体配置如下:

RXD不需要看波形,暂时不接线,不设置

单击Save,可以看到通道7波形变成这样了 

 

 

抓取2s波形(500ms定时发送),大概能看4个波形

 挑选一个波形,放大看看

 后两个[D][A]是换行

去掉自动换行再抓取一次波形

 这样也能看到波形对应电平状态,电平状态是根据波特率和周期计算的

学习视频链接:

STM32串口通讯USART串口中断配置

下课咯

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

【STM32】串口通讯USART串口中断配置 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

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

随机推荐

  • keil手把手创建文件

    工具 xff1a Keil4 下面我们来认识一下如何创建一个Keil代码工程 首先我们在文件管理器中创建一个文件夹 然后我们打开Keil软件 xff0c 找到Project gt New Project 自定义一个名字保存 xff0c 然后
  • 1183 连接字符串

    题目描述 输入两个字符串 xff0c 设计函数连接这两个字符串 单个字符串的长度不超过100 不要使用系统提供的strcat函数 输入要求 输入2个字符串 xff0c 每个字符串以换行符结束 输出要求 输出连接好的字符串 输入样例 Coun
  • 路劲规划与轨迹跟踪学习4——人工势场法

    本文参考 85条消息 路径规划 局部路径规划算法 人工势场法 xff08 含python实现 c 43 43 实现 xff09 CHH3213的博客 CSDN博客 人工势场法路径规划 路径规划与轨迹跟踪系列算法学习 第6讲 人工势场法 哔哩
  • STM32 HAL库详解(二):UART

    在stm32编程时 xff0c 最常用的通讯方式就是串口通讯 一般使用HAL库来实现串口通讯 但有时 xff0c 我们不满足于HAL库的代码 xff0c 或者出现 玄学bug 需要了解具体原理来debug 下面将通过详解HAL库函数来解释u
  • C语言实现十进制转化为十六进制-------数组,switch语句,while循环语句

    内容目录 十进制如何转化为十六进制 思路解析 运用知识点 代码实现 1 十进制如何转化为十六进制 十六进制每位数上从大到小是0123456789ABCDEF 十进制转化为十六进制与十进制转化为八进制一样求法 xff0c 就是求余 例如十进制
  • 实测(一) NVIDIA Xavier NX + D435i / 奥比中光Astrapro 相机+ ORB-SLAM 2 + 3 稠密回环建图

    开发环境 xff1a NX 43 Ubuntu18 04 43 ROS melodic 一 ARM架构下 Realsense D435i 环境搭建 因为NVIDIA Xavier NX是一款arm架构的嵌入式开发板 xff0c 因此安装方式
  • c/c++输入带空格、tap、换行符的字符串

    1 scanf charstr 10 scanf 34 s 34 str 123 adw 其实只输入了 123 1 不读入空格和回车还有tap键 从空格处结束 2 输入字符串长度超过字符数组元素个数不报错 xff0c 只是不读入 3 当输入
  • 如何防止网站被爬虫爬取的几种办法

    相较于爬虫技术 xff0c 反爬虫实际上更复杂 目前许多互联网企业都会花大力气进行 反爬虫 xff0c 网络爬虫不但会占据过多的网站流量 xff0c 导致有真正需求的用户没法进入网站 xff0c 另外也有可能会导致网站关键数据的外泄等现象
  • 指定位置插入字符串(c++insert函数、find函数使用)

    一 insert函数 xff08 插入函数 xff09 str1 61 str1 xff08 被插入字符串 xff09 insert 插入位置 str2 xff08 被插入字符串 xff09 xff0c n xff0c m ps xff1a
  • vector容器(C++黑马程序员笔记)

    3 2 vector容器 3 2 1 vector基本概念 功能 vector数据结构和数组非常相似 xff0c 也称为单端数组 vector与普通数组区别 不同之处在于数组是静态空间 xff0c 而vector可以动态扩展 动态扩展 并不
  • set容器(c++黑马程序员笔记)

    3 8 set multiset容器 3 8 1 set基本概念 简介 所有元素都会在插入时自动被排序 本质 set multiset属于关联式容器 xff0c 底层结构是用二叉树实现 set和multiset区别 set不允许容器中有重复
  • map函数

    3 9 map multimap容器 3 9 1 map基本概念 简介 map中所有元素都是pair pair中第一 个元素为key 键值 xff0c 起到索引作用 xff0c 第二个元素为value 实值 所有元素都会根据元素的键值自动排
  • 解决Maven配置本地仓库路径不生效问题多个方法详解。(已成功解决自己遇到的问题)

    首先我尝试了很多种方法 xff0c 就是这个方法让我成功 xff0c 和大家分享一下 xff01 xff08 我用方法二成功的 xff01 xff09 maven本地仓库默认值 xff1a 用户家目录 m2 repository 由于本地仓
  • Servlet快速学习和Tomcat快速部署(web)

    Servlet快速学习和Tomcat快速部署 xff08 web xff09 一 快速入门二 执行流程三 生命周期四 Servlet体系结构五 Servlet urlPattern配置六 XML配置方式编写Servlet七 Tomcat快速
  • 蓝桥杯必备模板(python)

    蓝桥杯必备算法模板 xff08 python xff09 xff1a 前缀和模板差分模板二分双指针位运算最大公约数和最小公倍数模板判断质数和埃氏筛法模板唯一分解定理和质因数分解关系和模板快速幂并查集区间合并回溯算法模板 xff1a DFS
  • 蓝桥杯必备模块及常用操作(python)

    蓝桥杯必会模块 xff08 python xff09 xff1a 字符类型模块日期函数模块 常用 优先级队列itertools模块collections模块Bisect模块List 集合set 集合Math模块 字符类型模块 先看点常用但比
  • string的几个常见库函数

    文章目录 前言一 strlen直接求字符串长度二 strcpy用来赋值三 strcat追加字符串四 strcmp用于比较两个字符串五 strstr子串查找六 strtok应用七 加长度限制八 strerror 九 其他操作1 iscntrl
  • vector详解

    在开始学习C 43 43 的STL之后 xff0c 相信大家都学会通过查文档来了解一些库函数 xff0c 今天我来给大家介绍vector xff0c 从基本的使用到vector背后的源码实现 xff0c 迭代器等展开讲 xff0c 仔细阅读
  • 如何利用开源思想开发一个SEO友好型网站

    当你对一个网站进行 SEO 优化的时候 xff0c 不要期望你的努力能立即得到回报 耐心等待并更正内容营销策略 xff0c 最终会发现你的网站很受用户欢迎 下面就教你如何利用开源思维开发一个SEO友好型网站 xff01 首先 xff0c 你
  • 【STM32】串口通讯USART串口中断配置

    目录 STM32 USART 简介 程序编写 硬件接线 实际波形 STM32 USART 简介 STM32的USART通用同步异步收发器是一个串行通信设备 xff0c 可以灵活的与外部设备进行全双工数据交换 有别于USART xff0c 还