STM32单片机的复用端口初始化的步骤及方法

stm32有好几个串口。比如说stm32f103zet6有5个串口,串口1的引脚对应的io为pa9,pa10.pa9,pa10默认功能是gpio,所以当pa9,pa10引脚作为串口1的tx,rx引脚使用的时候,那就是端口复用。
复用端口初始化有几个步骤:
1) gpio端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);
2) 复用的外设时钟使能。比如你要将端口pa9,pa10复用为串口,所以要使能串口时钟。 rcc_apb2periphclockcmd(rcc_apb2periph_usart1, enable);
3) 端口模式配置。 在io复用位内置外设功能引脚的时候,必须设置gpio端口的模式,至于在复用功能下gpio的模式是怎么对应的,这个可以查看手册。
所以,我们在使用复用功能的是时候,最少要使能2个时钟:
1) gpio时钟使能 ;2) 复用的外设时钟使能 同时要初始化gpio以及复用外设功能
串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能,gpio时钟使能
2) 串口复位
3) gpio端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化nvic(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数
端口重映射:(暂略)
中断量控制:
stm32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这68个可屏蔽中断,但是stm32的68个可屏蔽中断,在stm32f103系列上面,又只有60个(在107系列才有68个)。
iser[2]:iser全称是:interrupt set-enable registers,这是一个中断使能寄存器组。
icer[2]:全称是:interrupt clear-enable registers,是一个中断除能寄存器组。
ispr[2]:全称是:interrupt set-pending registers,是一个中断挂起控制寄存器组。
icpr[2]:全称是:interrupt clear-pending registers,是一个中断解挂控制寄存器组。
iabr[2]:全称是:active bit registers,是一个中断激活标志位寄存器组。
ipr[15]:全称是:interrupt priority registers,是一个中断优先级控制的寄存器组。
简单介绍一下stm32的中断分组:stm32将中断分为5个组,组0~4。该分组的设置是由scb-》aircr寄存器的bit10~8来定义的。
通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
stm32的中断如此之多,配置起来并不容易,因此,我们需要一个强大而方便的中断控制器nvic (nested vectored interrupt controller)。nvic是属于
cortex内核的器件,不可屏蔽中断 (nmi)和外部中断都由它来处理,而systick不是由nvic来控制的。
使用nvic来配置中断时,自然想到st库肯定也已经把它封装成库函数了。对nvic初始化nvic_init() 函数,首先要定义并填充一个nvic_inittypedef 类型的结构体。
这个结构体有四个成员:
nvic_irqchannel 需要配置的中断向量;
nvic_irqchannelcmd 使能或关闭相应中断向量的中断响应;
nvic_irqchannelpreemptionpriority 配置相应中断向量抢占优先级;
nvic_irqchannelsubpriority 配置相应中断向量的响应优先级;
首先要用nvic_irqchannel参数来选择将要配置的中断向量,用nvic_irqchannelcmd参数来进行使能(enable)或关闭(disable)该中断。在nvic_irqchannelpreemptionpriority成员要配置中断向量的抢占优先级,在nvic_irqchannelsubpriority需要配置中断向量的响应优先级。
抢占优先级和响应优先级
stm32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。
抢占,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数a的过程中被中断b打断,执行完中断服务函数b再继续执行中断服务函数a),抢占属性由nvic_irqchannelpreemptionpriority的参数配置。
而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由nvic_irqchannelsubpriority的参数配置。
例如:现在有三个中断向量:
中断向量 抢占优先级 响应优先级
a  0 0
b 1 0
c 1 1
若内核正在执行c的中断服务函数,则它能被抢占优先级更高的中断a打断,由于b和c的抢占优先级相同,所以c不能被b打断。但如果b和c中断是同时到达的,内核就会首先响应响应优先级别更高的b中断。
nvic只可以配置16种 中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数 分配成抢占优先级部分和响应优先级部分。有5组分配方式。
要配置这些优先级组,可以采用库函数nvic_prioritygroupconfig(),可输入的参数为nvic_prioritygroup_0 ~ nvic_prioritygroup_4,分别为以上介
绍的5种分配组。
中断优先级设置的步骤:
1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为nvic_prioritygroupconfig();
2. 设置所用到的中断的中断优先级别。对每个中断调用函数为nvic_init();

昇辉控股强化研发 筑牢科技“护城河”
韩国开始利用AI面试士官
欣旺达子公司拿下大订单 或成动力电池市场黑马
小米6或许没有那么惊艳,只是这部手机的升级版!
加拿大央行研报:双花攻击在区块链上的颓废已成定势
STM32单片机的复用端口初始化的步骤及方法
创客火无人机助力2021世界机器人大赛顺利举行
在加密货币市场中国的地位如何
数字中国下的智慧城市,正在进入3.0时代
南非中央银行成功验证了区块链支付在真实世界中应用
移动机器人系统模型建设方案
华硕发布专面向游戏玩家28寸4K游戏显示器VP28UQG
雷蛇定制版本又来了 《DESTINY 2》定制版外设真的酷
长城电脑:关联方将强制性收购冠捷科技
运用于心电服务系统的蓝牙接口电路设计
BT-300使AR离生活不再遥远 AR或成为日常
晶圆代工厂再展开技术角逐战
Precise for Databases支持多平台关系数据库性能监控
360对智能网联汽车提出五大安全建议
用过去来预测未来