STM32自定义函数来点灯失败

STM32自定义函数来点灯失败;
自定义的LED选择函数:

img


主程序运行无报错无警告:

img


img


其中LED_Init是注释部分的自定义函数
想问问是哪里有问题呢

led初始化函数里是怎么写的,如果是注释里的内容肯定就不对了!注释里初始化是对GPIOB进行初始化,设置里又是对GPIOA进行控制。所以没有初始化GPIOA,肯定就不能控制了!

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7713014
  • 这篇博客也不错, 你可以看下第一站:STM32寄存器版点亮LED遇到的一些问题解析
  • 除此之外, 这篇博客: 【STM32学习笔记-点亮LED灯】中的 5.LED_Init(); LED灯初始化函数分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 跳转至函数出处
    在这里插入图片描述
    光标放置在LED_Init();语句行,右键-选择Go Too Definition Of ‘LED_Init’,跳转到led.c函数中

    GPIO_InitTypeDef  GPIO_InitStructure; 
    

    led.c函数的第一句如上,通过寻找起源,我们可以看到此函数来自于stm32f10x_gpio.h 函数的一个结构体的定义,如下代码

    typedef struct
    {
      uint16_t GPIO_Pin; /*需要配置的GPIO引脚,这个参数
      						可以是@ref GPIO_pins_define的任意值*/
    
      GPIOSpeed_TypeDef GPIO_Speed;  /*指定所选引脚的速度。这个参数
      									可以是@ref GPIOSpeed_TypeDef的值   */
    
      GPIOMode_TypeDef GPIO_Mode;    /*指定所选引脚的工作模式。这个参数
      									可以是@ref GPIOMode_TypeDef的值   */
    }GPIO_InitTypeDef;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); 
    

    led.c函数第二句如上,功能为打开或关闭对应的外设输出时钟端口
    在这里插入图片描述
    输入参数1:RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
    采用了GPIOA时钟或者GPIOB时钟或者GPIOC时钟
    输入参数2:ENABLE(使能够启动)
    在这里插入图片描述

    GPIO_InitStructure.GPIO_Pin = LED1 | LED2;
    							 //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    							 //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    							 //设置IO接口速度(2/10/50MHz)
    

    以上三句对应了第一句的结构体定义(定义参数的端口号、工作方式和接口速度)

    1. 接口的端口号:LED1和LED2在led.h函数中进行了宏定义
    #define LED1	GPIO_Pin_0	//定义IO接口
    #define LED2	GPIO_Pin_1	//定义IO接口
    

    GPIO_Pin0和Pin1也对应了不同的地址,在系统文件stm32f10x_gpio.h中被宏定义

    #define GPIO_Pin_0  ((uint16_t)0x0001)  /*!< Pin 0 selected */
    #define GPIO_Pin_1  ((uint16_t)0x0002)  /*!< Pin 1 selected */
    

    2.工作方式:输入输出的8种模式,这要根据外电路和作用选择(此处选择了推免输出模式:可以输出高,低电平,连接数字器件

    typedef enum
    { GPIO_Mode_AIN = 0x0,			//模拟输入模式
    GPIO_Mode_IN_FLOATING = 0x04,	//浮空输入模式
    GPIO_Mode_IPD = 0x28,			//下拉输入
    GPIO_Mode_IPU = 0x48,			//上拉输入
    GPIO_Mode_Out_OD = 0x14,		//开漏输出
    GPIO_Mode_Out_PP = 0x10,		//推挽输出
    GPIO_Mode_AF_OD = 0x1C,			//开漏复用输出
    GPIO_Mode_AF_PP = 0x18			//复用推挽输出
    }GPIOMode_TypeDef;
    
    GPIO_Init(LEDPORT, &GPIO_InitStructure);
    

    led.c函数的最后一句,改函数详情如下:
    在这里插入图片描述
    输入参数1:LEDPORT  此处在led.h中被宏定义为GPIOB

    #define LEDPORT	GPIOB	//定义IO接口
    

    STM32有5组GPIO引脚,分别是GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,每组GPIO有16个引脚。根据型号不同有着不同的引脚数量,此处采用了B组的16个引脚。
    以上LED_Init()函数分析完毕。

  • 您还可以看一下 朱有鹏老师的STM32标准库的引入视频课程-第3季第6部分课程中的 3.6.7.使用标准库重写LED的程序1小节, 巩固相关知识点

找到原因了:把LED里的时钟使能语句 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 调整了下位置,挪到前面了就可以了,使能语句的位置还会有影响吗?

img