STM32F407 串口编程USART1,USART2,USART3,UART4

2023-05-16

串口设置的一般步骤可以总结为如下几个步骤: 
1)  串口时钟使能,GPIO时钟使能。 
2)  设置引脚复用器映射:调用GPIO_PinAFConfig函数。 
3)  GPIO初始化设置:要设置模式为复用功能。 
4)  串口参数初始化:设置波特率,字长,奇偶校验等参数。 
5)  开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。 
6)  使能串口。 
7)  编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。 

我们通过USART3简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文件中。 

1)  串口时钟和GPIO时钟使能。 

串口是挂载在APB1下面的外设,所以使能函数为: 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟 

GPIO时钟使能,就非常简单,串口3对应着芯片引脚PB10,PB11。所以这里我们只需要使能GPIOB时钟即可: 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟 

2)  设置引脚复用器映射 

引脚复用器映射配置,调用函数为: 
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //PB10复用为USART3 
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);//PA11复用为USART3 

因为串口使用到PB10,PB11,所以我们要把PB10和PB11都映射到串口3。所以这里我们要调用两次函数。

 
 对于GPIO_PinAFConfig函数的第一个和第二个参数很好理解,就是设置对应的IO口,如果是PB10那么第一个参数是GPIOB,第二个参数就是GPIO_PinSource10。第二个参数,实际我们不需要去记忆,只需去相应的配置文件找到外设对应的AF配置宏定义标识符即可,串口3为GPIO_AF_USART3。 


3)  GPIO端口模式设置:PA9和PA10要设置为复用功能。 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10与GPIOB11 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 

4)  串口参数初始化:设置波特率,字长,奇偶校验等参数 

串口初始化是调用函数USART_Init来实现的,具体设置方法如下: 
USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; 
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 
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_Init(USART3, &USART_InitStructure); //初始化串口 

5)  使能串口 

使能串口调用函数USART_Cmd来实现,具体使能串口3方法如下: 
USART_Cmd(USART3, ENABLE);    //使能串口 

6)  串口数据发送与接收。 

STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包
含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。   
STM32库函数操作USART_DR寄存器发送数据的函数是: 
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 
通过该函数向串口寄存器USART_DR写入一个数据。 
STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: 
uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 
通过该函数可以读取串口接受到的数据。

7)  开启中断并且初始化NVIC,使能相应中断 

  这一步如果我们要开启串口中断才需要配置NVIC中断优先级分组。通过调用函数
NVIC_Init来设置。 
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;    //响应优先级3 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //IRQ 通道使能 
NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化VIC寄存器、 

同时,我们还需要使能相应中断,使能串口中断的函数是: 
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,  
FunctionalState NewState) 

这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: 
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 
我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: 
USART_ITConfig(USART3,USART_IT_TC,ENABLE); 
这里还要特别提醒,因为我们实验开启了串口中断,所以我们在系统初始化的时候需要先设置
系统的中断优先级分组,我们是在我们main函数开头设置的,代码如下: 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 
我们设置分组为2,也就是2位抢占优先级,2位响应优先级。 

8)  获取相应中断状态 

当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:   
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 
比如我们使能了串口发送完成中断,那么当中断发生了,  我们便可以在中断处理函数中调用这
个函数来判断到底是否是串口发送完成中断,方法是: 
USART_GetITStatus(USART3, USART_IT_TC) 
返回值是SET,说明是串口发送完成中断发生。 

9)   中断服务函数 

  串口1中断服务函数为: 
void USART3_IRQHandler(void) ; 
当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可

10)  初始化代码


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F407 串口编程USART1,USART2,USART3,UART4 的相关文章

  • KEIL5 调试STM32F407 停在LDR R0=SystemInit,不能进入main()函数

    点击魔术棒 xff0c 点击Debug 点击Setting Reset不要用Autodetect xff0c 选择SYSRESETREQ
  • STM32F407-用TB6600驱动器驱动57步进电机(代码+连线)

    一 硬件 1 硬件准备 57步进电机 xff08 型号57CM18 xff09 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 2 电气特性 3 连线 驱动器右边分有两个区域 Signal xff1a 用于驱动
  • stm32串口一直进USART1_IRQHandler

    今天在使用USART模块 xff0c 遇到了一些问题并解决了 xff0c 于是发贴共享 问题描述 xff1a 在使用USART做串口通讯时 xff0c 我只把接收中断打开 xff0c 并设置抢占优先级为最低一个级别 xff0c 而接收中断上
  • STM32F407-跑马灯

    硬件准备 xff08 STM32F407ZGT6 xff09 1 初始准备 1 1打开Template模板 xff0c 在工程目录下新建HARDWARE文件夹 1 2 新建在HARDWARE路径中新建led c led h两个文件 xff0
  • STM32F407-限位金属传感器限制步进电机

    一 硬件 1 硬件准备 xff1a 57步进电机 xff08 型号57CM18 xff09 xff0c 42步进电机 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 xff0c SN 4NDO限位金属传感器 x
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • STM32F407__串口转422总线__一主多从通信

    从机的422原理图如下所示 xff1a 主机的422原理图 xff1a 一 通信大体原理 在通信过程中 xff0c 主机向总线上发送数据 xff0c 从机都能从总线上接收到数据 xff0c 根据设置的地址 xff0c 选在是否是本板需要的数
  • stm32f407 FreeRTOS+LVGL移植

    参考资料 xff1a 正点原子 littleVGL 开发指南 正点原子 STM32F407 FreeRTOS 开发指南 硬件平台 xff1a stm32f407开发板 xff08 或最小系统 xff09 4 3寸TFTLCD 以正点原子的例
  • Stm32 hal库 usart2与hc-08透传模块通讯

    Stm32 hal库 usart2与hc 08透传模块通讯 xff08 附数据解析 xff09 一 stm32cubeMX配置 1 配置RCC为外部晶振 2 配置时钟树 3 配置usart1 usart2 xff0c 其中usart1将作为
  • STM32F407 Flash操作笔记

    简述 STM32F4XX的闪存擦除方式分为两种 xff1a 扇区擦除 xff08 最小单元16K xff09 和整片擦除 在实际应用中 xff0c 为满足重要信息的存储 xff0c 需将信息存入FLASH中 xff0c 针对以上两种擦除方式
  • STM32F407 串口编程USART1,USART2,USART3,UART4

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO时钟使能 2 设置引脚复用器映射 xff1a 调用GPIO PinAFConfig函数 3 GPIO初始化设置 xff1a 要设置模式为复用功能 4
  • STM32F407的UART4配置

    复用PC10 PC11作为串口四的TX RX void uart4 init u32 bound GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructu
  • 成功解决keil识别不到单片机芯片,下载不了程序

    成功解决keil识别不到单片机芯片 下载不了程序 我的芯片是STM32F429 正点原子的阿波罗 今天使用开发板做实验 突然找不到芯片了 以前下载的PWM波也运行不了 查找了好久 原来是芯片锁了 终于解决了 我是第二种办法实现给芯片解锁的
  • Micropython应用篇一--下载文件到F407VE Black开发板及开发板启动Flash选取

    Micropython应用篇一 下载文件到F407VE Black开发板及开发板启动选取 各位客官老爷们 咱又见面了 本来准备直接上例程来着 但由于怕各位老爷们对STM32的熟悉程度不一致 所以来一篇关于程序烧录及开发板启动 25Q128
  • PID算法与PID自整定算法

    PID算法与PID自整定算法 本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed
  • USR-WIFI232-B2(WIFI)模块没有和服务器TCP连接成功时,单片机读取USR-WIFI232-B2(WIFI)模块的MAC地址

    您想要实现什么功能 1 单片机上电后先读取WIFI模块的MAC地址 2 读取完WIFI模块的MAC地址的后 WIFI模块和上位机进行TCP通信 WIFI模块作为服务器 需要发送 a 进入AT指令配置状态 读取MAC 读取之后 发送AT EN
  • Micropython应用篇四---F407VE Black开发板IIC OLED1306

    Micropython应用篇四 F407VE Black开发板IIC OLED1306显示 最近一段时间做Keil例程比Micropython多很多 无论如何 Micropython Arduino作为嵌入式入门篇也发过一些文章 包括公司的
  • 单片机串口实现字符串命令解析---使用函数指针(类似哈希表)

    通常情况下串口通信用的大多数都是用十六进制数据来传输指令 比如最常见的modbus的通信 如读保持寄存器指令 01 03 00 00 00 01 84 0A 这种十六进制的指令在这里就不讨论了 想要详细了解可以看往期的文章 串口相关文章链接
  • STM32F407 USART3串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • Micropython开发篇三--基于F411 CE的移植编译

    Micropython开发篇三 基于F411 CE的移植编译 最近在学操作系统 RTOS与Linux 对Micropython有些新的认知 回头又复习了一下Micropython 简直要不要这么优秀 希望通过这篇文章能带给大家不一样的Mic

随机推荐