STM32_USART_寄存器操作

发布时间:2026/7/26 1:16:56

STM32_USART_寄存器操作 文章目录一、UASRT寄存器1、状态寄存器(USART_SR)2、数据寄存器(USART_DR)3、波特比率寄存器(USART_BRR)4、控制寄存器 1(USART_CR1)5、控制寄存器 2(USART_CR2)6、控制寄存器 3(USART_CR3)7、保护时间和预分频寄存器(USART_GTPR)8、USART寄存器地址映象二、代码实例串口寄存器编程代码含中断 查询模式三、总结1、关键寄存器2、硬件接线3、串口寄存器编程核心流程一、UASRT寄存器1、状态寄存器(USART_SR)地址偏移0x00复位值0x00C02、数据寄存器(USART_DR)地址偏移0x04复位值不确定3、波特比率寄存器(USART_BRR)注意 如果TE或RE被分别禁止波特计数器停止计数地址偏移0x08复位值0x00004、控制寄存器 1(USART_CR1)地址偏移0x0C复位值0x00005、控制寄存器 2(USART_CR2)地址偏移0x10复位值0x00006、控制寄存器 3(USART_CR3)地址偏移0x14复位值0x00007、保护时间和预分频寄存器(USART_GTPR)地址偏移0x18复位值0x00008、USART寄存器地址映象二、代码实例串口寄存器编程代码含中断 查询模式#includestm32f10x.h#includestring.h// 全局接收缓冲区中断接收用#defineUSART1_RX_BUF_SIZE128uint8_tUSART1_Rx_Buf[USART1_RX_BUF_SIZE];uint16_tUSART1_Rx_Len0;uint8_tUSART1_Rx_Flag0;// 接收完成标志0未完成1完成/** * brief 系统时钟初始化72MHzHSE8MHz * 串口波特率计算依赖系统时钟必须先初始化 */voidSystemClock_Init(void){// 1. 开启HSE等待稳定RCC-CR|RCC_CR_HSEON;while(!(RCC-CRRCC_CR_HSERDY));// 2. 配置FLASH延迟、总线分频FLASH-ACR|FLASH_ACR_LATENCY_2;RCC-CFGR~RCC_CFGR_HPRE;// AHB不分频RCC-CFGR|RCC_CFGR_PPRE1_DIV2;// APB1 2分频RCC-CFGR~RCC_CFGR_PPRE2;// APB2不分频// 3. 配置PLL8MHz×972MHzRCC-CFGR~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL);RCC-CFGR|RCC_CFGR_PLLMULL9;// 4. 开启PLL等待稳定RCC-CR|RCC_CR_PLLON;while(!(RCC-CRRCC_CR_PLLRDY));// 5. 切换系统时钟到PLLRCC-CFGR~RCC_CFGR_SW;RCC-CFGR|RCC_CFGR_SW_PLL;while((RCC-CFGRRCC_CFGR_SWS)!RCC_CFGR_SWS_PLL);}/** * brief USART1初始化9600波特率8位数据位1位停止位无校验 * param baudrate波特率如9600、115200 */voidUSART1_Init(uint32_tbaudrate){// 1. 开启GPIOA、USART1、AFIO时钟RCC-APB2ENR|RCC_APB2ENR_IOPAEN|RCC_APB2ENR_USART1EN|RCC_APB2ENR_AFIOEN;// 2. 配置GPIO引脚// PA9(TX)复用推挽输出10MHzGPIOA-CRH~(GPIO_CRH_MODE9|GPIO_CRH_CNF9);GPIOA-CRH|GPIO_CRH_MODE9_0|GPIO_CRH_CNF9_1;// PA10(RX)浮空输入GPIOA-CRH~(GPIO_CRH_MODE10|GPIO_CRH_CNF10);GPIOA-CRH|GPIO_CRH_CNF10_0;// 3. 配置串口核心参数USART1-CR1~USART_CR1_UE;// 先关闭串口// 配置数据位8位M0、无校验PCE0USART1-CR1~(USART_CR1_M|USART_CR1_PCE);// 配置停止位1位STOP[1:0]00USART1-CR2~USART_CR2_STOP;// 配置波特率USART1时钟72MHzUSART1-BRR72000000/baudrate;// 4. 开启发送、接收、接收非空中断USART1-CR1|USART_CR1_TE|USART_CR1_RE|USART_CR1_RXNEIE;// 5. 开启串口USART1-CR1|USART_CR1_UE;}/** * brief USART1 NVIC配置中断优先级 */voidUSART1_NVIC_Init(void){// 配置优先级分组22位抢占2位子优先级SCB-AIRCR0x05FA0800;// USART1对应37号中断通道NVIC-IP[37]~0xFF;// 清空优先级NVIC-IP[37]|0x10;// 抢占优先级1子优先级0NVIC-ISER[1]|(15);// 37325 → ISER1的bit5置1}/** * brief USART1发送一个字节查询模式 * param data要发送的字节 */voidUSART1_SendByte(uint8_tdata){// 等待发送数据寄存器为空TXE1while(!(USART1-SRUSART_SR_TXE));USART1-DRdata;// 等待发送完成TC1while(!(USART1-SRUSART_SR_TC));}/** * brief USART1发送字符串查询模式 * param str要发送的字符串 */voidUSART1_SendString(char*str){while(*str!\0){USART1_SendByte(*str);str;}}/** * brief USART1中断服务函数接收数据 * 接收规则接收到换行符\n表示接收完成 */voidUSART1_IRQHandler(void){uint8_trecv_data;// 检查接收非空标志RXNE1if(USART1-SRUSART_SR_RXNE){recv_dataUSART1-DR;// 读取数据自动清除RXNE标志// 接收逻辑未溢出且未完成if(USART1_Rx_LenUSART1_RX_BUF_SIZE!USART1_Rx_Flag){if(recv_data\n)// 换行符表示接收完成{USART1_Rx_Buf[USART1_Rx_Len]\0;// 字符串结束符USART1_Rx_Flag1;// 置位完成标志USART1_Rx_Len0;// 重置长度}else{USART1_Rx_Buf[USART1_Rx_Len]recv_data;}}else// 溢出或已完成重置{USART1_Rx_Len0;USART1_Rx_Flag0;}}}// 主函数测试串口收发中断接收查询发送intmain(void){// 1. 初始化系统时钟SystemClock_Init();// 2. 初始化USART19600波特率USART1_Init(9600);// 3. 初始化NVICUSART1_NVIC_Init();// 4. 发送测试字符串USART1_SendString(STM32 USART1 Register Test\r\n);USART1_SendString(Input String (end with \\n):\r\n);while(1){// 检测到接收完成if(USART1_Rx_Flag){// 回显接收的字符串USART1_SendString(Recv: );USART1_SendString((char*)USART1_Rx_Buf);USART1_SendString(\r\n);// 清空接收标志USART1_Rx_Flag0;}}}三、总结1、关键寄存器2、硬件接线STM32 PA9TX→ USB 转 TTL 模块 RXSTM32 PA10RX→ USB 转 TTL 模块 TXSTM32 GND → USB 转 TTL 模块 GND3、串口寄存器编程核心流程开时钟→配引脚→配波特率 / 帧格式→开收发 / 中断→配 NVIC→编写收发 / 中断函数

相关新闻