Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STM32F407 串口配置步骤

STM32F407 串口配置步骤

作者头像
DS小龙哥
发布于 2023-07-08 12:08:26
发布于 2023-07-08 12:08:26
65200
代码可运行
举报
运行总次数:0
代码可运行

介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向。

STM32F407 串口配置说明

STM32F4 的串口资源相当丰富的,功能也相当强劲,STM32F407ZGT6 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA 等。

【1】串口硬件引脚分析

【2】串口复用引脚介绍

串口寄存器介绍在手册第26章

GPIO口复用功能引脚配置

F407串口对应的引脚

配置复用功能的寄存器

串口时钟频率配置分析

【3】串口1配置示例

Usart.c代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "usart.h"

/*
函数功能:串口1初始化
函数形参:
				 u32 clock   :时钟频率(默认*1000000HZ)  注意:APB1最大时钟频率为42MHZ  APB2最大时钟频率为84MHZ
				 u32 baud :波特率
硬件连接:
PA9--->TX
PA10-->RX
*/
void USART1_Init(u32 clock,u32 baud)
{
		/*1. 开时钟*/
		RCC->AHB1ENR|=1<<0;			//使能PORTA时钟
		RCC->APB2ENR|=1<<4;			//使能USART1时钟
		
		/*2. 复位串口时钟*/
		RCC->APB2RSTR|=1<<4; 		//使能USART1复位时钟
		RCC->APB2RSTR&=~(1<<4); //关闭USART1复位时钟
		
		/*3. 配置GPIO口模式*/
	  GPIOA->MODER&=~(0x3<<9*2); //清除模式
		GPIOA->MODER|=0x2<<9*2;    //配置复用功能模式
	
		GPIOA->MODER&=~(0x3<<10*2); //清除模式
		GPIOA->MODER|=0x2<<10*2;    //配置复用功能模式
	
		GPIOA->OTYPER&=~(0x1<<9); 	 //0表示推挽输出
		
		GPIOA->OSPEEDR&=~(0x3<<9*2); //清除之前配置
		GPIOA->OSPEEDR|=0x2<<9*2;    //50MHZ输出速度
		
		GPIOA->PUPDR&=~(0x3<<10*2); //清除之前配置
		GPIOA->PUPDR|=0x1<<10*2;    //配置上拉
		
		GPIOA->AFR[1]&=~(0xF<<4*1); //清除PA9配置
		GPIOA->AFR[1]|=0x7<<4*1;    //配置PA9复用功能模式为串口1
		
		GPIOA->AFR[1]&=~(0xF<<4*2); //清除PA10配置
		GPIOA->AFR[1]|=0x7<<4*2;    //配置PA10复用功能模式为串口1
		
		/*4. 配置USART-CR寄存器*/
		USART1->BRR=(clock*1000000)/baud;//配置波特率
		USART1->CR1|=1<<3;  //使能发送
		USART1->CR1|=1<<2;  //使能接收,并开始搜寻RX引脚上的起始位
		USART1->CR1|=1<<13; //USART模块使能。
}


/*
函数功能:串口字符串发送
函数形参:
	USART_TypeDef *USARTx :串口的类型 (USART1 USART2 USART3)
	u8 *str:将要发送的字符串
*/
void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
{
	while(*str!='\0')
	{
			USARTx->DR=*str;
		  while(!(USARTx->SR&1<<7)){} //等待发送完成
			str++;
	}
}

Usart.h代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef USART_H
#define USART_H
#include "stm32f4xx.h"
void USART1_Init(u32 clock,u32 baud);
void USARTxSendString(USART_TypeDef *USARTx,u8 *str);
#endif

Main.c代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
int main(void)
{
		u8 key,i,c;
		LED_Init();
		KEY_Init();
		USART1_Init(84,115200);
		while(1)
		{
			 key=ScanKeyVal(0);
			 if(key)
			 {
				  i=!i;
					LED0(i);
				  LED1(i);
					USARTxSendString(USART1,"万邦易嵌嵌入式开发!\r\n");
			 }
			 
			 if(USART1->SR&1<<5) //接收到数据
			 {
					 c=USART1->DR;
					 USART1->DR=c; 	//将接收到的数据原路返回
			 }
		}
}

【4】串口标准输入输出重定向

Usart.c文件增加代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "usart.h"

/*
函数功能:串口1初始化
函数形参:
				 u32 clock   :时钟频率(默认*1000000HZ)  注意:APB1最大时钟频率为42MHZ  APB2最大时钟频率为84MHZ
				 u32 baud :波特率
硬件连接:
PA9--->TX
PA10-->RX
*/
void USART1_Init(u32 clock,u32 baud)
{
		/*1. 开时钟*/
		RCC->AHB1ENR|=1<<0;			//使能PORTA时钟
		RCC->APB2ENR|=1<<4;			//使能USART1时钟
		
		/*2. 复位串口时钟*/
		RCC->APB2RSTR|=1<<4; 		//使能USART1复位时钟
		RCC->APB2RSTR&=~(1<<4); //关闭USART1复位时钟
		
		/*3. 配置GPIO口模式*/
	  GPIOA->MODER&=~(0x3<<9*2); //清除模式
		GPIOA->MODER|=0x2<<9*2;    //配置复用功能模式
	
		GPIOA->MODER&=~(0x3<<10*2); //清除模式
		GPIOA->MODER|=0x2<<10*2;    //配置复用功能模式
	
		GPIOA->OTYPER&=~(0x1<<9); 	 //0表示推挽输出
		
		GPIOA->OSPEEDR&=~(0x3<<9*2); //清除之前配置
		GPIOA->OSPEEDR|=0x2<<9*2;    //50MHZ输出速度
		
		GPIOA->PUPDR&=~(0x3<<10*2); //清除之前配置
		GPIOA->PUPDR|=0x1<<10*2;    //配置上拉
		
		GPIOA->AFR[1]&=~(0xF<<4*1); //清除PA9配置
		GPIOA->AFR[1]|=0x7<<4*1;    //配置PA9复用功能模式为串口1
		
		GPIOA->AFR[1]&=~(0xF<<4*2); //清除PA10配置
		GPIOA->AFR[1]|=0x7<<4*2;    //配置PA10复用功能模式为串口1
		
		/*4. 配置USART-CR寄存器*/
		USART1->BRR=(clock*1000000)/baud;//配置波特率
		USART1->CR1|=1<<3;  //使能发送
#ifdef USART1_INTERRUPT
		USART1->CR1|=1<<5;  //开启串口接收中断
		SetNVICPriorityGrouping(USART1_IRQn,1,3); //设置中断优先级	
#endif
		USART1->CR1|=1<<2;  //使能接收,并开始搜寻RX引脚上的起始位
		USART1->CR1|=1<<13; //USART模块使能。
}


/*
函数功能:串口字符串发送
函数形参:
	USART_TypeDef *USARTx :串口的类型 (USART1 USART2 USART3)
	u8 *str:将要发送的字符串
*/
void USARTxSendString(USART_TypeDef *USARTx,u8 *str)
{
	while(*str!='\0')
	{
		USARTx->DR=*str;
		while(!(USARTx->SR&1<<7)){} //等待发送完成
		str++;
	}
}


/*
函数功能:重写printf底层函数接口
*/
int fputc(int c,FILE *stream)
{
	  USART1->DR=c; //发送一个字符
	  while(!(USART1->SR&1<<7)){}
		return c;
}


/*
函数功能:重新scanf底层函数接口
*/
int fgetc(FILE *stream) 
{
	  while(!(USART1->SR&1<<5)){}
    return USART1->DR;
}


/*
函数功能:串口1的中断服务函数
*/
void USART1_IRQHandler(void)
{
	  u8 data;
		if(USART1->SR&1<<5)
		{
				 data=USART1->DR;
			   USART1->DR=data;
		}
}

Main.c代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
int main(void)
{
		u8 i;
		u8 buff[100];
		LED_Init();
		KEY_Init();
		USART1_Init(84,115200);
		while(1)
		{
				i=!i;
				LED0(i);
				LED1(i);
				printf("STM32F407串口测试!\r\n");
				printf("请输入数据按回车键结束: (串口软件需要勾选发送新行)\r\n");
				scanf("%s",buff);
				printf("你输入的数据为:%s\r\n\r\n\r\n",buff);
		}
}

第一步需要先编写设置中断优先级的函数:

sys.c代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "sys.h"
/*
函数功能:设置NVIC中断控制器优先级
函数形参:
		IRQn_Type IRQn:中断线
		uint32_t PreemptPriority:抢占优先级
		uint32_t SubPriority:次优先级
*/
void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority)
{
	 uint32_t Priority;
	 NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2); //设置优先级分组,每个工程只能设置一次
   Priority=NVIC_EncodePriority(NVIC_PriorityGroup_2,PreemptPriority,SubPriority); //编码优先级
   NVIC_SetPriority(IRQn,Priority); //设置优先级
   NVIC_EnableIRQ(IRQn);
}

Sys.h文件代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef _SYS_H
#define _SYS_H
#include "stm32f4xx.h"
/*中断控制器分组*/
#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */

/**
@code  
 The table below gives the allowed values of the pre-emption priority and subpriority according
 to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
  ============================================================================================================================
    NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  | Description
  ============================================================================================================================
   NVIC_PriorityGroup_0  |                0                  |            0-15             |   0 bits for pre-emption priority
                         |                                   |                             |   4 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------
   NVIC_PriorityGroup_1  |                0-1                |            0-7              |   1 bits for pre-emption priority
                         |                                   |                             |   3 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_2  |                0-3                |            0-3              |   2 bits for pre-emption priority
                         |                                   |                             |   2 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_3  |                0-7                |            0-1              |   3 bits for pre-emption priority
                         |                                   |                             |   1 bits for subpriority
  ----------------------------------------------------------------------------------------------------------------------------    
   NVIC_PriorityGroup_4  |                0-15               |            0                |   4 bits for pre-emption priority
                         |                                   |                             |   0 bits for subpriority                       
  ============================================================================================================================
@endcode
*/
void SetNVICPriorityGrouping(IRQn_Type IRQn,uint32_t PreemptPriority, uint32_t SubPriority);
#endif

Usart.c文件示例

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
物联网网调试终端:https://download.csdn.net/download/xiaolong1126626497/12624530
DS小龙哥
2022/01/17
2.5K1
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
STM32笔记之 NVIC(嵌套向量中断控制器)[通俗易懂]
写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
全栈程序员站长
2022/09/02
2.4K0
STM32F407 GPIO口输入配置配置步骤
介绍STM32F407新建寄存器工程流程,介绍输入模式的配置方式,以按键为例完成按键输入检测。
DS小龙哥
2023/07/08
3880
STM32F407 GPIO口输入配置配置步骤
STM32F407实现NEC协议红外线解码
NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。
DS小龙哥
2023/07/08
1K1
STM32F407实现NEC协议红外线解码
STM32F407 基本定时器配置输出PWM方波
介绍STM32F407定时器PWM波形输出配置方式。 通过逻辑分析采集波形数据进行可视化显示对比。
DS小龙哥
2023/07/08
1.6K0
STM32F407 基本定时器配置输出PWM方波
STM32F407 位带配置步骤
介绍STM32F407位带操作方法,设置寄存器的偏移量,实现按GPIO口指定位进行读写操作,方便编程。
DS小龙哥
2023/07/08
2970
STM32F407 位带配置步骤
STM32F103RCT6+串口DMA方式接收定长数据
知否知否应是绿肥红瘦
2025/02/19
2150
STM32F103RCT6+串口DMA方式接收定长数据
STM32-USART串口通信【USART和UART的区别】[通俗易懂]
这里只记主要关于STM32应用,不记原理,关于所有通信相关的物理和协议层面的详细知识总结将会放在【通信协议】专栏。
全栈程序员站长
2022/08/31
3.6K0
STM32F407-USART1+DMA收发
用户11186929
2024/07/01
2280
stm32_DMA采集一个AD数据_并通过DMA向串口发送
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
杨奉武
2018/04/18
1.1K0
stm32_DMA采集一个AD数据_并通过DMA向串口发送
【STM32】串口通信---用代码与芯片对话
文章目录 前言 一、串口通信基本知识 二、编程思路 usart.h usart.c main.c 宏定义 三、总结 前言 开发板:stm32f407VET6 开发环境:keil5 MDK 一、串口通信基本知识 【STM32】5分钟了解STM32的串口通信 二、编程思路 usart.h // ============================================= # @Time : 2020-09-03 # @Author : AXYZdong # @CSDN : http
AXYZdong
2020/11/05
8860
STM32F407 滴答定时器
DS小龙哥
2023/07/08
4740
STM32F407 滴答定时器
串口USART和UART「建议收藏」
UART是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接受。UART主要用于主机与辅助设备通信。
全栈程序员站长
2022/08/31
2.4K0
STM32—无需中断来实现使用DMA接收串口数据
诺谦
2018/01/03
4.2K0
STM32—无需中断来实现使用DMA接收串口数据
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。**改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。**因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。 传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
全栈程序员站长
2022/08/23
9.1K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
STM32F103系列串口1中断回显
用户11186929
2024/07/01
1180
STM32串口1的收发配置
串口是一种可以让两个设备之间进行收发数据的接口,发送和接收共用的可编程波特率,最高达4.5Mbits/s,波特率越高数据传输速度越快,支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。
皓琦
2023/12/28
4100
STM32F103学习笔记三 串口通信
本文参照正点原子STM32F1xx官方资料:《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 及 【STM32】串口通信基本原理(超基础、详细版) 单片机入门学习十 STM32单片机学习七 串口通讯
全栈程序员站长
2022/11/07
2.2K0
STM32串口USART1的使用方法和程序
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信。
用户6754675
2020/12/04
1.6K0
(十三)STM32——串口通信(UART)
目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式  UART 特点 串口参数 通信流程 寄存器 USART_SR USART_DR  USART_BRR 过程 代码 运行结果 运行结果 遇到的问题 总结  ---- 学习目标         本节我们要学习的的是STM32的通信部分,主要介绍UART(通用异步收发器),是一种异步、全双工的通信方式。 内容         首先,我们先来介绍一下通信的基本知识,之前在51单片机的学习中我们也接触过UART,在此就不做详细介绍,感兴
小点点
2022/12/12
1.8K0
(十三)STM32——串口通信(UART)
推荐阅读
相关推荐
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验