完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1.USART简介
1.1USART框图 1.功能引脚 TX:数据发送。 RX:数据接收。 nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。 nRTS: 发送请求,若是低电平,表明USART准备好接收数据。 SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。 2.数据寄存器 数据寄存器包含了一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR写入数据会自动存储在 TDR内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。 3.控制器 USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等。 使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用于开启供给串口的时钟。发送或者接收数据字长可选8或9位,由USARTT_CR1的M位控制。 4.波特率生成 USART 的发送器和接收器使用相同的波特率,即使用该函数uart_init(115200);时,括号中的变量需要为一特定波特率,并且在串口助手中需要与该波特率相同。 1.2USART初始化函数 void uart_init(u32 bound){ //结构体定义 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//使能USART1,GPIOA时钟 //USART1_TX GPIOA.9初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ使能通道 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 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); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收中断 USART_Cmd(USART1, ENABLE);//使能串口1 } 2.主程序编写
//通过串口助手发送1-9的数据,然后再OLED上显示 x*5+100的值 #include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "string.h" #include "oled.h" int main(void){ int num,end_num; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); OLED_Init();//OLED初始化 OLED_ColorTurn(0);//颜色显示 OLED_DisplayTurn(0); OLED_Clear();//清空屏幕 //void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode) while(1){ if(USART_RX_STA&0x8000) { sscanf(USART_RX_BUF,"%d",&num); switch(num){ case 1: end_num = num*5+100; break; case 2: end_num = num*5+100; break; case 3: end_num = num*5+100; break; case 4: end_num = num*5+100; break; case 5: end_num = num*5+100; break; case 6: end_num = num*5+100; break; case 7: end_num = num*5+100; break; case 8: end_num = num*5+100; break; case 9: end_num = num*5+100; break; default: break; } OLED_ShowNum(0,0,end_num,3,16,1); OLED_Refresh(); delay_ms(1000); USART_RX_STA = 0;//可以接收下一次的数据 } } } 3.效果展示
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1885 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1663 浏览 1 评论
1149 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
763 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1964浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
790浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
616浏览 3评论
631浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
593浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 04:35 , Processed in 0.661796 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号