完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F407ZGT6的USART3驱动
STM32F407ZGT6的USART3直接通过转换芯片引出485的A,B口 电路原理图 串口初始化过程 声明初始化用到的结构体 进行外部时钟初始化,此处最容易出错,详细信息可以看我上一篇博客的分析 执行GPIO初始化,设置引脚复用 执行串口初始化 使能串口 开启串口中断 进行NVIC初始化配置 初始化485的使能引脚,如果串口没有连接485转换芯片的话,不需要进行这个步骤的设置 完整代码 #include "sys.h" #include "uart3.h" #include "includes.h" #define USART3_RXBUF_LEN 15 u8 UART3_RxBuffer[USART3_RXBUF_LEN]; //串口3接收缓冲区 u8 Rx_count=0; //串口3接收到的字节数 uint8_t USART3_RxBuf[USART3_RXBUF_LEN]; uint16_t USART3_RxHead = 0; uint16_t USART3_RxTail = 0; //初始化串口3,使用9600波特率,和485设备进行通信 //bound:波特率 void uart3_init(u32 bound){ //初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIOE_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //外部时钟初始化 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART2时钟 //GPIO初始化,USART3使用的是PB10,PB11引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //PB10,PB11引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB10,PB11 //设置引脚复用 GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10复用为USART2 GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11复用为USART2 串口初始化 USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; 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(USART3, &USART_InitStructure); //初始化串口 USART_Cmd(USART3, ENABLE); //使能串口 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启相关中断 //Usart3 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口3中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //初始化485的使能引脚,如果没有485转换芯片可以忽略这一步 //485的使能引脚在PE4引脚位置 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //初始化GPIOE,即初始化相应GPIOE的外部时钟 GPIOE_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIOE_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIOE_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOE,&GPIOE_InitStructure); GPIO_ResetBits(GPIOE,GPIO_Pin_4); } //串口3的发送函数 void Uart3_SendStr(u8* SendBuf,u8 len) { //发送数据前将485使能引脚置位,执行485输出 GPIO_SetBits(GPIOE,GPIO_Pin_4);//LED1 while(len>0) { while((USART3->SR&0X40)==0);//等待发送完成 USART3->DR = (u8) *SendBuf; SendBuf++; len--; } while((USART3->SR&0X40)==0); //这一步绝对不能少,保证最后一个字节发送成功 //发送完成之后设置485使能引脚置位,转为接收状态 GPIO_ResetBits(GPIOE,GPIO_Pin_4); } //串口3接收中断 void USART3_IRQHandler(void) { static int flag=1; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { flag*=-1; if(flag==-1) GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_RESET); if(flag==1) GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_SET); USART3_RxBuf[USART3_RxTail++] = USART_ReceiveData(USART3); USART3_RxTail &= USART3_RXBUF_LEN-1; } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:41 , Processed in 0.885190 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号