STM32F103第一个实验点亮LED

作为简单但非常有效且有趣的STM32入门级实验,点亮LED是所有人都躲不开且不会拒绝的小实验。他不仅步骤简单,也可以大致了解我们STM32板和HAL库的一些性质,所以这个实验在STM32板子学习过程中有着无与伦比的重要性。

首先我们先了解一下STM32板子里LED的结构。

我们可以看到这个LED灯的结构是上接一个3.3V的电源,通过串口LED1和LED0来控制亮灭的,也就是当这两个串口输出0(即低电平)时,LED0亮。其中我们可以看到LED0的串口为PB5,即GPIOB的PIN5.

那么接下来就针对这个结构我们编写关于LED的头文件和函数文件

led.h:

#ifndef __LED_H
#define __LED_H

#include "./SYSTEM/sys/sys.h"

void led_init(void);

#endif

这个头文件是申明在led.c中所需要用到的函数和需要提前调用的其他头文件,比如sys.h就是stm32的一个系统头文件,包含了调用其他stm32系统头文件路径,比如stm32f1xx_hal_gpio.h,这个头文件就包含了我们点亮LED所需要调用的串口PB5的路径。

led.c

#include "./BSP/LED/led.h"

void led_init(void){
    GPIO_InitTypeDef gpio_init_struct;

    __HAL_RCC_GPIOB_CLK_ENABLE();

    gpio_init_struct.Pin = GPIO_PIN_5 ;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP ;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW ;

    HAL_GPIO_Init( GPIOB , &gpio_init_strcut);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET );

}

接下来对这些程序和函数的作用进行解释

1.GPIO_InitTypeDef :这个是对GPIO模块进行初始化的结构体,包含了以下几个成员Pin, Mode, Speed, Pull,在未来笔者会单独出一章对这些结构体成员进行比较详细的解释,因为这里的结构体成员内容比较庞大,暂不展开。

在这里,我们需要把这个结构体成员分别进行如下初始化:

PIN(管脚):设置为第五个管脚,对应我们的PB5;

Mode:模式我们设置为输出的推挽模式(未来会解释,敬请期待~)。

Speed:这里对GPIO的处理速度没有很高的要求可以设置为低速,也可以设置为高速,低速相对对芯片的调用和能耗都会小很多。

Pull:推拉模式,这里我们不需要设置,因为配置输出模式时,上下拉电阻无法与引脚产生硬件连接,是被旁路掉的,相当于是不被允许设置的,所以我们就不设置。

2. __HAL_RCC_GPIOB_CLK_ENABLE():这个函数是启动GPIOB的时钟,只有这样GPIOB才会起作用,从原理上看,我们的单片机在读写的时候会发出两部分信号,一个是通过寄存器的相应字节位判断相应读写操作的,另一个是时钟信号,用于对照,只有在时钟信号为高电平的时候的指令才会被读取。

3.HAL_GPIO_Init():这个是对相应GPIO进行初始化的函数,比如本函数中,我们就是把我们的结构体初始化完成之后赋值给GPIOB,这个相当于我把作业写好交给老师,这样理解可能会比较容易。注意我们这个函数的第二个参数是句柄指针,所以我们要对我们初始化的句柄取地址。

4. HAL_GPIO_WritePin():这个函数是对我们的相应串口进行读写操作的,我们这里是把他初始化了。

typedef enum
{
  GPIO_PIN_RESET = 0u,
  GPIO_PIN_SET
} GPIO_PinState;

这里我们可以看到它的值就是1。

接下来我们编写main主函数

duimain.c:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/delay/delay.h"

int main(){
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    led_init();
    
    while(1)
    {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
        delay_ms(500);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
        delay_ms(500);
    }

}

对程序中的函数进行解释:

1. HAL_Init():初始化HAL库内容。

2. sys_stm32_clock_init(RCC_PLL_MUL9):设置时钟为72MHz

3. delay_init():初始化延迟器

4. led_init():初始化LED灯

然后我们在while循环里反复改写LED灯的PIN值,达到亮灭的效果。

我们也可以调用成熟的led.h(下载的成熟程序源码库)中的HAL_GPIO_TogglePin()函数,写成如下形式

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/delay/delay.h"

int main(){
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    led_init();
    
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
        delay_ms(500);
    }

}

这个TogglePin函数的作用就是反转这个pin值,(pin值一开始为1)也能达到我们预期的效果。

那么点亮LED灯的实验介绍就到这里了,对后续的一些介绍笔者会持续更新。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值