news 2026/5/16 4:29:05

STM32F103RCT6芯片的正点原子mini开发板学习笔记(6)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103RCT6芯片的正点原子mini开发板学习笔记(6)

本节针对串口通信UART进行说明。首先对基础知识进行说明:

1.通信分为:并行通信,串行通信。单工,半双工,全双工。同步,异步。串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该 通讯方式输出调试信息。32单片机Tx发,电脑或其他设备Rx接收。其他设备Tx发,32单片机Rx收。

通信协议如图:

波特率:表示每秒传输了多少个码元。

比特率:表示每秒传输了多少个bit。

常见波特率:4800,9600,115200

空闲位:串口协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上 没有数据。

USART是通用同步异步收发器:是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。UART相比USART去掉了同步通讯功能。

在正点原子mini开发板中,PA9,PA10分别对应USART1_TX和USART1_RX。想要实现串口通信,一般有两种方式:一种是通过while循环的方式,一直查看有没有接收或者需要发送消息。这样的做法非常浪费系统资源,且容易使系统阻塞,卡死在循环内。第二种方式是通过中断的方式,在产生USART中断事件时,接收或者发送数据。

以下是配置代码:

首先是对时钟的配置,串口外设时钟的开启,在APB2总线上开启USART1,再开启GPIOA的时钟,并配置PA9 PA10,PA9对应发送端口,所以需要配置为复用推挽输出模式,PA10是接收口,需要配置为浮空输入模式。

其次,我们需要对串口参数进行配置,1.设置波特率115200。2.配置一个字的长度为8位。3.配置不需要校验位。4.配置停止位长度。5.使能接收和发送。中间三个都是默认配置好的,也可以不写。

最后,配置中断,设置优先级组,设置优先级,开启中断使能,使能串口。

中断标志位清除有时候需要通过

/* 清除空闲中断标志位: 先读sr,再读dr.就可以实现清除了 */
USART1->SR;
USART1->DR;

#include "Driver_USART.h" /** * @description: 初始化串口1 */ void Driver_USART1_Init(void) { /* 1. 开启时钟 */ /* 1.1 串口1外设的时钟 */ RCC->APB2ENR |= RCC_APB2ENR_USART1EN; /* 1.2 GPIO时钟 */ RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; /* 2. 配置GPIO引脚的工作模式 PA9=Tx(复用推挽 CNF=10 MODE=11) PA10=Rx(浮空输入 CNF=01 MODE=00)*/ GPIOA->CRH |= GPIO_CRH_CNF9_1; GPIOA->CRH &= ~GPIO_CRH_CNF9_0; GPIOA->CRH |= GPIO_CRH_MODE9; GPIOA->CRH &= ~GPIO_CRH_CNF10_1; GPIOA->CRH |= GPIO_CRH_CNF10_0; GPIOA->CRH &= ~GPIO_CRH_MODE10; /* 3. 串口的参数配置 */ /* 3.1 配置波特率 115200 */ USART1->BRR = 0x271; /* 3.2 配置一个字的长度 8位 */ USART1->CR1 &= ~USART_CR1_M; /* 3.3 配置不需要校验位 */ USART1->CR1 &= ~USART_CR1_PCE; /* 3.4 配置停止位的长度 */ USART1->CR2 &= ~USART_CR2_STOP; /* 3.5 使能接收和发送 */ USART1->CR1 |= USART_CR1_TE; USART1->CR1 |= USART_CR1_RE; /* 3.6 使能串口的各种中断 */ USART1->CR1 |= USART_CR1_RXNEIE; /* 接收非空中断 */ USART1->CR1 |= USART_CR1_IDLEIE; /* 空闲中断 */ /* 4. 配置NVIC */ /* 4.1 配置优先级组 */ NVIC_SetPriorityGrouping(3); /* 4.2 设置优先级 */ NVIC_SetPriority(USART1_IRQn, 2); /* 4.3 使能串口1的中断 */ NVIC_EnableIRQ(USART1_IRQn); /* 4. 使能串口 */ USART1->CR1 |= USART_CR1_UE; } /** * @description: 发送一个字节 * @param {uint8_t} byte 要发送的字节 */ void Driver_USART1_SendChar(uint8_t byte) { /* 1. 等待发送寄存器为空 */ while ((USART1->SR & USART_SR_TXE) == 0) ; /* 2. 数据写出到数据寄存器 */ USART1->DR = byte; } /** * @description: 发送一个字符串 * @param {uint8_t} *str 要发送的字符串 * @param {uint16_t} len 字符串中字节的长度 * @return {*} */ void Driver_USART1_SendString(uint8_t *str, uint16_t len) { for (uint16_t i = 0; i < len; i++) { Driver_USART1_SendChar(str[i]); } } /** * @description: 接收一个字节的数据 * @return {*} 接收到的字节 */ uint8_t Driver_USART1_ReceiveChar(void) { /* 等待数据寄存器非空 */ while ((USART1->SR & USART_SR_RXNE) == 0) ; return USART1->DR; } /** * @description: 接收变长数据.接收到的数据存入到buff中 * @param {uint8_t} buff 存放接收到的数据 * @param {uint8_t} *len 存放收到的数据的字节的长度 */ void Driver_USART1_ReceiveString(uint8_t buff[], uint8_t *len) { uint8_t i = 0; while (1) { // 等待接收非空 while ((USART1->SR & USART_SR_RXNE) == 0) { // 在等待期间, 判断是否收到空闲帧 if (USART1->SR & USART_SR_IDLE) { *len = i; return; } } buff[i] = USART1->DR; i++; } } /* 缓冲接收到的数据 */ uint8_t buff[100] = {0}; /* 存储接收到的字节的长度 */ uint8_t len = 0; uint8_t isToSend = 0; void USART1_IRQHandler(void) { /* 数据接收寄存器非空 */ if (USART1->SR & USART_SR_RXNE) { // 对USART_DR的读操作可以将接收非空的中断位清零。 所以不用单独清除了. //USART1->SR &= ~USART_SR_RXNE; buff[len] = USART1->DR; len++; } else if (USART1->SR & USART_SR_IDLE) { /* 清除空闲中断标志位: 先读sr,再读dr.就可以实现清除了 */ USART1->SR; USART1->DR; /* 变长数据接收完毕 */ //Driver_USART1_SendString(buff, len); isToSend = 1; /* 把接收字节的长度清0 */ // len = 0; } }

以下是主程序代码:

/* 缓冲接收到的数据 */ extern uint8_t buff[100]; /* 存储接收到的字节的长度 */ extern uint8_t len; extern uint8_t isToSend; int main() { Driver_USART1_Init(); Driver_USART1_SendString("abc", 3); while (1) { if(isToSend){ Driver_USART1_SendString(buff, len); isToSend = 0; len = 0; } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 4:26:07

万物互联,体验为本:IoT 用户体验设计深度解析

物联网&#xff08;IoT&#xff09;是由智能设备、家用器具等各类物理实体组成的网络体系——这些实体搭载专用组件&#xff0c;能通过互联网采集、交换数据&#xff0c;实现设备间及设备与中央系统的互联交互。对于设计师而言&#xff0c;必须秉持全局整体思维&#xff0c;才能…

作者头像 李华
网站建设 2026/5/16 4:25:10

Java 8 Lambdas测试策略:单元测试与集成测试完整解决方案

Java 8 Lambdas测试策略&#xff1a;单元测试与集成测试完整解决方案 【免费下载链接】java-8-lambdas-exercises Exercises and Answers for Java 8 Lambdas book 项目地址: https://gitcode.com/gh_mirrors/ja/java-8-lambdas-exercises Java 8 Lambda表达式是现代Jav…

作者头像 李华
网站建设 2026/5/16 4:23:09

aztfexport扩展开发:如何自定义资源映射和导入逻辑

aztfexport扩展开发&#xff1a;如何自定义资源映射和导入逻辑 【免费下载链接】aztfexport A tool to bring existing Azure resources under Terraforms management 项目地址: https://gitcode.com/gh_mirrors/az/aztfexport Azure Export for Terraform&#xff08;a…

作者头像 李华