计算机系统应用教程网站

网站首页 > 技术文章 正文

STM32串口你知道多少 stm32f1串口

btikc 2024-10-12 11:44:06 技术文章 6 ℃ 0 评论


想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。

01USART的特点

USART是通用异步收发传输器UniversalAsynchronousReceiver/Transmitter),通常称UART,是一种异步收发传输,是设备间进行异步通信的关键模块UART负责处理数据总线和串行口之间的/并、/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线RxTx)就可以完成通信过程,这种通信叫作异步串行通信。

全双工异步通信。

小数波特率发生器系统,提供精确的波特率。

可配置16倍过采样8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。

可编程的数据字长度8位或9位);

可配置的停止位(支12位停止位);

可配置的使DMA多缓冲器通信。

单独的发送器和接收器使能位。

检测标志接受缓冲发送缓冲器传输结束标志

多个带标志的中断源。触发中断。

其他:校验控制,四个错误检测标志。

02USART简介

帧结构

串口异步通信需要定义的参数

起始位

数据位8位或9位)

奇偶校验位(9位)

停止位1,15,2位)

波特率设置

带奇偶校验的数据为就9

1.数据包

串口通讯的数据包由发送设备通过自带的TXD接口传输到接收设备RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据89位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能进行收发数据。

2.波特率

由于异步通信中没有时钟信号,所以接收双方要设置好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率48009600115200STM32中波特率的设置通过串口初始化结构体来实现。

3.起始和停止信号

数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻0的数据位表示,停止位信号可0.511.52个逻1的数据位表示,双方需约定一致STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。

4.有效数据

有效数据规定了主题数据的长度,一般89位,其STM32中也是通过串口初始化结构体来实现的。

5.数据校验

在有效数据之后,有一个可选的数据校验位。数据通信是会受到外部干扰导致传输数据出现偏差,可以在传输过程增加校验位来处理这个问题。校验方法有奇校(odd)、偶校(even)0(space)1(mark)以及(noparity)。这些也都可以在串口初始化结构体中实现的。

2.3、波特率

OVER8,用于配置过采样,通常情况下OVER8设置0

如果时钟84M

USARTDIV = 84000000/(115200*16) = 45.572

那么得到:

DIV_Fraction = 16*0.572 = 0x09;

DIV_Mantissa = 45 = 0x2D;

03STM32USART

STM32F207数据手册STM32F2076个串口

我们USART1为例

STM32F207数据手册Table10. Alternate functionmapping图中看USART1的对应管脚,我们选PA9PA10USART1的管脚。

04、代码配置

配置中断优先级

/* Enable the USARTx Interrupt */

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

打开串口与相应GPIO引脚,配置好相应串口信息GPIO引脚的工作模式。

/* Enable GPIO clock */

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

/* Enable UART1 clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

/* Connect PXx to USARTx_Tx*/

GPIO_PinAFConfig(GPIOA,9,GPIO_AF_USART1);

/* Connect PXx to USARTx_Rx*/

GPIO_PinAFConfig(GPIOA,10,GPIO_AF_USART1);

/* Configure USART Tx as alternate function */

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

/* Configure USART Rx as alternate function */

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_Init(GPIOA,&GPIO_InitStructure);

USART1

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_HardwareFlowControl=USART_HardwareFlowControl_None;//配置硬件流控制USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//配置工作模式,收发一起

/* USART configuration */

USART_Init(USART1,&USART_InitStructure);//完成串口的初始化配置

使能中断配置。

USART_ITConfig(USART1,USART_IT_TC,ENABLE);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE)

我们配置了发送传输完成中断和接收数据寄存器非空中断。我们可以配置很多类型中断,ST提供的标准库函数中看到。

/** * @brief Enables or disables the specified USART interrupts. * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or * UART peripheral. * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * @arg USART_IT_CTS: CTS change interrupt * @arg USART_IT_LBD: LIN Break detection interrupt * @arg USART_IT_TXE: Transmit Data Register empty interrupt * @arg USART_IT_TC: Transmission complete interrupt * @arg USART_IT_RXNE: Receive Data register not empty interrupt * @arg USART_IT_IDLE: Idle line detection interrupt * @arg USART_IT_PE: Parity Error interrupt * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) * @param NewState: new state of the specified USARTx interrupts. * This parameter can be: ENABLE or DISABLE. * @retval None */

最后使能串口。

/* Enable USART */

USART_Cmd(USART1,ENABLE);

main主函数,功能LCD显示串口接收10个字符(如果不ascii码则不显示),串口倒序返回接收到10个字节。

intmain(void){/*省略初始化部分代*/

while(1)

{

if(LCD_refresh_flg){

LCD_refresh_flg=0;

LCD_ShowString(0,16,receive_data);

receive_num--;

USART_SendData(USART1,receive_data[receive_num--]);

send_flg=1;

}

}}

因为使能了中断,我们还需要编写中断函数。

voidUSART1_IRQHandler(void){

if(USART_GetFlagStatus(USART1,USART_FLAG_TC))

{

if(send_flg==1){

if(receive_num==0){

USART_SendData(USART1,receive_data[receive_num]);

send_flg=0;

receive_flg=1;

}else{

USART_SendData(USART1,receive_data[receive_num--]);

}

}

USART_ClearFlag(USART1,USART_FLAG_TC);

}

if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))

{

if((receive_flg)&&(send_flg==0)){

receive_data[receive_num++]=USART_ReceiveData(USART1);

if(receive_num==10){

receive_flg=0;

LCD_refresh_flg=1;

}

}

USART_ClearFlag(USART1,USART_FLAG_RXNE);

}}

本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回我要入,与我们一起成长,喜欢的可以点个赞关注我们!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表