【嵌入式STM32-04】STM32 USART 基本原理|库函数程序代码|寄存器

STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据 在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发数据发送出去后,CPU就会将下一个数据进行相同的发送。当我们调用HAL_UART_Receive把数据接收过来时,数据会通过RX引脚收到的电平信号进行转化后,会将数据存进接收移位寄存器。 阅读详情

STM32 USART

一、基本原理

通信接口

  • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统

  • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

芯片内的通信接口

image-20220925215830473

同步靠时钟线,异步靠波特率

串口通信

  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信

  • 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

硬件电路

  • 简单双向串口通信有两根通信线(发送端TX和接收端RX)

  • TX与RX要交叉连接

  • 当只需单向的数据传输时,可以只接一根通信线

  • 当电平标准不一致时,需要加电平转换芯片

image-20220925220519566

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平:+3.3V或+5V表示1,0V表示0

  • RS232电平:-3-15V表示1,+3+15V表示0

  • RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

串口参数及时序

  • 波特率:串口通信的速率

  • 起始位:标志一个数据帧的开始,固定为低电平

  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行

  • 校验位:用于数据验证,根据数据位计算得来

  • 停止位:用于数据帧间隔,固定为高电平

image-20220925220857239

USART

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

  • USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

  • 自带波特率发生器,最高达4.5Mbits/s

  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

  • 可选校验位(无校验/奇校验/偶校验)

  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3

*USART框图

工作过程

发送时,硬件检测到有数据写到发送数据寄存器,就会检查当前发送移位寄存器是不是有数据移位,如果没有,数据会立刻全部放到发送移位寄存器,准备发送。当数据从TDR移动到发送移位寄存器后,会置标志位TXE(TX Empty)发送寄存器空,检查TXE标志位为1,就可以写入下一个数据。如果有,等待,一但数据移位完成,立马再放进去。有TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲,提高工作效率

接收同理RXNE

硬件数据流控:如果发送设备发的太快,接收设备来不及接收,就会出现丢弃或覆盖数据的现象,有了流控可以避免这个问题

nRTS(Request to send)请求发送,是输出脚。n是低电平有效

nCTS(Clear to send)清除发送,是输入脚,用于接收别人的nRTS

image-20220925224328804

image-20220925224446138

数据帧

字长设置

9位选有校验

8位选无校验

image-20220925224740101

停止位

image-20220925224902742

起始位侦测

对接收的要求更高

image-20220925225115600

检测噪声的数据采样,有噪声在RXNE位的上升沿设置NE标志。

image-20220925225341770

波特率发生器

  • 发送器和接收器的波特率由波特率寄存器BRR里的DIV确定,带小数,更准确

  • 计算公式:波特率 = fPCLK2/1 / (16 * DIV)

image-20220925225739070

二、USART库函数

image-20220925230801642

串口发送

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)  //次方
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)    //和OLED中原理一样
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');  //取每一位数加偏移
	}
}

int fputc(int ch, FILE *f)                  //使用printf,需勾选下图的MicroLIB
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...) //封装sprintf,使多个串口都能使用printf(C语言对可变参数的使用 ...可变参数列表)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}

	uint8_t MyArray[] = {0x42, 0x43, 0x44, 0x45};
	Serial_SendArray(MyArray, 4);
	
	Serial_SendString("\r\nNum1=");
	
	Serial_SendNumber(111, 3);
	
	printf("\r\nNum2=%d", 222);
	
	char String[100];
	sprintf(String, "\r\nNum3=%d", 333);
	Serial_SendString(String);
	
	Serial_Printf("\r\nNum4=%d", 444);
	Serial_Printf("\r\n");

image-20220925232435695

串口输出中文

  • 1、UTF-8解决方案,对应串口助手也选UTF-8接收

image-20220925233357978

  • 2、切换为GB2312编码

image-20220925233521332

串口发送+接收

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &USART_InitStructure);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	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);
	
	USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
	}
}

int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}

uint8_t Serial_GetRxFlag(void)
{
	if (Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData;
}

void USART1_IRQHandler(void)
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		Serial_RxData = USART_ReceiveData(USART1);
		Serial_RxFlag = 1;
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

三、USART CubeMX

待补充

四、USART寄存器

【25.6】

image-20220925230312769

状态寄存器(USART_SR)

数据寄存器(USART_DR)

波特比率寄存器(USART_BRR)

控制寄存器 1(USART_CR1)

控制寄存器 2(USART_CR2)

控制寄存器 3(USART_CR3)

保护时间和预分频寄存器(USART_GTPR)

USART概念部分 发送移位寄存器—TX,RX—接收移位寄存器发送数据寄存器和接收数据寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR,实际硬件中分成两个,一个用于发送的TDR,一个用于接收的RDR,TDR只写,RDR只读当进行写操作时,数据就写到TDR,当进行读操作时,数据就从RDR读出发送移位寄存器,把数据一位一位的移出去,接收移位寄存器,把数据一位一位的读进来。 阅读详情

相关推荐

APM32 vs STM32U4:键盘DIY主控芯片性能实测与成本对比

本文深入对比了APM32与STM32U4在键盘DIY主控芯片领域的性能与成本差异。实测数据显示,APM32在响应延迟、按键冲突处理和RGB灯效流畅度等方面全面超越STM32U4,同时成本降低66%。文章还提供了详细的开发环境搭建指南和采购建议,帮助DIY爱好者实现高性能低成本键盘方案。

weixin_29185493的博客 418

嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

USART的相关寄存器及其配置

qq_41954556的博客 2万+

STM32单片机入门学习——第27节: [9-3] USART串口发送&串口发送+接收

本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!

qq_44764442的博客 1730

通讯的分类—UART的工作原理及其使用方法—HAL库的代码解读—利用USART回显

通讯的分类、USART的工作原理及其使用方法、HAL库的代码解读、利用USART回显。

weixin_67335336的博客 2631

用汇编语言实现STM32的LED和USART

; ; ; ; AREA RESET, DATA, READONLY DCD 0x20000000 + 1024 ;0 DCD UserMain ;1 DCD 0 ;NMI 2 DCD 0 ;HardFault 3 DCD 0 ;MemManage 4 DCD 0 ; 5 DCD 0 ; 6 DCD 0 ; 7

xdhwwdz2011的博客 3302

STM32 USART轮询模式寄存器级实现详解

USART(通用同步异步收发器)是嵌入式系统中最基础的串行通信接口,其核心原理基于状态寄存器轮询与数据寄存器读写。理解TXE(发送缓冲区空)和RXNE(接收缓冲区非空)等关键状态位的硬件行为,是掌握底层串口驱动的前提。该机制无需中断或DMA,具备时序确定、无竞态、易调试等工程优势,广泛应用于STM32等MCU的初始化验证、协议栈开发及资源受限场景。本文以STM32F103为例,深入解析寄存器映射、volatile语义、波特率配置及ASCII数据处理,为进阶中断与DMA模式奠定坚实基础。

weixin_42602368的博客 305

从寄存器到库函数:STM32 GPIO 配置的底层逻辑与设计哲学

本文深入解析STM32 GPIO从寄存器操作到标准库函数配置的底层逻辑与设计哲学,探讨硬件抽象的价值与性能平衡策略。通过对比分析寄存器直接操作与库函数的使用场景,帮助开发者掌握STM32 GPIO配置的核心技术,提升嵌入式开发效率与代码可维护性。

uran的专栏 1113

STM32串口通信编程

串口小试

qq_53352654的博客 4152

STM32寄存器的简介、地址查找,与直接操作寄存器

本文主要是对STM32寄存器的简介、地址查找,与直接操作寄存器进行讲解

qq_58759694的博客 8208

STM32 USART串口通信实验项目详解

STM32的USART模块由多个寄存器组成,每个寄存器承担不同的控制和状态反馈功能。理解这些寄存器的作用是正确配置USART的基础。以下是STM32F4系列中USART模块的关键寄存器及其功能说明:寄存器名称地址偏移主要功能描述USART_SR0x00状态寄存器,用于读取发送、接收状态标志USART_DR0x04数据寄存器,用于读写发送或接收的数据USART_BRR0x08波特率寄存器,用于设置通信速率USART_CR1。

weixin_42594419的博客 1225

基于STM32的USART串行通信实验详解与实战

USART通信看似入门简单,但要做到长期稳定、抗干扰强、易于维护,却需要扎实的基础知识和丰富的实践经验。希望这篇文章不仅能帮你解决眼前的串口问题,更能建立起一套完整的底层思维框架。下次当你面对一个新的MCU平台时,也能自信地说:“我知道该怎么让它开口说话。” 🗣️记住:每一个成功的printf背后,都有一个认真对待细节的工程师 ❤️。🚀本文还有配套的精品资源,点击获取。

weixin_35871529的博客 898

stm32 串口通信数据移位寄存器_stm32 USART 串口通信[操作寄存器+库函数]

串口通信虽然在如今的电脑上使用的越来越少,因为其在通信速率,距离已经不适应pc的要求,取而代之的是USB口。但是在嵌入式领域,USART仍然广泛运用着。stm32的最多可以提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通信、具有DMA等。使用USART时,stm32的I/O口经RS232电平转换电路 和电脑的串口连接。串口使用只需要开始串口时钟,设置相应的I/O口模式,配置波特率、...

weixin_30479445的博客 2303

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3831

STM32 单片机USART 串口配置

是单片机或嵌入式系统中非常常用的一个外设模块,全程是 Universal Synchronous/Asynchronous Receiver/Transmitter (通用同步/异步收发器).USART 的主要功能是;。串口:硬件中数据传递的一种方式,而且是常用方式。后续开发中,WiFi,蓝牙,LoRaZigBee4/5G,都可以按照串口方式进行数据传递和设备控制。数据按照【串行数据传递格式】完成设备之间的通信。并行和串行:并行: 多跟数据线,数据多个位同时发送,类似高速公路。

kaka20020626的博客 1123

Windows11 下 Detectron2 的安装与配置全攻略

本文提供了在Windows11系统下安装和配置Detectron2的完整教程。详细介绍了从环境准备、创建虚拟环境、安装PyTorch与CUDA,到修改源码、编译安装以及运行验证Demo的全过程,帮助开发者克服Windows平台上的常见问题,成功部署这一强大的计算机视觉库。

weixin_29081703的博客 244

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04

在 ubuntu14 系统上面安装 CSI Tools,2020最新教程,亲测可用,只要保证和我做法一致绝对可以安装好。

WS的小屋 1万+

【STM32教程笔记】stm32入门教程(完整版汇总非常详细)

STM32 是意法半导体(STMicroelectronics)推出的一系列基于ARM Cortex-M 内核的32位微控制器。STM32 系列专为要求高性能、低成本、低功耗的嵌入式应用而设计,具有以下特点:特点与优势:1. 高性能:采用了 ARM Cortex-M 内核,例如 Cortex-M3、Cortex-M4 等,具有出色的处理性能和运行速度。

w123456789ABCDEF的博客 1万+

线性代数知识点整理

线性代数基础知识点摘要整理

cuguanren的博客 3万+

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记 课程简介(01) STM32简介(02) 软件安装(03) 新建工程(04) GPIO输出(05) LED闪烁& LED流水灯& 蜂鸣器(06) GPIO输入(07) 按键控制LED 光敏传感器控制蜂鸣器(08) OLED调试工具(09) OLED显示屏(10) EXTI外部中断(11) 对射式红外传感器计次 旋转编码器计次(12) TIM定时中断(13)

m0_62005595的博客 1万+

OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定

本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。

g5h6i的博客 1175

Qt C++ 实现一个完整的扫雷

mineCountLabel = new QLabel(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')), this);mineCountLabel->setText(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')));timeLabel->setText(QString("时间: %1").arg(gameTime, 3, 10, QChar('0')));" : "游戏失败!

寒寒豆豆软件公司的博客 107

STM32单片机入门学习——第26节: [9-2] USART串口外设

本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!

qq_44764442的博客 1161

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 374

别再只会用库函数了!手把手教你用C语言位操作玩转STM32寄存器(附完整宏定义)

本文详细介绍了如何在STM32开发中使用C语言位操作直接操作寄存器,提升代码效率和灵活性。通过基础位操作技巧、实用宏定义集和实战案例(如GPIO与USART配置),帮助开发者摆脱对库函数的依赖,实现更高效的嵌入式编程。特别适合需要优化代码尺寸和执行效率的场景。

weixin_28256233的博客 341

【Transformer】小白入门指南

Transformer是起源于NLP领域,然后在图像、视频、声音等领域都得到了广泛应用的基础架构,是继MLP、CNN、RNN’后的公认的第四大基础模型结构。Transformer技术凭借其卓越的表现和广泛的应用前景,已经成为了机器学习领域的一个关键技术。自从2017年Google提出》一文以来,Transformer架构的出现彻底改变了机器学习和深度学习的格局,尤其是在处理语言模型、生成模型以及多模态学习等领域,Transformer几乎成为了不可或缺的技术基石。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 2518

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STM32寄存器映射与库函数驱动原理详解

在嵌入式开发中,存储器映射I/O是ARM Cortex-M系列微控制器实现硬件控制的基础机制——所有外设均被映射为线性地址空间中的可读写内存单元。其核心原理在于将物理寄存器抽象为具有明确功能语义的符号化地址,通过volatile指针或宏定义实现安全、可维护的底层访问。该机制不仅支撑GPIO、USART、SysTick等关键外设的精确时序控制,更构成标准外设库(SPL)的底层基础:库函数本质是对寄存器位操作的高级封装,兼顾开发效率与执行确定性。理解寄存器映射与库函数的共生关系,是掌握STM32驱动开发、调试异

weixin_33814090的博客 43

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 【嵌入式STM32-05】STM32 外部中断 EXTI 基本原理|库函数程序代码|寄存器
下一篇: 【嵌入式STM32-10】STM32 ADC 基本原理|库函数程序代码|寄存器
赛博二哈
博客等级 码龄8年 5768粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值