完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32学习笔记心得四:
=============串口通信================ 1.通信方式 处理器和外围设备进行通信的方式:并行通信和串行通信 并行通信: 传输原理:数据的每一个位都在同时传输 优点: 速度快 缺点: 占用很多引脚资源 串行通信: 传输原理:数据按位的顺序传输 优点: 占用引脚少 缺点: 传输速度慢 对于大部分的设备来讲,引脚资源是有限的,所以在通信方面要节约IO口 串口作为MCU的重要外接设备,同时也作为软件调试手段 串行通信按照传送的方向分几种: 单工 :数据在传输的时候只支持一个方向的传输 半双工:允许数据在两个方向传输,但是在同一时刻只允许数据一个方向传输 全双工:允许数据在两个方向传输,但是设备要具有收发功能 串行通信又分为同步通信和异步通信 同步通信:带时钟的同步信号去传输,比如IIC和SPI 异步通信:不带时钟的同步信号,如UART(通用的异步收发设备) 通信标准 引脚 通信方式 通信方向 UART TXD:发送端 异步通信 全双工 RXD:接收端 IIC SCL:同步时钟 同步通信 半双工 SDA:数据IO口 串口应该怎么使用(七步曲) 1.使能串口时钟+使能GPIO时钟 2.设置引脚的复位映射 3.配置GPIO引脚初始化,GPIO引脚的模式改为复用模式 4.配置串口的参数 5.中断优先级+配置NVIC初始化 6.使能串口 7.编写中断服务函数 1.硬件图 (day04/串口.png) 2. a.使能串口时钟 RCC_APB2PeriphClockCmd void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) 参数1:uint32_t RCC_APB2Periph 串口号 RCC_APB2Periph_USART1 参数2:FunctionalState NewState ENABLE 开启使能 DISABLE 关闭使能 b.设置引脚的复位映射 GPIO_PinAFConfig() void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) 参数1:GPIO_TypeDef* GPIOx 组别 GPIOA ---GPIOG 参数2:uint16_t GPIO_PinSource 引脚号 GPIO_PinSourcex where x can be (0..15)。 参数3:uint8_t GPIO_AF @arg GPIO_AF_USART1: Connect USART1 pins to AF7 @arg GPIO_AF_USART2: Connect USART2 pins to AF7 @arg GPIO_AF_USART3: Connect USART3 pins to AF7 @arg GPIO_AF_UART4: Connect UART4 pins to AF8 @arg GPIO_AF_UART5: Connect UART5 pins to AF8 @arg GPIO_AF_USART6: Connect USART6 pins to AF8 @arg GPIO_AF_UART7: Connect UART7 pins to AF8 @arg GPIO_AF_UART8: Connect UART8 pins to AF8 等下配置复用功能 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式 c.配置串口的参数 USART_Init void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 参数2:USART_InitTypeDef* USART_InitStruct typedef struct { uint32_t USART_BaudRate; /*!《 波特率 */ uint16_t USART_WordLength; /*!《 字节长度 */ uint16_t USART_StopBits; /*!《 停止位 */ uint16_t USART_Parity; /*!《 奇偶校验位 */ uint16_t USART_Mode; /*!《 模式配置*/ uint16_t USART_HardwareFlowControl; /*!《 硬件控制流 */ } USART_InitTypeDef; 1.常用的波特率 是9600 115200 2. /** @defgroup USART_Word_Length * @{ */ #define USART_WordLength_8b ((uint16_t)0x0000)//8位 #define USART_WordLength_9b ((uint16_t)0x1000)//9位 3. /** @defgroup USART_Stop_Bits * @{ */ #define USART_StopBits_1 ((uint16_t)0x0000) #define USART_StopBits_0_5 ((uint16_t)0x1000) #define USART_StopBits_2 ((uint16_t)0x2000) #define USART_StopBits_1_5 ((uint16_t)0x3000) 4./** @defgroup USART_Parity * @{ */ #define USART_Parity_No ((uint16_t)0x0000)//常用 #define USART_Parity_Even((uint16_t)0x0400)//奇校验 #define USART_Parity_Odd ((uint16_t)0x0600)//偶校验 5. /** @defgroup USART_Mode * @{ */ #define USART_Mode_Rx ((uint16_t)0x0004)//接收 #define USART_Mode_Tx ((uint16_t)0x0008)//发送 6. /** @defgroup USART_Hardware_Flow_Control * @{ */ #define USART_HardwareFlowControl_None ((uint16_t)0x0000)//无流控 #define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) #define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) #define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) d.中断优先级+配置NVIC初始化 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 参数:uint32_t NVIC_PriorityGroup @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority 4 bits for subpriority @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority 3 bits for subpriority @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority 2 bits for subpriority @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority 1 bits for subpriority @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority 0 bits for subpriority 配置中断分组 NVIC_Init() void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) typedef struct { uint8_t NVIC_IRQChannel; /*!《中断线 */ uint8_t NVIC_IRQChannelPreemptionPriority; /*!《 抢占优先级 */ uint8_t NVIC_IRQChannelSubPriority; /*!《 响应优先级*/ FunctionalState NVIC_IRQChannelCmd; /*!《权限*/ } NVIC_InitTypeDef; 1. USART1_IRQn = 37, /*!《 USART1 global Interrupt */ USART2_IRQn = 38, /*!《 USART2 global Interrupt */ USART3_IRQn = 39, /*!《 USART3 global Interrupt 2、3. /** @defgroup MISC_System_Low_Power * @{ */ #define NVIC_LP_SEVONPEND ((uint8_t)0x10) #define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) #define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) 4. ENABLE or DISABLE e.串口的中断 USART_ITConfig void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 参数2:uint16_t USART_IT 属性 USART_IT_RXNE 参数3:FunctionalState NewState 权限 ENABLE DISABLE f.串口使能 USART_Cmd void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 参数2:FunctionalState NewState 权限 ENABLE or DISABLE g.编写中断服务函数 USART1_IRQHandler ; USART1 USART2_IRQHandler ; USART2 USART3_IRQHandler ; USART3 1.保存接收的数据 USART_ReceiveData uint16_t USART_ReceiveData(USART_TypeDef* USARTx) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 2.发送数据 USART_SendData void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 参数2:uint16_t Data 数据 3.清楚中断标志位 USART_ClearITPendingBit void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) 参数1:USART_TypeDef* USARTx 串口号 USARTx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 参数2:uint16_t USART_IT 属性 USART_IT_RXNE 串口实现代码: 串口实现代码: #include “usart.h” char Data; /*******串口中断服务函数*****/ void USART1_IRQHandler(void) { //1.保存接收的数据 USART_ReceiveData USART_ReceiveData(USART1); //2.发送数据 USART_SendData USART_SendData(USART1,Data); //3.清楚中断标志位 USART_ClearITPendingBit USART_ClearITPendingBit(USART1,USART_IT_RXNE); } /********串口1初始化********/ void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; //1.开启USART时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //2.开启GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //复用功能 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //配置GPIO GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;//9,10号引脚 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;//复用模式 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;//输出速度 GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;//开漏保护 GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;//上拉电阻 GPIO_Init(GPIOA,&GPIO_InitStruct); //配置串口 USART_InitStruct.USART_BaudRate =115200;//波特率 USART_InitStruct.USART_WordLength =USART_WordLength_8b;//8位 USART_InitStruct.USART_StopBits =USART_StopBits_1;//最后一位 USART_InitStruct.USART_Parity =USART_Parity_No;//无校验 USART_InitStruct.USART_Mode =USART_Mode_Rx | USART_Mode_Tx;//收发功能 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无流控 USART_Init(USART1,&USART_InitStruct); //中断优先级选择 NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//中断事件,在stm32f4xx.h查找 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 0x02;//抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x02;//响应优先级 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能 NVIC_Init(&NVIC_InitStruct); //串口使能 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); } 总结:STM32串口功能实现需要根据需要配置所用串口,其中涉及到多出组的初始化以及gpio引脚的配置,各位码友有什么需要可以随之联系,希望大家多多关注互相交流学习。 |
|
|
|
只有小组成员才能发言,加入小组>>
2555 浏览 0 评论
1155浏览 2评论
758浏览 1评论
509浏览 0评论
270浏览 0评论
444浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 15:47 , Processed in 1.527442 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号