1、CC2530和STM32嵌入式接口技术开发5.7 STM32串口通信技术应用开发EducationSolutions目录ContentsInternet+串口介绍STM32的USARTSTM32串口库函数的使用项目实践23:54/3串口通信协议串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。23:54/4STM32的串口介绍STM32芯片具有多个 USART 外设用于串口通讯,它是
2、Universal SynchronousAsynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。23:54/5USART串口的原理1.串口通用功能引脚TXD:发送引脚RXD:接收引脚2.串口的数据收发寄存器数据接收与发送寄存器相互独立,可以实现同步数据收发。3.串口数据收发控制器控制串口的数据发送、接收、唤醒、中断控制等等。4.波特率生成器对数据发送和接收的波特率进行控制。23:54/6STM32F4xx系类串口位置STM32芯片的串口众多,根据挂载在不同时钟总线上的串口可分为高速串口和一般串口,又由于控制
3、器的不同可分为同步串口和异步串口。23:54/7USART串口外部中断请求中断事件事件标志使能控制位发送数据寄存器为空 TXE TXEIECTS 标志CTSCTSIE发送完成TCTCIE准备好读取接收到的数据RXNERXNEIE检测到上溢错误ORE检测到空闲线路 IDLE IDLEIE奇偶校验错误PEPEIE断路标志LBDLBDIE多缓冲通信中的噪声标志、上溢错误和帧错误NF/ORE/FEEIE串口是一种常用的通讯手段,当数据量较大是就会遇到各种各样的问题,因此对各种问题也要有一定的中断处理机制。23:54/8串口配置流程RCC_AHB1PeriphClockCmd(DEBUG_USART_R
4、X_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure);1.使能端口和时钟GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);2.配置端口复用USART_Init(DEBUG_U
5、SART,&USART_InitStructure);3.初始化串口相关参数USART_Cmd(DEBUG_USART,ENABLE);4.使能串口STM32串口库精简度很高,配置较为简单,只需配置时钟、复用、串口参数即可。23:54/9串口初始化参数typedef struct uint32_t USART_BaudRate;/波特率波特率越高数据传输速率越快,但传输距离越短uint16_t USART_WordLength;/字长用于配置数据长度,字长通常有5位、6位、7位和8位等uint16_t USART_StopBits;/停止位作为一条信息的结束位,有1位和2位两种情况uint16
6、_t USART_Parity;/校验位校验数据在发送过程中是否出错uint16_t USART_Mode;/USART 模式用于确认串口的收发模式uint16_t USART_HardwareFlowControl;/硬件流控制,通常不配置不使能 USART_InitTypeDef;/串口配置结构体串口配置主要需要注意三个参数,波特率、数据长度、停止位和校验位即可,在使用串口时另一个串口接口要于此保持一致。23:54/10项目场景串口是工业主板上一种非常通用设备通信的协议,大多数工业主板包含两个以上基于RS-232的串口。串口是按位(bit)发送和接收字节,速度要比按字节(byte)的并行通
7、信慢,但串口可以在使用一根线发送数据的同时用另一根线接收数据,能够简单实现远距离通信。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。23:54/11任务目标使用STM32处理器模拟设备与中央控制台间的数据交互。STM32与PC及通过串口相连,通过PC机上机向STM32处理器发送数据。STM32处理器接受到数据后回显,STM32处理器当通过串口接受到了特定的字符时向PC机打印接受到的所有数据,以此实现STM32处理器与PC机的交互。23:54/12项目分析STM32F407的函数库接口十分精简,串口的配置也同样如此。通常STM32F407的的结构体配置主要注意几个参数即可,即波特率、数
8、据位、校验位和停止位。在使用串口是需要配置相关的PC端的串口上位机,配置上位机时要注意配置的串口参数要与芯片本身配置的串口参数一致。23:54/13项目程序逻辑框图程序开始执行时首先初始化LED,延时一段时间后初始化串口,同时串口打印相关的实验内容,信息打印完成后设置LED初始状态为熄灭。然后程序进入主循环,在主循环中程序不断等待收据接收,接收到数据后将数据从新发送到PC。数据在接收过程中LED3、4闪烁。23:54/14项目实现void usart_init(unsigned int bound)/GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure;US
9、ART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);/使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);/使能USART1时钟 /串口1对应引脚复用映射 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);/GPIOA9复用为USART1 GPIO_PinAFConfi
10、g(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);/GPIOA10复用为USART1 lusart1初始化23:54/15项目实现/USART1端口配置 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;/GPIOA9与GPIOA10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;/复用功能 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/速度50MHz GPIO_InitStructure.GPIO_OType=GPIO_O
11、Type_PP;/推挽复用输出 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;/上拉 GPIO_Init(GPIOA,&GPIO_InitStructure);/初始化PA9,PA10/USART1 初始化设置 USART_InitStructure.USART_BaudRate=bound;/波特率设置 USART_InitStructure.USART_WordLength=USART_WordLength_8b;/字长为8位数据格式 USART_InitStructure.USART_StopBits=USART_StopBits_1;/一个停止位
12、USART_InitStructure.USART_Parity=USART_Parity_No;/无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;/无硬件数据流控制lusart1初始化23:54/16项目实现/收发模式 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);/根据上述配置初始化串口1/Usart1 NVIC 配置 N
13、VIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;/串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;/抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;/子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/IRQ通道使能 NVIC_Init(&NVIC_InitStructure);/根据指定的参数初始化VIC寄存器、USART_ITConfig(USART1,US
14、ART_IT_RXNE,ENABLE);/开启串口1接收中断 USART_Cmd(USART1,ENABLE);/使能串口1 lusart1初始化23:54/17项目实现void USART1_IRQHandler(void)if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)/如果收到数据(接收中断)USART_ClearFlag(USART1,USART_IT_RXNE);/清除接收中断标志 if(Usart_len USART_REC_MAX)USART_RX_BUFUsart_len+=USART_ReceiveData(USART1);
15、/将数据放入接收缓冲区 l串口中断处理函数23:54/18项目实现void clean_usart(void)memset(USART_RX_BUF,0,Usart_len);Usart_len=0;l清除串口缓冲区23:54/19项目实现void usart_send(unsigned char*s,unsigned char len)for(unsigned char i=0;i len;i+)USART_SendData(USART1,*(s+i);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET);l串口1发送数据23:54/20项目思考串口通信协议有什么特点?STM32处理器的串口需要配置哪些参数?请列举几个常见的串口实例?如何驱动STM32处理器的串口?