完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32 串口简介
串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。 现在基本上所有的 MCU 都会带有串口,STM32 自然也不例外。STM32 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 战舰 STM32 开发板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。 STM32 串口通信接口 UART:通用异步收发器 USART:通用同步异步收发器 UART异步通信方式引脚连接方法 RXD:数据输入引脚 数据接收 TXD:数据发送引脚 数据发送 STM32F103ZE战舰(正点原子)串口通信引脚 [tr]串口号RXDTXD[/tr]
后面的代码有详细体现 起始位 数据位(8位或者9位) 奇偶校验位(第9位) 停止位(1,15,2位) 波特率设置 例子 配置串口一般步骤 1. 串口时钟使能,GPIO时钟使能 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 1 2. 串口复位 USART_DeInit();//这步不是必须的 1 3. GPIO端口模式设置 GPIO_Init();//模式设置为GPIO_Mode_AF_PP 1 4. 串口参数初始化 USART_Init(); 1 5. 开启中断并且初始化NVIC(如果需要开起中断才需要这个步骤) NVIC_Init(); USART_ITConfig(); 1 2 6. 使能串口 USART_Cmd(); 1 7. 编写中断处理函数 USARTx_IRQHandler(); 1 8. 串口数据收发 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 9. 串口传输状态获取 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); 代码 串口通信函数初始化 我这边用到的的是PA9(TX)和PA10(RX)两个引脚所以使能GPIOA寄存器的时钟和串口1的时钟 /*使能时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA的使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置串口1的使能时钟 初始化IO口 /*初始化IO口*/ GPIO_InitTypeDef GPIO_USTR;//结构体定义 GPIO_USTR.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用模式 GPIO_USTR.GPIO_Pin = GPIO_Pin_9; GPIO_USTR.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_USTR); GPIO_USTR.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式 GPIO_USTR.GPIO_Pin = GPIO_Pin_10; GPIO_USTR.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_USTR); 串口初始化 /*串口初始化*/ //void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); USART_InitSture.USART_BaudRate = 115200;//波特率 USART_InitSture.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制 USART_InitSture.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送使能接受使能 USART_InitSture.USART_Parity = USART_Parity_No;//奇偶校验 USART_InitSture.USART_StopBits = USART_StopBits_1;//停止位字长 USART_InitSture.USART_WordLength = USART_WordLength_8b;//设置字长(8位字长) USART_Init(USART1,&USART_InitSture); 使能串口 /*使能串口*/ //void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); USART_Cmd(USART1, ENABLE); 开启接收中断 /*开启接受中断*/ //void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//(uint16_t USART_IT中断类型)开启接受中断 中断优先级设置 /*中断优先级设置*/ NVIC_InitStrue.NVIC_IRQChannel =USART1_IRQn;//哪个通道 NVIC_InitStrue.NVIC_IRQChannelCmd =ENABLE;//是否开启这个通道 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级(主函数里面是设置2) NVIC_InitStrue.NVIC_IRQChannelSubPriority =1;//子优先级(随意设置的) NVIC_Init(&NVIC_InitStrue); 设置中断处理函数 void USART1_IRQHandler(void)//中断处理函数 { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)){//是否接收到数据 res = USART_ReceiveData(USART1);//赋值收到的数据 USART_SendData(USART1,res);//发送数据 } } main.c #include "stm32f10x.h" void My_USART_Init(void) { /*结构体定义*/ GPIO_InitTypeDef GPIO_USTR; USART_InitTypeDef USART_InitSture; NVIC_InitTypeDef NVIC_InitStrue; /*使能时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA的使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置串口1的使能时钟 /*初始化IO口*/ GPIO_USTR.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用模式 GPIO_USTR.GPIO_Pin = GPIO_Pin_9; GPIO_USTR.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_USTR); GPIO_USTR.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式 GPIO_USTR.GPIO_Pin = GPIO_Pin_10; GPIO_USTR.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_USTR); /*串口初始化*/ //void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); USART_InitSture.USART_BaudRate = 115200;//波特率 USART_InitSture.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制 USART_InitSture.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送使能接受使能 USART_InitSture.USART_Parity = USART_Parity_No;//奇偶校验 USART_InitSture.USART_StopBits = USART_StopBits_1;//停止位字长 USART_InitSture.USART_WordLength = USART_WordLength_8b;//设置字长(8位字长) USART_Init(USART1,&USART_InitSture); /*使能串口*/ //void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); USART_Cmd(USART1, ENABLE); /*开启接受中断*/ //void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//(uint16_t USART_IT中断类型)开启接受中断 /*中断优先级设置*/ NVIC_InitStrue.NVIC_IRQChannel =USART1_IRQn;//哪个通道 NVIC_InitStrue.NVIC_IRQChannelCmd =ENABLE;//是否开启这个通道 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级(主函数里面是设置2) NVIC_InitStrue.NVIC_IRQChannelSubPriority =1;//子优先级(随意设置的) NVIC_Init(&NVIC_InitStrue); } void USART1_IRQHandler(void)//中断处理函数 { u8 res; if(USART_GetITStatus(USART1,USART_IT_RXNE)){//是否接收到数据 res = USART_ReceiveData(USART1);//赋值收到的数据 USART_SendData(USART1,res);//发送数据 } } int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//把系统中断优先级分组。2位抢占2位响应 My_USART_Init(); while(1); } 后面为了增加代码的可读性有时间的话会修改代码 实验结果 串口助手的的相关设置要和代码一样 USART_InitSture.USART_BaudRate = 115200;//波特率 USART_InitSture.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制 USART_InitSture.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送使能接受使能 USART_InitSture.USART_Parity = USART_Parity_No;//奇偶校验 USART_InitSture.USART_StopBits = USART_StopBits_1;//停止位字长 USART_InitSture.USART_WordLength = USART_WordLength_8b;//设置字长(8位字长) 结果(上面显示的是接收结果) |
||
|
||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1850浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
615浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
510浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
491浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-11 02:23 , Processed in 0.653802 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号