前言
stm32系列是最常用的单片机之一,不同的版本对应除了引脚、外设、频率、容量等’不同之外,其开发的方法是一样的。
本章讲解使用库函数使用GPIO引脚功能。
补充
本文章为多年前学习方法总结,基本是一通百通(PS:学的是方法而不是技术本身)。
stm32系列帮助文件GPIO手把手详细解说
编写GPIO功能,建议初学者学习帮助文件中的案例。
这是固件库V3.4中的GPIO源文件,而V3.5中的资源文件使用的不是固件库,V3.4这个文件明显是GPIO操作LED的,所以本人认为应是V3.5的固件库的.chm帮助文档有问题,V3.5的部分代码截图如下:
可以看出,其函数体根本没有使用固件库,而是使用寄存器,然后我们这个源文件部分使用V3.4版本的固件库作为参考,继续往下走:
再点击
看代码,然后我们跟着代码来详细看整个文件,我们不管注释。
00022行是固件库头文件,而00023行是官方评估板的头文件,这个对我们肯定是不用的,是与使用的具体的硬件定义有关的宏定义,继续往下走
00037行是定义GPIO初始化的结构体,要操作任何外设都得先过它初始化
00040行是延迟函数
00049行进入主函数,也是程序开始执行的入口,注意看注释,时钟已经通过启动文件中调用SystemInit()函数配置好(在未配置固件库时,只添加启动代码和main函数,会报错没有定义SystemInit函数,这就很好的解释了此处为什么没有配置时钟,详细了解请查看QQ21497936空间中STM32新手问题解决方法),继续往下看
(注意:这个注释,这个注释的意思是将端口全部初始化成模拟输入模式,这样可以减少耗电以及增加硬件的抗干扰性能)
00061,00062,00063行是使能外设GPIOA,GPIOB,GPIOC,GPIOD,GPIOE的外设时钟。
00065行是选中所有引脚(引脚0至引脚15)
00066行是输入输出模式为模拟输入
00076行至00082行之间,当定义了宏STM3210E_EVAL或者USE_STM32100E_EVAL则将端口GPIOF,GPIOG也初始化,我们可以判断这两个宏是官方配套的评估板上才有的F端口和G端口,其用的引脚至少144引脚及以上的芯片。
这个是配套版初始化的LED1,LED2,LED3,LED4这样我们可以判断,这个函数是初始化指定端口的一个引脚,至于是哪个引脚肯定在评估板头文件有相关的宏定义,那么我们深入先点开STM_EVAL_LEDInit这个函数,查看它的源代码
跟我们之前预想的一样,定义一个结构体,使能外设,指定引脚,推挽输出,50MHz的频率,初始化;至于Led_TypeDef这个结构和GPIO_CLK,GPIO_PORT应都是与评估板有关的宏定义。我们关心的重点在于声明结构体,使能时钟,配置引脚,然后初始化,我们还是把开发板这个宏定义截图出来,便于大家理解,我们查找一次LED1定义,来看看LED1是哪个端口的哪个引脚,是如何完成配置的
LED1宏的实际值为0;
LED1带入LEDn,实际值为0,c语言数组,则GPIO_CLK[LED1]实际上是LED1_GPIO_CLK,
它的宏定义为C端口,我们再看看引脚:
GPIO_PIN[LED1]实际为GPIO_PIN [0],其宏定义为GPIO_Pin_6(注:联系到固件库本自身的宏定义了)
GPIO_PORT[LED1]实际为LED_GPIO_PORT宏,定义如下
那么就是端口C,所以这段代码就是端口C使能,配置引脚6为推挽输出,然后初始化。
LED1,LED2,LED3,LED4在评估板的头文件相关宏定义如下:
00090-00115是与评估板相关的LED灯操作,开LED1,延迟,开LED2,开LED3,关LED1,延迟,开LED4,关LED2,关LED3延迟,关LED4,这个程序就不断这个循环体
00123-00126是延迟函数的函数体
这个例子文件就说到此处,详解了一般IO口的设置过程,过程总结如下:
- (可选步骤):都设置成模拟输入,降低能耗和增加抗EMC/EMI等
- 步骤二:使能端口的外设时钟
- 步骤三:结构体变量配置端口的相关信息(端口引脚,端口模式,端口频率)
- 步骤四:初始化端口
- 步骤五:可以对端口进行输入输出的操作。