HAL库实现STM32程序——led灯的点亮(附代码)

AI助手已提取文章相关产品:

一、GPIO的基本介绍

 (1) 整体框图

左侧片内部分

左侧芯片外部

(2) 保护二极管

        1.二极管是半导体材料,单向导电

        2.当进入的电平是高电平的时候,将超过正常电流的电压分流到VCC当中,这样的话,芯片内部就不会收到高于VCC的电平,起到了保护芯片的作用;

        3.当进入的电平是低电平的是以后,将低于VSS的电平给阻隔掉,将0V的低电平传入到芯片中,保证接入的低电平不是负电平。

        4.如果接入的电平过高也会将芯片烧掉,属于是弱保护,不能过渡依赖。

二、输入部分

图示

上拉电阻

        可以将低电平上拉(弱上拉),主要在IO空闲时确定状态,不然就是浮空模式,设置IO空闲时为高电平,主要用于初始化IO状态;

下拉电阻

        可以将高电平下拉(弱下拉),可以将高电平下拉(弱下拉),主要是在IO空闲时确定状态的,不然就是浮空模式,设置IO空闲时为低电平,主要用于初始化IO状态。

肖特基触发器

作用:可以将不规律的波形转化为有规律的方波

特点:当输入的电压高于正向阈值电压,输出为高;

           当输入的电压低于负向阈值电压,输出为低;

           当输入的电压在正向和负向阈值之间,输出不变。

三、输出部分P-MOS管和N-MOS管

图示:

导通条件:P-MOS(N-MOS)管导通条件是进入P-MOS(N-MOS)管的电压和VDD(VSS)不一致

四、八种工作模式

通用输入模式

1.输入浮空

        浮空模式就是既不上拉也不下拉电阻,MOS管不导通,肖特基触发器打开,可以任意输入到IDR寄存器中电平是不确定,这种模式一般不使用。

2.输入上拉

        上拉电阻接通,肖特基触发器打开,输出被禁止;

        IO空闲的时候如果要向CPU写入高电平,就使用输入上拉即可。。

3.输入下拉

        下拉电阻接通,肖特基触发器打开,输出被禁止;

        IO空闲的时候如果要向CPU写入低电平,就使用输入下拉即可。

通用输出模式

4.开漏输出

        开漏模式下只有N-MOS管工作,P-MOS是停止工作的,ODR输出为0的时候,N-MOS导通,输出低电平,ODR输出为1的时候N-MOS不导通。

开漏模式下只能向外输出低电平(如果有外接上拉电阻,其实也可以输出高电平)。

5.推挽输出

        推挽模式下P-MOS管和N-MOS都可以导通,当ODR寄存器输出一个低电平的时候,N-MOS导通向外输出低电平,当ODR寄存器输出一个高电平,P-MOS管导通,向外输出高电平。

复用功能

复用功能和通用输出两个情况基本相同,

唯一的区别:通用模式下输出控制信号由ODR来提供,复用功能是由片上外设提供的

6.开漏输出

        开漏模式下只有N-MOS管工作,P-MOS是停止工作的,ODR输出为0的时候,N-MOS导通,输出低电平,ODR输出为1的时候N-MOS不导通。

        开漏模式下只能向外输出低电平(如果有外接上拉电阻,其实也可以输出高电平)。

7.推挽输出

        推挽模式下P-MOS管和N-MOS都可以导通,当ODR寄存器输出一个低电平的时候,N-MOS导通向外输出低电平,当ODR寄存器输出一个高电平,P-MOS管导通,向外输出高电平。

8.模拟输入

        模拟输入模式上下拉电阻不用、输出被禁止,肖特基触发器关闭;

        模拟输入只在ADC/DAC上使用。

五、led灯的电路图

图示

解释:由电路图可知,如果想要点亮一个LED灯,就需要给PB5~PB7三个引脚中的任何一个传递一个高电平,如果要熄灭就传递低电平。

六、通用外设驱动的方式主要有三步

        1、时钟设置、参数设置

        2、读函数,从外设读取数据

        3、写函数,像外设来写入数据

七、GPIO配置步骤

1、使能使用

        用__HAL_RCC_GPIOx_CLK_ENABLE(),其中x代表要选择哪一组GPIO口来操作,当前电路板上的LED使用的是PB引脚,所以使能函数就是

__HAL_RCC_GPIOB_CLK_ENABLE()

2、设置工作模式

        HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

参数1:GPIO_TypeDef *GPIOx

        GPIO_TypeDef *是一个结构体指针,这里直接传GPIOB即可,因为HAL库中将GPIOB的地址宏定义成了GPIOB,所以直接使用

参数2:GPIO_InitTypeDef *GPIO_Init

四个成员:

        pin:设置GPIO引脚的

        mode:设置工作模式

        pull:设置电阻上下拉       

        speed:速度速度设置越高,GPIO驱动电路的响应速度越快,信号跳变(从高到低或者从低到高)的边沿更加陡峭(即上升和下降的时间更短),反之低速下就更加缓和。

        低速模式:适用于led、按键、低速传感器等简单的数据信号,无需快速响应

        高速模式:适用于SPI、I2C、USART的等外设需要高频PWM信号,确保信号边沿能满足时序要求。

        速度只在输出模式下生效,输入模式无影响

3、设置输出状态

HAL_GPIO_WritePin() // 设置GPIO引脚的状态

        参数1:选择哪一组GPIO

        参数2:选择具体的GPIO PIN脚,比如GPIO_PIN_6

        参数3:确定输出的电平应该高电平还是低电平

        GPIO_PIN_SET:设置为高电平

        GPIO_PIN_RESET:设置为低电平

八、代码区域

led.h

#ifndef LED_H
#define LED_H
#include "stm32f1xx.h"

//定义led端口和引脚
#define LED_PORT GPIOB

//查看芯片上的引脚,来定义引脚
#define LED2_PIN GPIO_PIN_5
#define LED3_PIN GPIO_PIN_6
#define LED4_PIN GPIO_PIN_7

//定义宏名 来led灯传递高低点评
#define led2(a) (a?HAL_GPIO_WritePin(LED_PORT,LED2_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED2_PIN,GPIO_PIN_RESET))
#define led3(a) (a?HAL_GPIO_WritePin(LED_PORT,LED3_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED3_PIN,GPIO_PIN_RESET))
#define led4(a) (a?HAL_GPIO_WritePin(LED_PORT,LED4_PIN,GPIO_PIN_SET):HAL_GPIO_WritePin(LED_PORT,LED4_PIN,GPIO_PIN_RESET))

#define led2Toggle HAL_GPIO_TogglePin(LED_PORT,LED2_PIN);
#define led3Toggle HAL_GPIO_TogglePin(LED_PORT,LED3_PIN);
#define led4Toggle HAL_GPIO_TogglePin(LED_PORT,LED4_PIN);

void LED_Init();
#endif

led.c

#include "led.h"

void LED_Init(){
    //使能时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
    //初始化结构体
GPIO_InitTypeDef LEDInit = {0};
    //定义led引脚
LEDInit.Pin = LED2_PIN | LED3_PIN | LED4_PIN;
    //设置输出模式是推挽
LEDInit.Mode = GPIO_MODE_OUTPUT_PP;
	//不需要设置上下拉	
    //设置速度
LEDInit.Speed = GPIO_SPEED_FREQ_LOW;
    //调用初始化函数
HAL_GPIO_Init(LED_PORT,&LEDInit);
}

main.c

#include "stm32f1xx.h"
#include "led.h"

typedef uint8_t u8;
typedef uint32_t u32;

void delay(u32 times){
    int i;
    for(i = 0 ; i < times ; i++ );
    }
int main(){
    HAL_Init();
    LED_Init();
while(1){
    led2Toggle;
    delay(10000);
    }
return 0;
}

您可能感兴趣的与本文相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值