9月15日更新下载!!! 超级方便的GPIO端口配置函数,寄存器版本和库函数版本均可使用

2019-07-20 23:51发布

本帖最后由 warship 于 2018-9-15 10:48 编辑

GPIO端口的配置是每个程序都要用到的,
并且还不止配置一个,如LED灯、键盘、IO控制端口等等,
用库函数则每配置一个端口就一堆代码,看着头疼。
用寄存器版本则很不直观,
今天我看原子的寄存器版本有一个外部中断配置的函数,
用起来很方便,受到启发,
就着手参考优化了库函数的原型代码
编了这个GPIO的端口配置函数(初版时每次只配置一个引脚,现在应坛友需求,改为一次可配多个引脚)。

已经实测通过,超级好用,不敢独占,贴出来给大家分享一下,
无论你是用库函数编程,还是用寄存器编程都可以使用。
*************** 华丽的分界线 *******************************


有了这个配置函数,今后的GPIO配置就超级清爽了,
比如两个LED灯,三个按键的配置,
原先有一大堆初始化数据结构体的代码,既杂乱又哆嗦,
现在只须如下代码(示例):

//配置PA8和PD2为LED指示灯
My_GPIO_Init(GPIOA,  Pin_8,  Mode_Out_PP+Speed_50MHz);    //LED0
My_GPIO_Init(GPIOD,  Pin_2,  Mode_Out_PP+Speed_50MHz);    //LED1

//配置三个按键PC1 、PC13、PA0
My_GPIO_Init(GPIOC, Pin_1 | Pin_13, Mode_IPU);     //配置KEY1、KEY2按键   
My_GPIO_Init(GPIOA, Pin_0,  Mode_IPD);    //配置WK_UP按键
******************************************************************
应网友要求,在21楼修改了原子的试验5(外部中断试验)作为范例,
现将附件移到顶楼,方便下载测试。
附件的sys.c文件中,对原子代码不合理的部分进行了修改(文件中有注释说明),
扩展并使用了我最新研究成果,直接进行位段操作,
用位段操作编出来的代码更高效、程序的可读性更强,更容易理解上手。大家可以与原子的源码进行对比,就会有体会了。
有问题欢迎提出来讨论交流哈。
关于位段操作的研究讨论可移步http://www.openedv.com/forum.php ... 4196&extra=page%3D1






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
xianshasaman
1楼-- · 2019-07-24 07:06
 精彩回答 2  元偷偷看……
xiatianyun
2楼-- · 2019-07-24 11:46
谢谢分享。
在学习GPIO配置时就想到可能存在统一简单的配置写法,不把初始化参数在GPIO_Init()外部事先用一推代码填写,而是直接封装在一个函数的参数中来使用。
不过,库函数版也有它的好处,就是Pin可以一次初始化多个,也就是你说的库函数中使用了for代码。
对于像我一样的初学者往往一个pin一个pin的初始化,这个函数很直接。
warship
3楼-- · 2019-07-24 15:19
xiatianyun 发表于 2018-9-6 00:19
谢谢分享。
在学习GPIO配置时就想到可能存在统一简单的配置写法,不把初始化参数在GPIO_Init()外部事先用 ...

你说得很对,
确实这个函数不能多个pin一起配
因为我这个为了直观,直接使用了pin的引脚号,
而库函数采用的是互不干涉的0001、0002、0004、0008等的BIT定位值,
可以通过使用"或"运算同时加入多个pin(后来我也意识到库函数用for的目的)
但如果配置单个pin的话,用for就降低效率了。
其实最高效率就是直接写寄存器,一次可以多个pin, 一条语句搞定,但可读性太差。
Chaos123
4楼-- · 2019-07-24 20:18
楼主能否更新一下定时器的位带操作
warship
5楼-- · 2019-07-24 20:27
 精彩回答 2  元偷偷看……
752151619
6楼-- · 2019-07-24 20:41
warship 发表于 2018-7-12 19:21
有了这个配置函数,今后的GPIO配置就超级清爽了,
比如两个LED灯,三个按键的配置,
原先有一大堆的代码 ...

你这代码用起来稳定吗。有没什么BUG

一周热门 更多>