STM32自定义函数来点灯失败;
自定义的LED选择函数:
led初始化函数里是怎么写的,如果是注释里的内容肯定就不对了!注释里初始化是对GPIOB进行初始化,设置里又是对GPIOA进行控制。所以没有初始化GPIOA,肯定就不能控制了!
跳转至函数出处
光标放置在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)
以上三句对应了第一句的结构体定义(定义参数的端口号、工作方式和接口速度)
#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()函数分析完毕。
找到原因了:把LED里的时钟使能语句 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 调整了下位置,挪到前面了就可以了,使能语句的位置还会有影响吗?