完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
串口相关寄存器: USART_SR 状态寄存器(里面的一些标志位类似51的TI,RI) USART_DR 数据寄存器(类似SBUF) USART_BRR 波特率寄存器(波特率寄存器,15:4位定义了USARTDIV的整数部分,3:0位定义了USARTDIV的小数部分) 波特率=fpclock(1,2)/(16*USARTDIV) USART_CR1 设置一些发送或接收使能,以及一些中断使能 编写串口程序的步骤: 1.串口时钟使能,GPIO时钟使能, 使能串口对应的APB总线,以及GPIO对应的AHB总线 2.串口资源映射 3.设置GPIO端口模式 //GPIO_InitStruct 4.串口初始化, //USART_InitStruct 5.使能串口 //USART_Cmd其实就是配置CR1寄存器 6.配置中断 //设置串口的中断方式 7.设置中断优先级, //NVIC_InitStruct 在设置抢占优先级和子优先级之前需要先在主函数比较靠前的地方设置分组 8.写串口中断服务函数 9.串口传输状态获取USART_Flags 以及解挂(清除标志位) void MY_USART_INIT() { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; //1.使能GPIOA和USART1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE); //2.串口资源映射 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1 //3.GPIO端口模式设置,模式设置为复用 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed; GPIO_Init (GPIOA,&GPIO_InitStruct); //4.串口参数初始化 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_Init(USART1,&USART_InitStruct); //5.使能串口 USART_Cmd(USART1, ENABLE); //6.配置中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//设置接收缓冲器非空中断 //7.中断优先级的设置,设置之前要先在主函数比较靠前的位置设置分组 NVIC_InitStruct.NVIC_IRQChannel= USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //子优先级 NVIC_Init(&NVIC_InitStruct); } //中断服务函数,没有入口参数,没有返回 void USART1_IRQHandler(void) { u16 REC = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE)==1) //证明一下是缓冲器非空产生 { REC = USART_ReceiveData(USART1); USART_SendData(USART1,REC); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==0);//等待发送完成 } USART_ClearITPendingBit(USART1,USART_IT_RXNE); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 16:33 , Processed in 0.656844 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号