【全球报资讯】STM32F407 串口配置步骤
时间:2023-07-06 15:11:22 来源:DS小龙哥-嵌入式技术
介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向。
(资料图)
STM32F407 串口配置说明
STM32F4 的串口资源相当丰富的,功能也相当强劲,STM32F407ZGT6 最多可提供 6 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。
【1】串口硬件引脚分析【2】串口复用引脚介绍串口寄存器介绍在手册第26章
GPIO口复用功能引脚配置
F407串口对应的引脚
配置复用功能的寄存器
串口时钟频率配置分析
【3】串口1配置示例Usart.c代码示例:
#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代码示例
#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代码示例
#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文件增加代码:
#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代码示例
#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代码示例
#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文件代码示例:
#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文件示例审核编辑:汤梓红
标签:
最新文章推荐
- 【全球报资讯】STM32F407 串口配置步骤
- 环球今日讯!8股获基金调研 怡和嘉业最受关注
- 当前速读:荣耀X50开启预售:5800mAh电池
- NBA夏联灰熊轻取雷霆:拉拉维亚18中9,霍姆格伦两双曼恩空砍28分
- 安徽持续推进岗位开拓 促进毕业生就业 保障合法权益|世界速看
- 焦点快播:年营收超20亿,靠卖减肥药起家的壹健康,冲刺港股上市
- 电脑插上手柄蓝屏怎么办 头条焦点
- 苹果降级通道查询网站(苹果降级) 天天看热讯
- 港股稀土概念走弱,中国稀土跌近8%
- 全球视点!特斯拉Model Y在冰岛打破丰田卡罗拉35年前创下的年度销量纪录
- 世界头条:迈拓股份7月6日盘中跌幅达5%
- 兰博基尼燃油车被抢购一空 混合动力车型成为未来发展趋势|热闻
- 爱奇艺回应限免剧集中夹杂收费集,企鹅FM将停止运营,供应商透露小米汽车最新进展,苹果回应头显减产,这就是今天的其他大新闻!
- 【调研快报】中科三环接待开源证券等多家机构调研_世界即时
- 追寻“宁波帮”精神 84名香港青年走进“东方大港”探发展_环球最资讯
- 天启影院2022最新电视剧在线看(3070天启和3070魔龙哪个好)
- 2023开封市中心医院三伏贴贴敷时间 天天视讯
- 环球热议:7月5日特力A发布公告,其股东减持431.06万股
- 中国专家表示新疆女性不断突破重重束缚实现个人解放与现代化发展_焦点观察
- 阳信县洋湖乡网格员深入田间地头助力秸秆禁烧_世界焦点
- 大宗交易:福立旺成交1216万元,折价1.50%(07-05)_环球观热点
- 今日看点:莆田黄瓜渔村:改造提升 迈向新生
- 湘电股份:上半年净利润预增45.08%到64.68%-全球消息
- 礼赞新时代!老年摄影大赛开启,晒出您的银龄生活
- 当前讯息:非承载式车身+四驱!全新一代哈弗H5官图曝光
- 超长续航+强悍性能,问界M5纯电版打破纯电车型刻板认知|环球热门
- 世界热消息:上好“有形锁”“制度锁”“意识锁”
- 环球即时看!山河四省共建“山河大学” 可行性到底有多大?|豫观察
- “双争”光荣榜|李洁翔:残障志愿者热心公益 累计服务超4000小时_当前观点
- 洛阳姑娘徐和媛:飞针走线“赶潮” 只为至“扇”至美_世界最新
X 关闭
资讯中心

2022-09-16
新疆(含兵团)15日新增本土无症状感染者1例
2021-10-18

2021-10-18

2021-10-18
X 关闭