完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、先贴代码
1、USART基础配置 /*配置USART1中断分组NVIC并使用中断*/ static void USART_NVIC_CFG(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//嵌套向量中断控制器组选择 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置 USART 为中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢断优先级为 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级为 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /*USART_GPIO初始化*/ void USART_GPIO_CFG { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);// 打开串口 GPIO 的时钟 // 将 USART Tx 的 GPIO 配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 将 USART Rx 的 GPIO 配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } /*USART参数配置*/ void USART_CFG(void) { USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1, ENABLE);// 打开串口外设的时钟 // 配置串口的工作参数 USART_InitStructure.USART_BaudRate = 115200 ; // 配置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 配置 帧数据字长 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);// 完成串口的初始化配置 /*打开串口接受中断。每收到一个字节进入一次中断*/ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /*打开串口接受一帧数据中断。每收到一帧数据进入一次中断*/ USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); USART_Cmd(USART1, ENABLE); // 使能串口 } char rece_buffer[255]; //接收缓存区 int RxCounter; //接收了多少字符 uint8_t USART1_rece_Flag=0; //接收一帧的标志位 /*USART中断服务函数*/ void USART1_IRQHandler(void) { u8 clear=clear; USART_ClearFlag(USART1,USART_FLAG_TC); if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET) //接收一字节中断 { rece_buffer[RxCounter++]=USART1->DR; } else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET) //接收一帧中断 { clear=USART1->SR; clear=USART1->DR; //先读SR在读DR清除USART_FLAG_IDLE USART1_rece_Flag=1; } } 2、启用printf函数 #include #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } ** * @brief 重定向重写C函数库中的fputc函数,重定向后可使用printf函数 * @param ch:要输出的字节 * @param *f:无用 * @retval 无 */ int fputc(int ch, FILE *f) { USART_SendData(USART1_HANDLE, (uint8_t)ch); /* 发送一个字节数据到串口 */ while (USART_GetFlagStatus(USART1_HANDLE, USART_FLAG_TXE) == RESET); /* 等待发送完毕 */ return (ch); } 二、串口配置步骤 1、打开时钟(RCC配置) USART1 的时钟来源于 APB2 总线时钟(最大频率为 90MHz)。USART2、USART3、UART4、UART5的时钟来源于 APB1 总线时钟(最大频率为 45MHz)。:如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上,采用RCC_APB1PeriphClockCmd()进行初始化。 2、GPIO配置 GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。 3、NVIC配置 STM32在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是抢占优先级(主优先级)和子优先级(从优先级),而整个优先级设置参数的长度为4位,因此需要首先划分抢占优先级位数和子优先级位数,通过NVIC_PriorityGroupConfig()实现;特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置为ENABLE。最后通过NVIC_Init()来使能这一中断向量。 4、USART配置 通过结构体USART_InitTypeDef来确定。UART模式下的字段如下: USART_BaudRate:波特率(每秒能传输的数据位),缺省值为9600。 USART_WordLength:字长 USART_StopBits:停止位 USART_Parity:校验方式(奇偶校验) USART_HardwareFlowControl:硬件流控制 USART_Mode:单/双工,即收发状态。 最后通过USART_Init()来设置。 三、部分串口与引脚图 四、USART BUG总结 STM32中关于串口中断的调试(不断进入发送中断的原因) STM32 串口中的硬件BUG,请注意! STM32F103串口BUG——一个神奇的BUG |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1025 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1016 浏览 1 评论
514 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
382 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
912 浏览 2 评论
1565浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
227浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
248浏览 3评论
215浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
212浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-7 10:24 , Processed in 1.565862 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号