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),它就啥也不做

相关推荐
正点原子20 小时前
《ESP32-S3使用指南—IDF版 V1.6》第十章 ESP32-P4存储器类型
单片机·物联网·嵌入式
Mao_Hui21 小时前
Unity3d实时读取Modbus RTU数据
开发语言·嵌入式硬件·unity·c#
吉哥机顶盒刷机1 天前
晶晨芯片机顶盒与海思芯片机顶盒刷机区别详解
经验分享·嵌入式硬件·刷机
森利威尔电子-1 天前
SL4011:2.7V-12V输入,12.8V输出高效率升压型DC-DC转换器
单片机·嵌入式硬件·集成电路·芯片·电源芯片
想搞嵌入式的小白1 天前
LDO和DC-DC的异同
单片机·嵌入式硬件
EVERSPIN1 天前
RGB显示驱动MCU单片机—CH643键盘应用方案
单片机·嵌入式硬件·mcu·计算机外设·mcu单片机
edjxj1 天前
PFC电路学习
单片机·学习
电气_空空1 天前
基于 Labview/Matlab 的人脸识别系统设计与实现
单片机·嵌入式硬件·毕业设计·labview
西城微科方案开发1 天前
智能充气泵PCBA充气解决方案
单片机
v先v关v住v获v取1 天前
轴吸盘机械手关节型机器人设计含+8张CAD图+SW模型+运动仿真+说明书
科技·单片机·51单片机