GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
第一步,初始化MCU外设时,一般都需要先打开对应寄存器的接口时钟,所以GPIO时钟使能一定是第一步,否则后面执行的初始化配置无法写入到寄存器中。
![wKgZomXWuhOAfLXzAAAGPeiUtSA151.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuhOAfLXzAAAGPeiUtSA151.png)
第二步,
对于外设复用的GPIO,则需要先配置好GPIO的重映射或者复用选择器,让这个GPIO先内部连接到外设上;
如果我们先初始化GPIO复用模式那么可能默认的复用不是我们想要的外设功能,此时IO按默认外设的默认电平输出,接着软件又配置复用选择器连接到想要的外设,输出电平再次发生变化,就会出现这个短暂的电平变化。
![wKgaomXWuheAN1ChAAAIwCjFxkk707.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWuheAN1ChAAAIwCjFxkk707.png)
对于普通输出IO,则需要先配置好输出状态。
![wKgaomXWuhyAVaxuAAAIGfWwVOg637.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWuhyAVaxuAAAIGfWwVOg637.png)
因为寄存器里默认输出值是0,如果GPIO想要默认状态高,那初始化完GPIO后再配置IO输出高也会出现短暂的低电平导致电平变化。
![wKgaomWp4AyAM7YPAABZRh7pnjE665.png](https://file1.elecfans.com/web2/M00/BE/34/wKgaomWp4AyAM7YPAABZRh7pnjE665.png)
第三步,
初始化GPIO模式,其中一般有输出、输入、复用、模拟等几种模式,有的芯片也可以配置内部的上下拉电阻是否开启,在输出模式时还有GPIO驱动能力配置。
![wKgZomXWuiaANRjNAAAGjb4uhxY775.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuiaANRjNAAAGjb4uhxY775.png)
当然也有特殊情况,以TIMER PWM输出为例,不同的PWM模式默认电平有高和低两种情况,和TIMER配置有关,此时我们按标准顺序配置好GPIO后再配置TIMER,则也可能出现电平变化,如果PWM用于控制功率开关,则可能对电路带来不良影响。所以对于这类外设默认电平可配的外设,想要启动外设工作前保持默认电平的话,我们就可以先初始化好外设,再按标准的顺序配置GPIO。
![wKgZomXWuiuAbiRGAAAvRbsiErs176.png](https://file1.elecfans.com/web2/M00/C0/8C/wKgZomXWuiuAbiRGAAAvRbsiErs176.png)
所以GPIO虽然简单,但实际也有很多细节,想要让软硬件更加可靠,需要抓住这些细节优化软硬件设计。
这里推荐大家购买我们红枫派开发版,其中的例程和驱动程序就是考虑到细节设计的,可以方便大家二次开发产品。
![wKgaomXWujCAOzfuAALFcXgsaKA003.png](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWujCAOzfuAALFcXgsaKA003.png)
-
单片机
+关注
关注
6044文章
44631浏览量
639094 -
mcu
+关注
关注
146文章
17366浏览量
352872 -
GPIO
+关注
关注
16文章
1217浏览量
52454
发布评论请先 登录
相关推荐
RT-Thread自动初始化详解
![RT-Thread自动<b class='flag-5'>初始化</b>详解](https://file.elecfans.com//web2/M00/4D/5D/poYBAGK2552AP3IhAAERUWXJgTY466.png)
![](https://file1.elecfans.com/web2/M00/C0/8F/wKgZomXWwjWAbhSnAAvxViTKQMA149.png)
控制FPGA上电、配置以及初始化时间
51单片机对SAA7113初始化和控制的程序
解析内核初始化时根内存盘的加载过程
Linux内核初始化过程中的调用顺序
蓝桥杯单片机的初始化原理和蜂鸣器关闭学习
![蓝桥杯<b class='flag-5'>单片机</b>的<b class='flag-5'>初始化</b>原理和蜂鸣器关闭学习](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
关于stm8l05x系列单片机rtc初始化问题
![关于stm8l05x系列<b class='flag-5'>单片机</b>rtc<b class='flag-5'>初始化</b>问题](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
单片机问题总结:MPU6050的DMP模块初始化放在线程启动之前
![<b class='flag-5'>单片机</b>问题总结:MPU6050的DMP模块<b class='flag-5'>初始化</b>放在线程启动之前](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
解决ds1302外置时钟模块重复初始化时间问题(单片机掉电,模块电池供电)
![解决ds1302外置时钟模块重复<b class='flag-5'>初始化时</b>间问题(<b class='flag-5'>单片机</b>掉电,模块电池供电)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论