首页 理论教育 STM32固件库编程:编写main.c

STM32固件库编程:编写main.c

时间:2023-10-21 理论教育 版权反馈
【摘要】:图3-31GPIO读写函数翻阅这段代码,可以发现驱动GPIO的函数有:·GPIOx按字节(8位)读输入函数:uint8_t GPIO_ReadInputDataBit。为了更方便编程,固件库已经将0x0040定义为GPIO_Pin_6。要使其他引脚置0,也是同样道理,可以在stm32f4xx_gpio.h中查阅,如图3-32所示,但实际上,用户只需要知道Pinx就可以了。图3-32GPIO_Pinx的定义因此,要使PF6置0,即GPIOF的Pin6置0,编写函数如下:GPIO_ResetBits;使用一个非常简单明了的函数就完成了使PF6输出低电平的任务。

STM32固件库编程:编写main.c

准备好LED文件夹下的led.c与led.h后,LED的初始化函数就已经完成。在主函数中可以使用初始化函数LED_GPIO_Config()完成GPIO的初始化工作。主函数如下:

主函数要包含最基本的stm32f4xx.h头文件以及led.h头文件,可以直接使用LED_GPIO_Config()函数。细心的读者可以发现,stm32f4xx.h头文件在led.h内已经包含过一次,这就是在建立led.h文件时一开头要使用#ifndef_LED_H/#define_LED_H/#endif条件编译的原因,如果不使用,stm32f4xx.h会被引用两次,导致重复引用,编译出错。

由于LED是低电平点亮,主函数的任务很简单,即要使PF6(GPIOF的Pin6)输出逻辑0。首先调用LED_GPIO_Config()函数,对GPIO进行初始化。然后使GPIOF的Pin6置0。前面的章节已经介绍使用传统方法编程,可以使用ODR、BSRR寄存器赋值实现,但过程非常烦琐。由于使用了固件库,并不需要像项目二中的那样使用移位运算实现。固件库已经包含了许多对GPIO操作的函数。使用这些函数只需填入两个形参。这些函数都在stm32f4xx_gpio.c文件内。在这个文件中,读者可以看到“#####GPIO Read and Write#####”,如图3-31所示,这一部分都是GPIO读写的驱动函数。

图3-31 GPIO读写函数

翻阅这段代码,可以发现驱动GPIO的函数有:

·GPIOx按字节(8位)读输入函数:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)。

·GPIOx读输入函数(16位,即整个端口):uint16_t GPIO_ReadInputData(GPIO_TypeDef*GPIOx)。

·GPIOx按字节(8位)读输出函数:uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)。

·GPIOx读输出函数(16位,即整个端口):uint16_t GPIO_ReadOutputData(GPIO_TypeDef*GPIOx)。

·GPIOx Pinx置1函数:void GPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)。

·GPIOx Pinx置0函数:void GPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)。

·GPIOx Pinx写位(写0或1)函数:void GPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,BitAction BitVal)。(www.xing528.com)

·GPIOx写(整个端口写)函数:void GPIO_Write(GPIO_TypeDef*GPIOx,uint16_t PortVal)。

·GPIOx Pinx输出取反函数:void GPIO_ToggleBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)。

点亮LED,即使输出为0,可以使用Pinx位置0函数:

GPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)

选中该函数并右击,查看此函数:

第一个形参GPIO_TypeDef*GPIOx是指GPIOx的映射地址,形参uint16_t GPIO_Pin是Pinx(x=0,1,2,…,15)具体第几脚。GPIOx的映射已经在stm32f4xx.h文件中做好,如图3-28所示。LED所接的端口为PF口,即GPIOF,所以这个形参为GPIOF。

对于第二个形参,我们先看函数的最后一行。“GPIOx->BSRRH=GPIO_Pin;”意味着要对BSRRH进行赋值。BSRR寄存器的具体含义可查阅项目二中的图2-11。要使得GPIOF的Pin6输出0,将BSRR的高16位写入0x0040即可,因此这个形参应该是0x0040。如果每次置0,都要这样查阅图2-11,将是非常麻烦的。为了更方便编程,固件库已经将0x0040定义为GPIO_Pin_6。要使其他引脚置0,也是同样道理,可以在stm32f4xx_gpio.h中查阅,如图3-32所示,但实际上,用户只需要知道Pinx就可以了。

图3-32 GPIO_Pinx的定义

因此,要使PF6置0,即GPIOF的Pin6置0,编写函数如下:

GPIO_ResetBits(GPIOF,GPIO_Pin_6);

使用一个非常简单明了的函数就完成了使PF6输出低电平的任务。最后编译整个工程。编译成功后,将工程下载到开发板,就可以看到红色LED点亮了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈