> 文档中心 > 笔记:STM32103RCT6——呼吸灯

笔记:STM32103RCT6——呼吸灯

首先看到这个STM32最小开发板上面有两个led灯可以用IO来控制亮灭

LED0在PA8寄存器端口上,LED1在PD2寄存器端口上。可以确定的是LED是低电平点亮的。

然后回到keil5软件,利用标准库来初始化IO寄存器IO口

点开GPIO口标准库.h文件

在里面可以看到各种IO口控制的结构体配置。找到GPIO_Init初始化,可以看到有三种设置。

 复制这个结构定义就可以初始化结构,然后用结构体调用这几个控制模式

void led_Init(void){GPIO_InitTypeDef led_Init;    //定义初始化结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);led_Init.GPIO_Mode=GPIO_Mode_Out_PP;  //模式,带上拉电阻的推挽输出led_Init.GPIO_Pin=GPIO_Pin_2;    //引脚led_Init.GPIO_Speed=GPIO_Speed_50MHz; //速度    GPIO_Init(GPIOD,&led_Init);  //把结构体寄存器写入D组     }

像速度一般设置为最高、引脚一般都可以在原理图都可以看到,这里的LED有D组的2脚和B组的13脚,但是模式这里就比较多,一开始点开就有点懵,不知道那个对应那个,后面通过了解,可以这样理解

(1)GPIO_Mode_AIN 模拟输入                  //GPIO无效,引脚直接接入ADC内部
(2)GPIO_Mode_IN_FLOATING 浮空输入     //可以读取引脚电平,若引脚悬空,则电平不确定        
(3)GPIO_Mode_IPD 下拉输入                 //可读取引脚电平,内部连接下拉电阻,,悬空的时候默认低电平
(4)GPIO_Mode_IPU 上拉输入                 //可读取引脚电平,内部连接上拉电阻,悬空的时候,默认高电平
(5)GPIO_Mode_Out_OD 开漏输出          //可输出引脚电平,高电平的时候为高阻态,低电平的时候接VSS
(6)GPIO_Mode_Out_PP 推挽输出           //可输出引脚电平,高电平的时候接VDD,低电平接VSS
(7)GPIO_Mode_AF_OD 复用开漏输出            //由片上外设控制,高电平为高阻态,低电平接VSS
(8)GPIO_Mode_AF_PP 复用推挽输出     //由片上外设控制,高电平接VDD,低电平接VSS

把引脚初始化后,就可以利用设置引脚来控制IO口的0和1

 在.h文件的底部就有控制各种IO的功能,使用LED的话就用复位和设置位,

然后通过变量的渐变来控制LED的0和1的亮灭就可以让LED达到假呼吸的效果。看起来像在慢慢呼吸的感觉。

unsigned int i,time=5000;led_Init(); //led的初始化while(1){    for(i=0;i<time;i++){delay(i);GPIO_ResetBits(GPIOD,GPIO_Pin_2); //设置0delay(time-i);GPIO_SetBits(GPIOD,GPIO_Pin_2);   //设置1}for(i=0;i<time;i++){delay(i);GPIO_SetBits(GPIOD,GPIO_Pin_2);      //设置1delay(time-i);GPIO_ResetBits(GPIOD,GPIO_Pin_2);    //设置0}

然后通过同样的方法来初始化按键来控制LED

void key_Init(void){GPIO_InitTypeDef key_Init;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);     //同样是C组寄存器的时钟key_Init.GPIO_Mode=GPIO_Mode_IPU;key_Init.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_13;     //这里直接设置两个引脚key_Init.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOC,&key_Init);}

然后定义个函数返回按键的键值,这里可以看到按键不是设置和复位这个而是GPIO_ReadInputDataBit()读取按键按键所在的IO口的0和1了当按键按下的时候是0松开的为1

unsigned  key_scanf(void){unsigned char num=0;if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)  //判断按键是否按下{   delay(10);while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0);//判断按键是否按下delay(10);num=1;}if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0){   delay(10);while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 0);delay(10);num=2;}   return num;}

然后定义一个变量来获取按键的键值,判断是按键1还是按键2开控制灯的亮灭

unsigned char number;led_Init();key_Init();while(1){     number=key_scanf();  //获取键值 if(number == 1) GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //亮 if(number == 2) GPIO_SetBits(GPIOD,GPIO_Pin_2);   //灭

写好之后就可通过下载器接STM的PA14引脚的SWCLK和PA13引脚的SWDIO端口和电源以及接地就可以下载到芯片里面实现了。