介绍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< apb2enr|=1< apb2rstr|=1< apb2rstr&=~(1< moder&=~(0x3< moder|=0x2< moder&=~(0x3< moder|=0x2< otyper&=~(0x1< ospeedr&=~(0x3< ospeedr|=0x2< pupdr&=~(0x3< pupdr|=0x1< afr[1]&=~(0xf< afr[1]|=0x7< afr[1]&=~(0xf< afr[1]|=0x7< brr=(clock*1000000)/baud;//配置波特率 usart1- >cr1|=1< cr1|=1< cr1|=1< dr=*str; while(!(usartx- >sr&1< sr&1< 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< apb2enr|=1< apb2rstr|=1< apb2rstr&=~(1< moder&=~(0x3< moder|=0x2< moder&=~(0x3< moder|=0x2< otyper&=~(0x1< ospeedr&=~(0x3< ospeedr|=0x2< pupdr&=~(0x3< pupdr|=0x1< afr[1]&=~(0xf< afr[1]|=0x7< afr[1]&=~(0xf< afr[1]|=0x7< brr=(clock*1000000)/baud;//配置波特率 usart1- >cr1|=1< cr1|=1< cr1|=1< cr1|=1< dr=*str; while(!(usartx- >sr&1< dr=c; //发送一个字符 while(!(usart1- >sr&1< sr&1< dr; } /* 函数功能:串口1的中断服务函数 */ void usart1_irqhandler(void) { u8 data; if(usart1- >sr&1< 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文件示例
何为有效值?何为均方根?
车载功放的低音增强功能
PADS LOGIC的导入功能
嵌入式的由来和发展
变电站智能巡检机器人的作用及功能
STM32F407 串口配置步骤
中国人民大学孟小峰教授团队发布2018中国隐私风险指数
特斯拉全球第500万辆整车下线 本土化率超过95%
海天雄电子DJ-AA40IE工业主板简介
基于rockwell自动化PLC的风力发电通讯系统
科创板中微公司创始人及高管信息大全
智能手机屏幕的触控效果是如何实现的
卫星通信v2 第七章 仿真与实战(3)SCA
黄淮学院采购DZ-DSC300C 差示扫描量热仪
稚晖君刚拿了百度投资 市场估值十几亿美元左右
人工智能和机器学习技术能为威胁检测做什么?
MEMS器件国产化践行者——知芯传感宣布重磅搬迁,助力国产MEMS器件行业腾飞!
Uber事件调查有了新进展,Uber自动驾驶软件可能是导致此次事故的原因
如何构建锂离子电池管理系统
服务机器人有望成为下一代计算平台服务各行各业,进入千家万户