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文件中查看定义、函数形参的可取的值,如下示例:

cpp 复制代码
/**
  * @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;
  }
}
cpp 复制代码
	//1.开启时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

2.2.2 定义初始化结构体

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

cpp 复制代码
//2.定义初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;

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

cpp 复制代码
    //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初始化函数

cpp 复制代码
//4.GPIO初始化函数
	GPIO_Init(GPIOF,&GPIO_InitStruct);

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

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

3. 主函数的实现

cpp 复制代码
#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),它就啥也不做

相关推荐
济6174 小时前
ARM Linux 驱动开发篇----字符设备驱动开发(1)--字符设备驱动简介---- Ubuntu20.04
linux·嵌入式硬件
csg11074 小时前
PIC单片机驱动BH1750光照传感器,轻松获取环境光照数据
单片机·嵌入式硬件·物联网
雾削木5 小时前
使用 ESPHome 的核心指令
java·前端·javascript·单片机·嵌入式硬件
DLGXY6 小时前
STM32——输入捕获、编码器接口(十一)
stm32·单片机·嵌入式硬件
余生皆假期-13 小时前
永磁同步电机二次起步处理
单片机·嵌入式硬件
DLGXY15 小时前
STM32——TIM定时器、定时中断、RCC时序(八)
stm32·单片机·嵌入式硬件
CQ_YM15 小时前
ARM之I2C
arm开发·单片机·嵌入式硬件·嵌入式
让世界再也没有bug15 小时前
测试工具之一 ------示波器
单片机·嵌入式硬件·硬件测试·嵌入式软件测试
CircuitWizard15 小时前
STM32 + 淘晶驰T1串口屏波形显示
stm32·单片机·嵌入式硬件