本文基于原子例程及其模板
在学习stm32之前,有大多数人学过51单片机,51单片机中的IO口可以直接进行使用,可以读取高低电平,也可以控制高低电平。
大家看这个51的程序,只要将LED灯的负极接入电源负极,在灯正极串联200欧(经过发光二极管会有一个电压降低值,简称压降,一般为2V,51单片机输入高电平为5V,直接接入LED灯,会将灯烧掉,欧姆定律大家都知道,直接用电阻将这3V电压分走后,LED灯就能正常发光,R=U/I I等于什么呢,LED一般电流为15ma,所以R= 3/15ma = 200欧)再接入51单片机的P0^0口,当51单片机给出高电平,也就是5V时,LED灯就会亮了
#include <reg51.h>
sbit LED = P0^0;
main()
{
while(1)
{
LED = 1;
}
}
但是在STM32中,使用的电压为3.3V,且每一个IO口所拥有的功能很多,这时我们需要正常输出高低电平,怎么办呢?
咱们对STM32的IO口进行一个初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //这叫结构体,需要放最上面
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIO A的端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
// 对GPIO口进行配置,这是你需要哪个就写哪个
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置GPIO的模式,这个GPIO_MODE_OUT_PP,OUT代表输出,PP代表推挽式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 这是GPIO口 速度 这时设置为50MHZ
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //设置GPIOA.8输出高电平
}
这上面是对IO状态初始化的设置
咱现在就可以在主函数使用这个初始化
#include "sys.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
main()
{
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//这个就是将IO口设置为低电平就是0V
delay_ms(300);
// 维持上面的状态300ms,因为咱们LED灯负极接电源负极,此时单片机输出0V,LED两端没有电压差值,所以LED灯不会亮
GPIO_SetBits(GPIOA,GPIO_Pin_8); //这个就是将IO口设置为高电平就是3.3V
此时LED两端有电压差值,就会发亮
delay_ms(300);
}
}
有人会问,while(1)这个函数是什么意思,计算机中的值只有真和假,0就是假,其他的都是真值,while函数,当函数后面的()里为真值时,运行下面大括号中的语句,此时()里一直为真值,所以一直循环运行大括号中的语句。
因为51单片机是5V供电,所以输出高电平也是5V,但是STM32单片机是3.3V供电,输出高电平也是3.3V,此时这时候LED灯正极该一个多大的电阻呢,这就给大家留个任务,算出这个组织,可以在下面评论出来,我看看是不是算对了