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

相关推荐
12.=0.5 分钟前
【stm32_3】嵌入式软件系统架构
stm32·单片机·嵌入式硬件
会编程的小孩1 小时前
优先级与抢占实验
stm32·单片机
風清掦1 小时前
【江科大STM32学习笔记-10】I2C通信协议 - 10.1 软件I2C读写MPU6050
笔记·stm32·单片机·嵌入式硬件·物联网·学习
无垠的广袤2 小时前
【Titan RA8P1 Board】MNIST 数字识别
人工智能·单片机·瑞萨·mnist·数字识别·ra8p1·ruhmi
无垠的广袤2 小时前
【Titan RA8P1 Board】PyOCD 调试
单片机·嵌入式硬件·调试器
BackCatK Chen2 小时前
STM32保姆级入门教程|第6章:定时器中断原理 + 精准LED闪烁(1s_2s_3s)实战(功能超详细+CubeIDE手把手)
stm32·stm32cubeide·定时器中断·嵌入式入门·tim2·led精准闪烁·中断回调函数
水果里面有苹果3 小时前
24-NT5CC128M16IP-DI DDR3芯片 2Gbit
嵌入式硬件
橙露3 小时前
STM32 定时器与 PWM 输出:电机调速、LED 呼吸灯实战
stm32·单片机·嵌入式硬件
youcans_3 小时前
【FOC-MBD】(19)反 Park 坐标变换链路
stm32·单片机·嵌入式硬件·simulink·代码生成
国科安芯4 小时前
面向商业航天的高可靠电机控制系统:从环境约束到芯片实现
单片机·嵌入式硬件·架构·risc-v·安全性测试