STM32学习笔记(白话文理解版)—小灯的点亮、闪烁、呼吸
目录
一、点灯原理
以stm32C8T6最小系统板为例:
- 原理:PC13输出低电平,则LED正向导通,LED灯亮,故电灯任务可变为,使单片机IO引脚输出低电平。
- 实质:控制单片机引脚输出高电平或低电平
二、基本点灯方式
方法:
1.配置GPIO引脚
2.控制GPIO引脚输出高低电平
(1)主函数部分(任选一种):
- 第一种主函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
int main (void)//主程序
{
LED_Init();//调用自己写的函数,目的让LED初始化
while(1)
{
GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(0)); //可理解为,在PC13引脚,写入0
}
}
- 第二种主函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
int main (void)
{//主程序
LED_Init();
while(1)
{
//根据原理图得知,PC13低电平,LED灯电量:
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//使GPIO13置于低电平
//[GPIO_SetBits(GPIOC,GPIO_Pin_13置于高电平]
}
}
- 第三种主函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
int main (void)
{//主程序
LED_Init();
while(1)
{
PCout(13)=1;//位带操作,令PC 13输出位1,其中有PBout、PCout、PAout等,表示哪个引脚组,()中为这个引脚组的具体哪个引脚,=为使这个引脚置1还是置0
}
}
(2)配置部分:
#include "led.h"
/*
GPIO初始化可理解为:
1.使能时钟,时钟比喻为人的心脏,必须使能时钟,STM32才能正常工作
2.使用GPIO初始化函数
3.根据GPIO初始化函数要求,配置GPIO初始化
*/
void LED_Init(void){ //LED灯的接口初始化
GPIO_InitTypeDef GPIO_InitStructure;//配置GPIO,使用GPIO初始化函数,函数得第二个参数是结构体,故定义结构体
//1.使能时钟,时钟比喻为人的心脏,必须使能时钟,STM32才能正常工作
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//3.根据GPIO初始化函数要求,配置GPIO初始化
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13; //初始化GPIOC引脚组的,第几个引脚?哦原来是引脚13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式,见下文,具体哪些方式用到百度就行
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 一般50MHZ
//2.使用GPIO初始化函数
GPIO_Init(GPIOC, &GPIO_InitStructure);//(GPIO初始化函数)第一个参数:初始化哪个引脚组;第二个参数:具体配置
}
/*
选择IO接口工作方式:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_AF_PP 复用推挽输出
GPIO_Mode_AF_OD 复用开漏输出
*/
三、小灯闪烁
(1)实现原理:
给小灯一个高电平,延时几秒;再给小灯一个低电平,延时几秒,如此反复就实现了闪灯操作
(2)实现程序:
- 只需要在原来程序基础上,在主程序中修改,进行延时即可实现
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
#include "delay.h"
int main (void)
{//主程序
LED_Init();
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
delay_ms(500);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
delay_ms(500);
}
}
四、小灯呼吸
(1)实现原理:
在一个周期内使小灯亮的时间增多,暗的时间减少,在人眼视觉上,便体现为小灯变亮。
(2)实现程序:
- 将延时函数参数设置成变量,运用C语言知识,不断改变变量的值,即调节了一个周期内的高低电平比列
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
#include "delay.h"
int main (void)
{//主程序
u8 MENU;
u16 i,t;
MENU = 0;//定义菜单
t = 1;
//上述定义能用到的变量
LED_Init();
while(1)
{
//灯是低电平亮
//如果是菜单0:使输出低电平的时间从1不断增大,也就是灯不断变亮
if(MENU == 0)
{
for(i=0;i<10;i++)//每一个t的值都执行10次,执行10次后t+1
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
delay_us(t);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
delay_us(501-t);
}
t++;
if(t == 500)//当t加到500时,执行菜单1
{
MENU = 1;
}
}
//如果是菜单1:使输出低电平的时间逐渐减小,也就是灯逐渐变暗
if(MENU == 1)
{
for(i=0;i<10;i++)//每一个t的值执行10次,执行10次后t减1
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
delay_us(t);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
delay_us(501-t);
}
t--;
if(t == 1)//t从500减到1后执行菜单0
{
MENU = 0;
}
}
}
}