完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
简介
STM32F1基本配置2.串口的配置和常用函数,侧重于即配即用。 因此不会讲述太多原理性的东西,希望做到即拿即用的效果。 串口简介 串口是MCU重要的外部接口,用于数据传输,也是开发中重要的调试手段。 STM32的串口资源丰富,支持多种通讯模式,具有DMA等。 串口的参数有波特率,停止位等。 由于这里侧重于即配即用,更多详细的内容可自行查阅。 串口配置相关知识 至于串口的波特率等相关参数的知识,网上已经有很多资料可自行查阅。 在这里说一下使用printf打印串口的知识: 由于是在MCU上运行的程序,所以无法像写C语言一样直接使用printf。 要想使用printf打印串口则需要改写fputc函数,如下: int fputc(int ch, FILE *f) { USART_SendData(USART1, (u8)ch);//发送一个字节数据到串口 //等待发送完毕 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } return ch; } 然后是串口中断的知识: 常用的串口中断有RXNE(读寄存器非空)和TC(发送完成)。 当使能了这两个中断 如:USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ITConfig(USART1, USART_IT_TC, ENABLE); 只要产生读寄存器非空和发送完成的事件就会进入到中断函数 void USART1_IRQHandler(void)里面去执行, 一般进入中断函数后先判断是哪种中断(只要产生中断就进入这个中断函数), 判断是哪种中断:USART_GetITStatus(USART1, USART_IT_RXNE) 在出中断函数前要擦除中断标志: USART_ClearITPendingBit(USART1, USART_IT_RXNE); 串口无中断配置 GPIO_InitTypeDef GPIO_InitStructure; //用来配置USART对应引脚的结构体 USART_InitTypeDef USART_InitStructure; //用来配置USART的结构体 //开启串口A的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启串口对应端口组的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置USART的输出引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //串口1的输出引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 //配置USART的输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //输入引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置浮空输入模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口 //配置串口 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_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置输出和输入模式 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制 USART_Init(USART1, &USART_InitStructure); //根据参数初始化USART USART_Cmd(USART1, ENABLE); //使能串口 串口有中断配置 首先要在配置串口中断配置前设置NVIC中断分组,不然无法使用中断 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 下面是配置STM32F1RC配置相关代码 GPIO_InitTypeDef GPIO_InitStructure; //用来配置USART对应引脚的结构体 USART_InitTypeDef USART_InitStructure; //用来配置USART的结构体 NVIC_InitTypeDef NVIC_InitStructure; //用来配置USART中断的结构体 //开启串口A的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启串口对应端口组的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置USART的输出引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //串口1的输出引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 //配置USART的输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //输入引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置浮空输入模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口 //配置串口 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_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置输出和输入模式 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制 USART_Init(USART1, &USART_InitStructure); //根据参数初始化USART //配置USART的中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能 NVIC_Init(&NVIC_InitStructure); //初始化 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收寄存器非空中断使能 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //发送完成中断使能 USART_Cmd(USART1, ENABLE); //使能串口 串口中断函数 不管产生哪种串口中断都会进入到中断函数,所以需要在里面判断是哪种中断 然后需要清除中断标志 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否是RXNE中断 { USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除RXNE中断标志位 //用户代码 } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //判断是否是TC中断 { USART_ClearITPendingBit(USART1, USART_IT_TXE); //清除TC中断标志位 //用户代码 } } |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4130 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3221 浏览 1 评论
2747 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2175 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14939 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3084浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1894浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2064浏览 3评论
1976浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2165浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 23:40 , Processed in 0.976128 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1224