笔记: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端口和电源以及接地就可以下载到芯片里面实现了。