你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 串口通信编程

[复制链接]
STMCU小助手 发布时间:2022-4-2 21:00
01. STM32F4串口简介
STM32F4 的串口资源相当丰富的,功能也相当强劲。ALIENTEK 探索者 STM32F4 开发板所使用的 STM32F407ZGT6 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、支持调制解调器操作、智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。

02. 硬件设计
串口 1 与USB 串口并没有在 PCB上连接在一起,需要通过跳线帽来连接一下。这里我们把 P6 的 RXD 和 TXD 用跳线帽与 PA9 和 PA10 连接起来。

RG~LE%RK_)U06CQONVEH{N2.png

03. 串口设置步骤
① 串口时钟使能,GPIO 时钟使能
② 设置引脚复用器映射
③ GPIO 端口初始化设置
④ 串口参数初始化
⑤ 初始化 NVIC 并且开启中断
⑥ 使能串口

串口时钟和GPIO时钟使能

  1.         //使能GPIO时钟 PA9  PA10
  2.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  3.         //使能USART时钟
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
复制代码

设置引脚复用器映射
  1.         //设置GPIO复用
  2.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  3.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
复制代码

GPIO端口初始化

  1.         //初始化GPIO
  2.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  3.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  4.         GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  5.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  6.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  7.         
  8.         GPIO_Init(GPIOA, &GPIO_InitStruct);
复制代码

串口初始化


  1.         //串口初始化
  2.         USART_InitStruct.USART_BaudRate = 115200;
  3.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  4.         USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  5.         USART_InitStruct.USART_Parity = USART_Parity_No;
  6.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
  7.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  8.         
  9.         USART_Init(USART1, &USART_InitStruct);
复制代码

使能串口
  1.         //使能串口
  2.         USART_Cmd(USART1, ENABLE);
复制代码

数据发送
  1. USART_SendData(USART1, 'A');
复制代码

数据接收

  1. ch = USART_ReceiveData(USART1);
复制代码

04. 程序示例一
通过串口发送数据

  1. #include "stm32f4xx.h"

  2. #include "delay.h"
  3. #include "led.h"
  4. #include "beep.h"
  5. #include "key.h"

  6. //Key0 控制LED1 Key1控制LED2
  7. int main(void)
  8. {
  9.         
  10.         GPIO_InitTypeDef GPIO_InitStruct;
  11.         
  12.         USART_InitTypeDef USART_InitStruct;
  13.         
  14.         //初始化
  15.         delay_init(168);
  16.         LED_Init();

  17.         //使能GPIO时钟 PA9  PA10
  18.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  19.         
  20.         //使能USART时钟
  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  22.         //设置GPIO复用
  23.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  24.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
  25.         
  26.         //初始化GPIO
  27.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  28.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  29.         GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  30.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  31.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  32.         
  33.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  34.         
  35.         //串口初始化
  36.         USART_InitStruct.USART_BaudRate = 115200;
  37.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  38.         USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  39.         USART_InitStruct.USART_Parity = USART_Parity_No;
  40.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
  41.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  42.         
  43.         USART_Init(USART1, &USART_InitStruct);
  44.         
  45.         //使能串口
  46.         USART_Cmd(USART1, ENABLE);
  47.         
  48.         //数据发送
  49.         while(1)
  50.         {
  51.                 USART_SendData(USART1, 'A');
  52.         
  53.                 delay_ms(1000);
  54.         }
  55.         
  56. }
复制代码

05. 程序示例二
通过串口接收数据

  1. #include "stm32f4xx.h"

  2. #include "delay.h"
  3. #include "led.h"
  4. #include "beep.h"
  5. #include "key.h"

  6. //Key0 控制LED1 Key1控制LED2
  7. int main(void)
  8. {
  9.         uint16_t ch;
  10.         
  11.         GPIO_InitTypeDef GPIO_InitStruct;
  12.         
  13.         USART_InitTypeDef USART_InitStruct;
  14.         
  15.         //初始化
  16.         delay_init(168);
  17.         LED_Init();

  18.         //使能GPIO时钟 PA9  PA10
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  20.         
  21.         //使能USART时钟
  22.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  23.         //设置GPIO复用
  24.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  25.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
  26.         
  27.         //初始化GPIO
  28.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  29.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  30.         GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  31.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  32.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  33.         
  34.         GPIO_Init(GPIOA, &GPIO_InitStruct);
  35.         
  36.         //串口初始化
  37.         USART_InitStruct.USART_BaudRate = 115200;
  38.         USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  39.         USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  40.         USART_InitStruct.USART_Parity = USART_Parity_No;
  41.         USART_InitStruct.USART_StopBits = USART_StopBits_1;
  42.         USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  43.         
  44.         USART_Init(USART1, &USART_InitStruct);
  45.         
  46.         //使能串口
  47.         USART_Cmd(USART1, ENABLE);
  48.         
  49.         //数据发送
  50.         while(1)
  51.         {
  52.                 ch = USART_ReceiveData(USART1);
  53.                 if (ch == '1')
  54.                 {
  55.                         LED1 = 1;
  56.                         LED2 = 1;
  57.                 }
  58.                 else if (ch == '0')
  59.                 {
  60.                         LED1 = 0;
  61.                         LED2 = 0;
  62.                 }
  63.         }
  64.         
  65. }
复制代码


收藏 评论0 发布时间:2022-4-2 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版