云计算百科
云计算领域专业知识百科平台

STM32(11)-- GPIO输出,库函数点灯

1. 硬件原理图

要点亮这几个LED灯,对应引脚都需要输出低电平

2.  软件设计

2.1 新增驱动文件

新建LED驱动的头文件和源文件,

注:此处将LED的两个文件新建在了工程的User文件夹中,就不用再包含头文件了;如果在User文件夹下再建了一个文件夹,将LED的驱动文件放在其中,那需要在keil中新增头文件的包含路径。

2.2 驱动文件的实现

在驱动文件中肯定会用到GPIOA、GPIOB等宏定义,所以需要包含“stm32f4xx.h”文件,这个文件中包含寄存器映射等定义

外设的初始化配置

1. 开GPIO的时钟

2. 定义一个GPIO的初始化结构体

3. 配置GPIO初始化结构体成员

4. 调用GPIO初始化函数,把配置好的结构体成员的参数写入寄存器

2.2.1 开启时钟

需开启GPIOF和GPIOC的时钟,查手册,这两个外设位于AHB1总线上

每个函数都可以在.c文件中查看定义、函数形参的可取的值,如下示例:

/**
* @brief Enables or disables the AHB1 peripheral clock.
* @note After reset, the peripheral clock (used for registers read/write access)
* is disabled and the application software has to enable this clock before
* using it.
* @param RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_AHB1Periph_GPIOA: GPIOA clock
* @arg RCC_AHB1Periph_GPIOB: GPIOB clock
* @arg RCC_AHB1Periph_GPIOC: GPIOC clock
* @arg RCC_AHB1Periph_GPIOD: GPIOD clock
* @arg RCC_AHB1Periph_GPIOE: GPIOE clock
* @arg RCC_AHB1Periph_GPIOF: GPIOF clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOI: GPIOI clock
* @arg RCC_AHB1Periph_GPIOJ: GPIOJ clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_GPIOK: GPIOK clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_CRC: CRC clock
* @arg RCC_AHB1Periph_BKPSRAM: BKPSRAM interface clock
* @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock
* @arg RCC_AHB1Periph_DMA1: DMA1 clock
* @arg RCC_AHB1Periph_DMA2: DMA2 clock
* @arg RCC_AHB1Periph_DMA2D: DMA2D clock (STM32F429xx/439xx devices)
* @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock
* @arg RCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clock
* @arg RCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clock
* @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock
* @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock
* @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock
* @param NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));

assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHB1ENR |= RCC_AHB1Periph;
}
else
{
RCC->AHB1ENR &= ~RCC_AHB1Periph;
}
}

//1.开启时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

2.2.2 定义初始化结构体

注释中写明了参数可取的枚举值

//2.定义初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;

2.2.3 配置GPIO初始化结构体成员

//3.配置GPIO初始化结构体成员
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//配置为上拉模式

2.2.4 调用GPIO初始化函数

//4.GPIO初始化函数
GPIO_Init(GPIOF,&GPIO_InitStruct);

注:此时完成初始化后,端口被配置为上拉、推挽输出模式;查手册可知,当上电复位后,ODR(输出数据寄存器)默认多为 0,所以引脚默认会输出低电平,只调用此函数的话,灯会被点亮。

内部上拉主要影响输入态/高阻态时电平;一旦推挽输出开始驱动,输出电平(尤其是低电平)会覆盖上拉效果。

3. 主函数的实现

#include "stm32f4xx.h"
#include "led.h"

void delay(uint32_t count);
int main(void)
{
LED_Config();

while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_6);
delay(0xFFFFFF);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
delay(0xFFFFFF);
}

}

void delay(uint32_t count)//软件延时
{
for(;count>0;count–);
}

4. 标准库补充知识

4.1 系统初始化,时钟配置

4.2 断言

“断言(assert)”你可以把它理解成:程序员在代码里写的“我要求这里必须满足某个条件,否则立刻报错” 的检查。

  • 断言 = 调试期的参数/逻辑检查

  • 条件不满足就进入 assert_failed 让你快速定位错误

  • 不想要开销就关闭(不定义 USE_FULL_ASSERT),它就啥也不做

赞(0)
未经允许不得转载:网硕互联帮助中心 » STM32(11)-- GPIO输出,库函数点灯
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!