25.UART串口发送过程与配置

2023-05-16

UART串口收发过程与配置

参考资料
《STM32Fx中文参考手册》第26章:通用同步异步收发器章节
开发板配套教程《STM32Fx开发指南》 串口实验章节

笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除

一、串口发送过程配置流程概述

1.HAL库中串口寄存器定义文件

在stm32f429xx.h 文件(位置:工程文件-HALLIB-stm32f4xx_hal.c-stm32f429xx.h)中,就有关于串口寄存器定义的结构体
在这里插入图片描述

	typedef struct
	{
		__IO uint32_t SR; 
		__IO uint32_t BRR; 
		__IO uint32_t CR1; 
		__IO uint32_t CR2; 
		__IO uint32_t CR3; 
		__IO uint32_t GTPR;
	} USART_TypeDef

2.HAL库中串口函数声明定义文件

位置:工程文件-HALLIB-stm32f4xx_hal_uart.c和工程文件-HALLIB-stm32f4xx_hal_usart.c
stm32f4xx_hal_uart.c / stm32f4xx_hal_uart.c
stm32f4xx_hal_usart.c / stm32f4xx_hal_usart.c
在这里插入图片描述

3.串口字节发送流程

① 编程USARTx_CR1的M位来定义字长。
② 编程USARTx_CR2的STOP位来定义停止位位数。
③ 编程USARTx_BRR寄存器确定波特率。
④ 使能USARTx_CR1的UE位使能USARTx。
⑤ 如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。具体请参考后面DMA实验。
⑥ 使能USARTx_CR1的TE位使能发送器。
⑦ 向发送数据寄存器TDR写入要发送的数据(对于M3,发送和接收共用DR寄存器)。
⑧ 向TRD寄存器写入最后一个数据后,等待状态寄存器USARTx_SR(ISR)的TC位置1,传输完成。

注:①-⑥为配置步骤;⑦-⑧为发送数据步骤

  • 配置步骤①~⑥:配置字长,停止位,奇偶校验位,波特率等:
    位置:工程文件-HALLIB-stm32f4xx_hal_uart.c中
    在这里插入图片描述
	HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);

该函数内部会引用标识符__HAL_USART_ENABLE使能相应串口。

  • 步骤⑦~⑧发送数据和等待发送完成:
    位置:工程文件-HALLIB-stm32f4xx_hal_uart.c中
    在这里插入图片描述
	HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout);

二、串口发送预备

1.__Weak关键字

函数前面加__weak修饰符,我们称之为弱函数。对于弱函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候会选择用户定义的函数。如果用户没有定义,那么函数内容就是弱函数定义的内容。
  • 函数声明
	void HAL_UART_MspInit(UART_HandleTypeDef *huart);
  • 函数定义(弱函数)
    在这里插入图片描述
    函数内部为空,即我们可以在里面编写相关弱函数
		__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)
	{
	}
  • 若函数被重新定义
	void HAL_UART_MspInit(UART_HandleTypeDef *huart)
	{
		…//内容
	}

** __Weak关键字的好处**

  • 对于事先已经定义好的一个流程,我们只希望修改流程中的某部分与用户相关的代码,这个时候我们可以采用弱函数定义一个空函数,然后让用户自行定义该函数。这样做的好处是我们不会对既有程序流程做任何修改。
  • HAL库中大量使用__weak关键字修饰外设回调函数。
  • 外设回调函数供用户编写MCU相关程序,大大提高程序的通用性移植性。

2.串口发送程序配置过程(HAL库):

① 初始化串口相关参数,使能串口:HAL_UART_Init();
② 串口相关IO口配置,复用配置:在HAL_UART_MspInit中调用HAL_GPIO_Init函数。
③ 发送数据,并等待数据发送完成:HAL_UART_Transmit()函数;

二、串口发送具体步骤

1.主函数

打开工程模板,把主函数清理成下图样子,并初始化延时函数
在这里插入图片描述

2.初始化串口参数

我定义一个uart1,在里面初始化HAL_UART_Init,因为HAL_UART_Init(UART_HandleTypeDef *huart)里面是一个结构体变量(UART_HandleTypeDef),我们查看结构体变量的内容如下图:
在这里插入图片描述

其中1号框内每一个参数都有自己的定义,里面定义了可以选择哪些数据区表示2号框里的内容,具体可以右键-查看定义来查看
在这里插入图片描述
在这里插入图片描述

	typedef struct
	{
		USART_TypeDef			 *Instance; 
		UART_InitTypeDef 			 Init; 
		uint8_t 							*pTxBuffPtr; 
		uint16_t 							TxXferSize; 
		uint16_t 							TxXferCount; 
		uint8_t 							*pRxBuffPtr; 
		uint16_t 							RxXferSize; 
		uint16_t 							RxXferCount; 
		DMA_HandleTypeDef		 *hdmatx; 
		DMA_HandleTypeDef 	*hdmarx; 
		HAL_LockTypeDef			 Lock; 
		__IO HAL_UART_StateTypeDef			 State; 
		__IO uint32_t 											ErrorCode; 
	}UART_HandleTypeDef

3.初始化串口参数步骤

1)初始化UART_HandleTypeDef的第一个变量usart1_handler.Instance

查看HAL_UART_Init下面关于Instance的定义,如下图
在这里插入图片描述
在这里插入图片描述

可见到Instance可以赋值的内容这里我们选择USART1,即写入代码

usart1_handler.Instance=USART1;
2)初始化usart1_handler.Init

查看Init相关定义,发现Init也是一个结构体,里面有7个变量,如图,也就说里面的7个变量也要进行逐一定义。
在这里插入图片描述
在这里插入图片描述

	typedef struct
	{
		uint32_t 	 	 BaudRate; 			//波特率
		uint32_t 	  	 WordLength; 		//字长
		uint32_t 		 StopBits; 			//
		uint32_t		 Parity; 				//
		uint32_t		 Mode; 				//
		uint32_t 		HwFlowCtl; 			//
		uint32_t 		OverSampling; 	//
	}UART_InitTypeDef;

(1)定义波特率为115200,代码如下

usart1_handler.Init.BaudRate=115200; //定义波特率

(2)定义字长WordLength,查看定义如下
**小技巧:**这里问我们需要查看WordLength的定义,我们就可以把WordLength复制下来,在总的初始化函数里面查找。
在这里插入图片描述

然后查看编号4的定义就可以了,如下图
在这里插入图片描述
在这里插入图片描述

可以看到字长有8位和9位两种,这我们选择8位,代码如下:

usart1_handler.Init.WordLength=UART_WORDLENGTH_8B;

(3)定义停止位StopBits
在这里插入图片描述
在这里插入图片描述

可以看到,StopBits可以选择1位或2位,这里我们选择1位,代码如下

usart1_handler.Init.StopBits=UART_STOPBITS_1;

(4)定义硬件流HwFlowCtl
查看定义有如下选项,这里我们选择关闭,代码如下:
在这里插入图片描述

usart1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; 

(5)定义模式Mode(开启发送还是接收或者都打开)
查看定义如下
在这里插入图片描述

在这个文件夹下继续搜索Mode,这里选择都打开,代码如下
在这里插入图片描述

usart1_handler.Init.Mode=UART_MODE_TX_RX;

(6)定义奇偶校验位Parity
查看定义如下,选择不使用校验位,代码如下:
在这里插入图片描述

usart1_handler.Init.Parity=UART_HWCONTROL_NONE;

到这里usart1_handler.Init结构体初始化完毕!!

3)注释掉usart.c函数

位置在:工程模板-SYSTEM-usart.c,
因为usart.c库函数中已经对串口发送和接收定义好了,这里我们要使用自己写的程序,则需要把下面代码注释掉
在这里插入图片描述

4)对弱函数进行重新编写

找到弱函数位置,复制其函数名,在main函数中进行重新编写,
在这里插入图片描述
在这里插入图片描述

我们常把外设的复用映射GPIO串口初始化中断优先级设置放在里面
代码如下:
在这里插入图片描述

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
	GPIO_InitTypeDef  GPIO_Initure;			//初始化GPIO结构体
	
	if(huart->Instance ==USART1)
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
		
		GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9

		GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
	}
5)串口发送程序编写

编写程序发送函数,如图,并查看定义:
在这里插入图片描述
在这里插入图片描述

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
其中UART_HandleTypeDef *huart为句柄(前文已解释)
uint8_t *pData为需要发送的数据
uint16_t Size为需要发送多少个字节的数据
uint32_t Timeout为超时时间
所以设置好的代码为

 	u8 data[]="-Apollo by wire-   ";			//定义一个数组,用于存放要发送的数据(数据为-Apollo by wire-   )
	while(1)
	{
		HAL_UART_Transmit(&usart1_handler,data,sizeof(data),1000);
		delay_ms(300);
	}
6)串口发送程序main.c代码
#include "sys.h"
#include "delay.h"
#include "usart.h"

UART_HandleTypeDef usart1_handler;		//定义结构体变量

void uart1_init()						//初始化uart1
{
	usart1_handler.Instance=USART1;
	usart1_handler.Init.BaudRate=115200; 				//定义波特率
	usart1_handler.Init.WordLength=UART_WORDLENGTH_8B;  //定义字长位8位
	usart1_handler.Init.StopBits=UART_STOPBITS_1;		//定义停止位
	usart1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;  //定义硬件流
	usart1_handler.Init.Mode=UART_MODE_TX_RX;			//定义模式
	usart1_handler.Init.Parity=UART_HWCONTROL_NONE;		//定义奇偶校验位
	
	HAL_UART_Init(&usart1_handler);		//初始换刚刚定义的结构体变量
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
	GPIO_InitTypeDef  GPIO_Initure;			//初始化GPIO结构体
	
	if(huart->Instance ==USART1)
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
		
		GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9

		GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
	}
}

int main(void)
{
    u8 data[]="-Apollo by wire-   ";			//定义一个数组,用于存放要发送的数据
    HAL_Init();                     //初始化HAL库    
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
	delay_init(180);				//初始化延时函数
	uart1_init();					//调用前面写的初始化函数
	
	while(1)
	{
		HAL_UART_Transmit(&usart1_handler,data,sizeof(data),1000);
		delay_ms(300);
	}
}

4.编译程序,烧录进开发板

编译程序并烧录进开发板,
打开串口调试助手,位置:H:\3.开发板学习\STM32WorkFile\000.串口调试助手\XCOM(正点原子推荐)
在这里插入图片描述

然后设置好接口和波特率,打开串口接收即可看到数据在持续输出。
在这里插入图片描述

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

25.UART串口发送过程与配置 的相关文章

  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • UART串口协议时序图

    为了在编写协议的时候更加方便 xff0c 笔者使用逻辑分析仪读取了UART串口协议的时序 xff0c 记录如下 UART协议 波特率 起始位 数据位 奇偶校验位 停止位 1 波特率9600 xff0c 数据位8 xff0c 无奇偶校验位 x
  • 05-STM32F1 - 串行通信1-UART(3),printf,scanf重定向

    05 STM32F1 串行通信UART xff0c printf xff0c scanf重定向 在C 语言标准库中 xff0c fputc 函数是printf 函数内部的一个函数 xff0c 功能是将字符ch 写入到文件指针file所指向文
  • UART协议

    UART协议 简介 UART是通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff0c 是一种异步收发传输器 是设备间进行异步通信的关键
  • 【verilog】UART串口发送(FPGA)

    简述核心代码仿真测试 简述 串口发送是以一定速率发送单bit数据 xff0c 通常一组数据为10bit 空闲状态为高电平 xff0c 起始位为0 xff0c 中间以低位在前的方式发送8bit数据 xff0c 终止位为1 采用计数器 cnt
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • UART(通用异步收发传输器)

    1 UART其在数据发送时将并行数据转换成串行数据来传输 xff0c 在数据接收时将接收到的 串行数据转换成并行数据 是异步串行通信的总称 2 而 RS232 RS449 RS423 RS422 和 RS485 等是对应各种异步串行通信口的
  • UART串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • 一文理解UART通信

    还记得当年的打印机 xff0c 鼠标和调制解调器吗 他们都有巨大笨重的连接器和粗电缆 xff0c 并且必须拧到你的电脑上 这些设备正是使用UART协议与计算机进行通信 虽然USB几乎完全取代了旧的电缆和连接器 xff0c 但UART绝对没有
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数

    目录 前言1 UART Receive IT2 HAL UART Receive3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • Node.js笔记:SerialPort(串口)模块使用(基于9.x.x)

    文章目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯 Node js中可以使
  • GD32E23x的USART被断点打断后重新运行,会一直进入中断的问题

    GD32E23x的USART被断点打断后重新运行 会一直进入中断的问题 GD32E230K8单片机USART0连接一个从机芯片 该芯片每100ms发来一串16Bytes的数据 MCU中断接收 没有开启FIFO 只开启了RBNE 接收缓存非空
  • MicroPython串口数据转换技巧

    技巧一 还原从串口接收的HEX字符串 首先上官方文档 确认接收数据类型为bytes 串口读来的bytes类型HEX数据转换成HEX类型字符串转换函数 ByteToHex的转换 返回数据16进制字符串 def ByteToHex bins r
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • 启用并测试 UART 的本地环回

    我正在尝试进行 UART 内部环回测试并提出以下更改 include
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART) 与 HAL 库?

    背景 这是我的一些背景 以便你们知道我有或没有哪些相关知识 我完全是这种嵌入式系统的新手 而且我对电子产品一无所知 我是一个纯粹的软件人员 我唯一的嵌入式系统经验是Raspberry Pi 它与STM32F4 Discovery有很大不同
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答

随机推荐

  • python db读写实践

    目录 1 读db2 写db 1 读db span class token keyword import span sqlite3 span class token keyword def span span class token func
  • 给定一个整数数组和一个整数target,计算该数组中子数组和等于target的子数组个数

    暴力解法 xff1a span class token keyword int span span class token function subarraySum span span class token punctuation spa
  • linux中终端命令行“删除在光标之前的所有字符“快捷键

    可以使用快捷键 34 Ctrl 43 U 34 xff0c 该快捷键能够删除在光标之前的所有字符 xff0c 包括命令行参数 如果您想要还原这些被删除的字符 xff0c 可以使用快捷键 34 Ctrl 43 Y 34
  • 开发机Python HTTP服务器

    目录下执行下载py文件 xff0c wget http 10 138 59 50 8080 HttpServer py 执行 xff0c nohup python2 HttpServer py 8081 amp 浏览器打开 ip 8081
  • C/C++封装socket通信类

    C C 43 43 封装socket通信类 一 读取 写入数据1 recvn函数2 sendn函数3 TcpRecv函数4 TcpSend函数 二 C的封装方法1 客户端2 服务端 三 C 43 43 的封装方法1 客户端2 服务端 不管是
  • Invalid prop: custom validator check failed for prop “value“

    问题描述 看见这种大片的爆红 xff0c 就两个字 xff1a 头疼 xff01 xff01 xff01 虽然这样的爆红不影响程序运行 xff0c 但是作为一个合格的程序猿 xff0c 我们怎么可以允许这个问题出现呢 x1f60e 问题排查
  • 如何计算UDP/TCP检验和checksum

    一 下面的图是一个UDP的检验和所需要用到的所有信息 xff0c 包括三个部分 xff1a 1 UDP伪首部 2 UDP首部 3 UDP的数据部分 xff08 切记不要遗漏该部分 xff0c 否则就 吐血了 xff09 首先解释下伪首部的概
  • 日常生活小技巧 -- UART (串口)回环测试

    转自https blog csdn net qq 29350001 article details 77335721 新买的USB转串口线 需要测试一下是否是OK的 该如何测试 xff1f 其实很简单 xff0c 就是讲 Tx 和 Rx 短
  • C/C++:头文件与cpp文件的声明/定义

    一 头文件 1 一般来说 xff0c 头文件仅仅用于声明 xff0c 相应的定义要放在对应的cpp文件中 声明的内容一般可以是 xff1a 1 类定义体 xff1b 2 类中的成员方法 xff1b 3 类外的函数 xff1b 4 类外的变量
  • 树莓派简易人脸追踪云台

    前言 xff1a 这篇文章属于此系列 xff1a 一个用树莓派做的会聊天 xff0c 能人脸识别 xff08 支持云台追踪 xff09 和发送邮件的小玩具 https blog csdn net yonglisikao article de
  • Android JNI调用概要

    一 Java调C 编写Native方法 使用javah命令生成 h头文件 复制 h头文件到CPP工程中 复制jni md h和jni h到CPP工程中 实现 h头文件中生成的 生成dll文件 C的函数名称 xff1a Java 包名 方法名
  • curl的请求头与响应头获取

    1 从CURL中获取响应头 oCurl 61 curl init 设置请求头 有时候需要 有时候不用 看请求网址是否有对应的要求 header 61 34 Content type application x www form urlenc
  • C++头文件包含顺序问题

    C 43 43 中类的声明和类的定义分开几乎成了一个不成文的规定 这样做的好处是使得类的声明和实现分开 xff0c 清晰明了 xff0c 同时便于库函数发布 但是在实际编程中由此也常常引起了一些由于头文件的包含顺序问题而产生的符号未定义的编
  • 详解printf重定向到文件中,打印日志的实现

    printf是将信息打印到终端 xff0c 但是有时当我们需要打印的信息比较多时 xff0c 终端无法将所有信息都能够保留在屏幕上 xff0c 这样我们就不能在终端获取我们想要的信息了 xff0c 重定向很好的帮我们解决了这个问题 xff0
  • 计划

    文档计划 读书的时候 2010年左右 由于和导师做了一些涉及单片机的项目 xff0c 狠狠熟悉了一把C语言 xff0c 所以试图写一个实时内核 xff0c 但是由于涉及大量的硬件知识 xff0c 底层汇编和任务栈之类的东西 xff0c 而这
  • CMOS内核--序言

    CMOS内核 序言 本文介绍一些CMOS中需要用的基础知识 由于在单片机系统中不会有MMU所以单片机系统中的每个任务就是一个线程 xff0c 共用系统的地址空间 xff0c 为了精确性 xff0c 后文中措辞中使用线程替换任务 xff0c
  • 欧拉角和旋转矩阵之间的转换

    一 什么是欧拉角 在3D 空间中 xff0c 表示物体的旋转可以由三个欧拉角来表示 xff1a pitch围绕X轴旋转 xff0c 叫俯仰角 yaw围绕Y轴旋转 xff0c 叫偏航角 roll围绕Z轴旋转 xff0c 叫翻滚角 这三个角的顺
  • C++编译之(1)-g++单/多文件/库的编译及C标准的发展历程

    g 43 43 编译入门 本文为您介绍g 43 43 的编译用法 xff1b 通过从最简单的单文件编译 xff0c 到多文件编译 xff0c 再到动态库 静态库的编译及使用 xff1b 例子都经过实际编译并运行 xff0c 可谓全网最良心之
  • STM32F103-寄存器开发-2

    上一篇博客中我已经配置好了对应的时钟 xff0c 接下来就是对GPIOC口进行操作了 为此我们需要配置端口配置寄存器 xff0c 但是在用户手册中查阅 xff0c 可以发现有两个寄存器 xff0c CRL和CRH xff0c 我们应该使用哪
  • 25.UART串口发送过程与配置

    UART串口收发过程与配置 参考资料 STM32Fx中文参考手册 第26章 xff1a 通用同步异步收发器章节 开发板配套教程 STM32Fx开发指南 串口实验章节 笔记基于正点原子官方视频 视频连接https www bilibili c