此图中LED右端接地(GND),左端连接PB0、PB1(见下图),可知该电路输出为高电平时led点亮,低电平时led熄灭
代码如下(示例):
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"//延时函数
#include "led.h"
int main (void){//主程序
RCC_Configuration(); //时钟设置(暂时不研究时钟)
LED_Init();
while(1){
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒
}
}
代码如下(示例):
#include "led.h"
void LED_Init(void){ //LED灯的接口初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,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)
GPIO_Init(LEDPORT, &GPIO_InitStructure);
}
代码如下(示例):
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//#define LED1 PBout(0)// PB0
//#define LED2 PBout(1)// PB1
#define LEDPORT GPIOB //定义IO接口
#define LED1 GPIO_Pin_0 //定义IO接口
#define LED2 GPIO_Pin_1 //定义IO接口
void LED_Init(void);//初始化
#endif
CMSIS-User文件均由stm官网提供(查阅固件库安装)
跳转至函数出处
光标放置在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()函数分析完毕。
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒
输入参数1:LEDPORT(在led.h中宏定义为GPIOB)采用B组接口
输入参数2:LED1(在led.h中宏定义为GPIO_Pin_0)使用B组的0号接口
输入参数3:(BitAction)(1)表示置位,输出为高电平(0表示清零)
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
delay_us(50000); //延时1秒
GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1
delay_ms(500); //延时1秒
读取出端口管脚的值后利用“1-”来取它的反值(1-0=1 1-1=0)
GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
delay_s(1); //延时1秒
GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)
delay_s(1); //延时1秒
GPIO_Write(LEDPORT,0x0001); //直接数值操作将变量值写入LED
delay_s(2); //延时1秒
GPIO_Write(LEDPORT,0x0000); //直接数值操作将变量值写入LED
delay_s(2); //延时1秒
以上就是点亮LED灯的代码详解,通过修改闪灯延时时间可以得到不同的效果