STM32串口

通用同步异步收发器(USART)提供一种灵活的方法与外部设备之间进行全双工数据交
换,USART利用分数波特率发生器提供宽范围的波特率选择,使用多缓冲器配置的DMA方
式,可以实现高速数据通信。
4.1、接线方式
接口通过三个引脚与其他设备连接在一起,任何USART双向通信至少需要两个脚:接
收数据输入(RX)和发送数据输出(TX)。
RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据
TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器
被激活,
并且不发送数据时,TX引脚处于高电平。
全双工:描述通讯的时候分为单工和双工,双工又分为全双工和半双工
单工是指设备1与设备2在通讯时只能沿一个方向运行,设备1向设备2发送数据,或者设备2向设备1发送数据。
双工指设备既可以收又可以发。 双工又分为全双工和半双工,半双工是指只能发或者只能收。全双工是指设备既可以发也可以收
4.2、USART框架图 外部引脚发送和接收端 硬件流量的引脚
时钟引脚用于同步通讯的
寄存器,通过程序代码的方式讲将发送的数据写入到发送数据寄存器,又发送移位寄存器将数据一位一位的通过tx发送引脚将数据发送出去;通过Rx引脚接受数据将数据给到接受移位寄存器,给到移位寄存器,移位寄存器将数据一位一位的将数据存到接受数据寄存器。CPu通过接受数据电容器一位一位的读走
发送或者接受速率必须保持一直,才能正确的收发数据;时钟来源是由发送和接收器控制器控制的,发送有发送时钟,接受有接受的时钟,发送者来源于外部时钟,经过波特率发生器接受配置以后,最终将波特率发送给发送者控制器控制数据寄存器实现数据的发送和接受 这一块控制串口是使能串口和使能中断一些相关的寄存器,有中断状态标志的一些寄存器,CR1,CR2,CR3一些控制器来控制串口的通讯
波特率发生器用来配置和修改波特率来控制,来实现的波特率的设置,波特率发生器里面又分为小数和整数部分
寄存器的学习参考官方文档STM32中文参考手册25章通用同步异步收发器
4.2.1、引脚说明
SW_RX:数据接收引脚,属于内部引脚。
nRTS:请求以发送,n表示低电平有效。如果使能 RTS 流控制,当USART接收器准备好接收
新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚
只适用于硬件流控制。
nCTS:清除以发送(Clear To Send),n表示低电平有效。如果使能 CTS流控制,发送器在发
送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则
在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
4.2.2、接收发送数据寄存器
USART数据寄存器(USART_DR)只有低 9 位有效
4.2.3、串口时钟
USART1的时钟来源于APB2总线时钟,最大频率为72MHZ,其他4个时钟来源于APB1
总线时钟,最大频率36MHZ。UART只有异步传输功能,没有SCLK、nCTS和nRTS功能引
脚。
.3.4、波特率发生器
接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同 CK:给USART的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1) 
4.3、DMA连续通信
4.3.1、串口DMA发送
使用串口DMA方式将SRAM的数据通过串口发送出发
1 #define USART1_DR_ADDR ( USART1_BASE + 4 )
2 #define BUFSIZE 28
3
4 char tx_buf [ BUFSIZE ] = { \
5 'a' , 'b' , 'c' , 'd' , 'e' , \
6 'f' , 'g' , 'h' , 'i' , 'j' , \
7 'k' , 'l' , 'm' , 'n' , 'o' , \
8 'p' , 'q' , 'r' , 's' , 't' , \
9 'u' , 'v' , 'w' , 'x' , 'y' , \
10 'z' , 'z' , 'z' };
11
12 void uart_dma_init ( void )
13 {
14 GPIO_InitTypeDef GPIO_InitStruct ;
15 USART_InitTypeDef USART_InitStruct ;
16
17 RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE );
18 RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | \
19 RCC_APB2Periph_AFIO , ENABLE );
20
21 //GPIO Init(PA9‐>TX,PA10‐>RX)
22 GPIO_InitStruct . GPIO_Pin = GPIO_Pin_9 ;
23 GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
24 GPIO_InitStruct . GPIO_Mode = GPIO_Mode_AF_PP ;
25 GPIO_Init ( GPIOA , & GPIO_InitStruct );
26 27 GPIO_InitStruct . GPIO_Pin = GPIO_Pin_10 ;
28 GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
29 GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
30 GPIO_Init ( GPIOA , & GPIO_InitStruct );
31
32 //usart init
33 USART_InitStruct . USART_BaudRate = 115200 ;//波特率
34 USART_InitStruct . USART_HardwareFlowControl = \ //硬件的流控
35 USART_HardwareFlowControl_None ;
36 USART_InitStruct . USART_Parity = USART_Parity_No ;//奇偶校验
37 USART_InitStruct . USART_StopBits = USART_StopBits_1 ;//停止位
38 USART_InitStruct . USART_WordLength = USART_WordLength_8b ;//数据位的长度
39 USART_InitStruct . USART_Mode = USART_Mode_Tx | USART_Mode_Rx ;//串口的模式
40 USART_Init ( USART1 , & USART_InitStruct );
41
42 //DMA init
43 DMA_InitStruct . DMA_PeripheralBaseAddr = USART1_DR_ADDR ;
44 DMA_InitStruct . DMA_MemoryBaseAddr = ( uint32_t ) tx_buf ;
45 DMA_InitStruct . DMA_DIR = DMA_DIR_PeripheralDST ;
46 DMA_InitStruct . DMA_BufferSize = BUFSIZE ;
47 DMA_InitStruct . DMA_PeripheralInc = DMA_PeripheralInc_Disable ;
48 DMA_InitStruct . DMA_MemoryInc = DMA_MemoryInc_Enable ;
49 DMA_InitStruct . DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte ;
50 DMA_InitStruct . DMA_MemoryDataSize = DMA_MemoryDataSize_Byte ;
51 DMA_InitStruct . DMA_Mode = DMA_Mode_Normal ;
52 DMA_InitStruct . DMA_Priority = DMA_Priority_High ;
53 DMA_InitStruct . DMA_M2M = DMA_M2M_Disable ;
54 DMA_Init ( DMA1_Channel4 , & DMA_InitStruct ); //usart1_tx
55
56 USART_DMACmd ( USART1 , USART_DMAReq_Tx , ENABLE );
57 USART_Cmd ( USART1 , ENABLE );
58 DMA_Cmd ( DMA1_Channel4 , ENABLE );
59
60 }
定义数据为的长度
#define USART WondLength 8b
#define USART_WordLength_9b
定于停止位,一般使用1
 #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)
#define IS_USART_STOPBITS (STOPBITS) (((STOPBITS) USART_StopBits_1) II\ 3 ( (STOPBITS) USART_StopBits_0_5) II\ ( (STOPBITS) USART_StopBits_2) II\ 5 ((STOPBITS) USART_StopBits_1_5))
选择校验的方式 8不验证,取得1个字节的数据
#define USART_Parity_NoI ((uint16_t) Ox0000)
#define USART_Parity_Even //奇校验
#define USART_Parity_Odd ((uint16_t) 0x0400) ((uint16_t) 0x0600)  偶校验
#define IS_USART_PARITY (PARITY) (((PARITY) USART_Parity_No) II\ ((PARITY) USART_Parity_Even) II \ ((PARITY) USART_Parity_Odd)) @}
/** @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)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\
                              (((CONTROL) == USART_HardwareFlowControl_None) || \
                               ((CONTROL) == USART_HardwareFlowControl_RTS) || \
                               ((CONTROL) == USART_HardwareFlowControl_CTS) || \
                               ((CONTROL) == USART_HardwareFlowControl_RTS_CTS))

/**
  * @}
  */ 选择串口的是受还是发,可以选择既可以收也可呀发

/** @defgroup USART_Mode 
  * @{
  */ 
  
#define USART_Mode_Rx                        ((uint16_t)0x0004)
#define USART_Mode_Tx                        ((uint16_t)0x0008)
#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00))

/** @defgroup USART_Hardware_Flow_Control 
  * @{流空,一边选择USART_HardwareFlowControl_None      不留空
  */ 
#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)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\
                              (((CONTROL) == USART_HardwareFlowControl_None) || \
                               ((CONTROL) == USART_HardwareFlowControl_RTS) || \
                               ((CONTROL) == USART_HardwareFlowControl_CTS) || \
                               ((CONTROL) == USART_HardwareFlowControl_RTS_CTS))

//使能

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

//中断

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
 

4.3.2、串口DMA接收
串口接收不定长数据:使用串口空闲中断方式,判断一次通信的结束。
要进行串口的数据收发:1、创建通用gpio口,这个gpio口复用为串口,所以首先要初始化gpio口,然后进行串口的初始化,我们使用串口1,我们首先要使能时钟,我们要开启复用功能的时钟使能,同时开启gpio口的时钟使能,首先我们要看串口1对应的gpio口是哪个,引脚对应的那个引脚,查找对应关系,就要打开串口对应手册 开启gpio时钟使能包括复用功能的开启和gpioa端口的时钟,串口1的时钟
接下来配置gpio口,配置gpio9就是发送引脚;gpio10是接受引脚
配置串口USART_Init初始化串口,配置为串口1,第二个参数是串口的初始化结构体
配置中断
串口的使能
在main函数中调用串口初始化函数,传入波特率
调用格式化输出函数来完成数据的输出 等待用户发送完成的标志,把这个数据发送出去,send的方式一个字节往外发送
编译代码
没有错误编译成功
下载数据到单片机中
接着打开串口助手 pc链接usb,接的时候通过一个u转串芯片把单片机的utl信号转换成电脑usb能够识别的信号,我们通过串口调试助手来跟STM32单片机进行通信 接受数据 串口接受函数,接收到用户接受数据串口函数被触发时候,调用接收数据的函数,把数据存入到队列中

相关推荐

  1. STM32串口IAP

    2024-04-04 14:50:01       37 阅读
  2. STM32——串口实践

    2024-04-04 14:50:01       24 阅读
  3. stm32 串口配置

    2024-04-04 14:50:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-04 14:50:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-04 14:50:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-04 14:50:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-04 14:50:01       18 阅读

热门阅读

  1. LeetCode hot100-21

    2024-04-04 14:50:01       14 阅读
  2. 3459: 【PY】A+B问题

    2024-04-04 14:50:01       14 阅读
  3. python中map()函数的使用

    2024-04-04 14:50:01       14 阅读
  4. 【数据结构与算法】动态规划

    2024-04-04 14:50:01       12 阅读
  5. Day20.

    2024-04-04 14:50:01       12 阅读
  6. LocalDateTime 前后端传输问题

    2024-04-04 14:50:01       11 阅读
  7. 从零开始学RSA:低加密指数攻击2

    2024-04-04 14:50:01       11 阅读