STM32F4——串口(USART)通信总结

一、概述:

    USART即通用同步异步收发器,用于灵活的与外部设备全双工数据交换,它支持多种通信传输方式,可以通过小数波特率发生器提供多种波特率。

二、串口IO:

    对于STM32F407有6个串口,对于每个串口对应的IO可以从芯片原理图中对应找到,对于其串口1,对应的IO为PA9/PB6端口对应串口1的发送端,PA10/PB7端口对应串口1的接收端。

三、通信参数:

    对于数据的传输需要设定好相关的数据传输协议,因此必要的参数设定是有必要的,其中包括:起始位、数据位(8位或9位)、奇偶校验位(开启与否)、停止位(1、1.5、2位)、波特率设定。

四、相关寄存器:

    其中相关寄存器有:状态寄存器、数据寄存器、波特率寄存器、控制寄存器1、控制寄存器2、控制寄存器3、保护时间和预分频寄存器;下边简单分析一下前三个寄存器。

    1、状态寄存器:

  • 8
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
实现stm32f4串口屏的通信需要以下几个步骤: 1. 配置串口:首先需要配置stm32f4串口通信,包括串口波特率、据位、停止位和校验位等参。 2. 初始化串口:使用HAL库或者底层驱动代码初始化串口,使串口能够正常工作。 3. 发送据:使用串口发送据给串口屏,可以使用printf函或者HAL库提供的串口发送函等。 4. 接收据:接收串口屏返回的据,可以使用HAL库提供的串口接收函等。 5. 处理据:根据串口屏返回的据进行相应的处理,例如更新显示内容等。 以下是一个简单的示例代码,实现了stm32f4串口屏的通信: ```c #include <stdio.h> #include "stm32f4xx.h" #define LCD_WIDTH 320 #define LCD_HEIGHT 240 void init_uart(void); void send_cmd(uint8_t cmd); void send_data(uint8_t data); void lcd_clear(void); void lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color); void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); int main(void) { uint16_t i; // 初始化串口 init_uart(); // 清屏 lcd_clear(); // 画线 lcd_draw_line(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1, 0xFFFF); lcd_draw_line(0, LCD_HEIGHT - 1, LCD_WIDTH - 1, 0, 0xFFFF); while (1) { // 等待串口屏返回据 while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); uint8_t data = USART_ReceiveData(USART2); // 处理据 switch (data) { case 0x01: // 清屏 lcd_clear(); break; case 0x02: // 画线 uint16_t x1, y1, x2, y2, color; // 接收参 while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); x1 = USART_ReceiveData(USART2); while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); x1 |= USART_ReceiveData(USART2) << 8; while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); y1 = USART_ReceiveData(USART2); while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); y1 |= USART_ReceiveData(USART2) << 8; while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); x2 = USART_ReceiveData(USART2); while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); x2 |= USART_ReceiveData(USART2) << 8; while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); y2 = USART_ReceiveData(USART2); while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); y2 |= USART_ReceiveData(USART2) << 8; while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); color = USART_ReceiveData(USART2); while (!USART_GetFlagStatus(USART2, USART_FLAG_RXNE)); color |= USART_ReceiveData(USART2) << 8; // 画线 lcd_draw_line(x1, y1, x2, y2, color); break; default: break; } } } void init_uart(void) { GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; // 使能USART2和GPIOA的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置PA2为TX和PA3为RX GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置USART2 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStruct); // 使能USART2 USART_Cmd(USART2, ENABLE); } void send_cmd(uint8_t cmd) { while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); USART_SendData(USART2, 0x00); while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); USART_SendData(USART2, cmd); } void send_data(uint8_t data) { while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); USART_SendData(USART2, 0x01); while (!USART_GetFlagStatus(USART2, USART_FLAG_TXE)); USART_SendData(USART2, data); } void lcd_clear(void) { send_cmd(0x01); } void lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color) { send_cmd(0x02); send_data(x & 0xFF); send_data((x >> 8) & 0xFF); send_data(y & 0xFF); send_data((y >> 8) & 0xFF); send_data(color & 0xFF); send_data((color >> 8) & 0xFF); } void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { send_cmd(0x03); send_data(x1 & 0xFF); send_data((x1 >> 8) & 0xFF); send_data(y1 & 0xFF); send_data((y1 >> 8) & 0xFF); send_data(x2 & 0xFF); send_data((x2 >> 8) & 0xFF); send_data(y2 & 0xFF); send_data((y2 >> 8) & 0xFF); send_data(color & 0xFF); send_data((color >> 8) & 0xFF); } ``` 在上面的代码中,我们使用了USART2串口串口通信,通过调用send_cmd和send_data两个函来发送据。lcd_clear、lcd_draw_pixel和lcd_draw_line三个函分别对应串口屏的清屏、画点和画线指令。在主函中,我们使用了一个while循环来等待串口屏返回据,并根据据进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值