STM32入门之点亮LED灯(以STM32F103为例)

您所在的位置:网站首页 led灯与普通灯的换算方法 STM32入门之点亮LED灯(以STM32F103为例)

STM32入门之点亮LED灯(以STM32F103为例)

2024-07-11 20:50| 来源: 网络整理| 查看: 265

目录 一、原理简介1.1 原理图1.2 GPIO功能描述简介1.3 硬件连接 二、代码实现与原理分析(详细)2.1 代码实现2.2 配置步骤2.3 原理分析2.3.1 GPIOx_CRL、GPIOx_CRH2.3.2 GPIOx_BRR、GPIOx_BSRR 三、仿真测试3.1 软件逻辑分析仪DEBUG3.2 硬件效果 四、小结   写在前面的话:前面我们对新建工程文件以及STM32的时钟配置做了讲解,相信大家都有了一定的了解,对代码的大致框架以及STM32内部的时钟有了深入的认识,本次入门的第一讲最基础的就是对端口GPIO的应用。

一、原理简介 1.1 原理图

  首先我们先看一下自己的STM32开发板的原理图,以我使用的为例如图所示: 在这里插入图片描述   STM32F103VET6的单片机有足足100个引脚,端口分别是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE,每个端口下有分有GPIO_Pin0到GPIO_Pin15一共16个引脚,引脚有什么用,熟悉51单片机的同学可能会熟悉一些,可作为输入输出引脚,还可以作为串口等通信引脚等等,在STM32上引脚的功能大大提升,功能比51更加强大。

1.2 GPIO功能描述简介

  可以稍微看一下GPIO的功能描述,如图所示(图源自STM32参考手册): 在这里插入图片描述   可以看到控制引脚的寄存器很多,引脚的模式也很多,对于初学者不是很友好,这些寄存器我们在下一节代码里会再拿出来分析,下一节我们会学习代码究竟怎么实现对这些寄存器的配置的,这里先知道一下GPIO的寄存器,每个IO端口都有7个寄存器来控制,分别是:配置模式的2个32位的端口配置寄存器GPIOx_CRL和GPIOx_CRH,2个32位的数据寄存器GPIOx_IDR和GPIOx_ODR,1个32 位的置位/复位寄存器GPIOx_BSRR,1个 16位的复位寄存器GPIOx_BRR;1个32 位的锁存寄存器GPIOx_LCKR。本节我们主要关注和用到的寄存器是CRL、CRH、BRR、BSRR寄存器。

1.3 硬件连接

  本文我们要完成的是点亮LED,从最简单的角度去思考,我们需要做的就是让一个端口输出高电平或者低电平实现点亮或者关闭LED灯的效果,我们先来看一下硬件连接图: 在这里插入图片描述   我购买的开发板上只有一个LED灯可够编程,因此我只需要实现对PB0即GPIOB.0引脚的配置和操作,PB0设置低电平LED点亮,高电平LED熄灭。   

二、代码实现与原理分析(详细) 2.1 代码实现

  按照我们之前新建工程的博文的格式规范,我们先在工程文件user文件夹下新建名为led的文件夹,并创建led.c和led.h文件,如下图所示: 在这里插入图片描述   代码如下: led.c:

#include "led.h" //LED 初始化程序 void led_init(void) { GPIO_InitTypeDef GPIO_LED; //定义GPIO结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口的时钟 GPIO_LED.GPIO_Pin = GPIO_Pin_0; //LED端口配置 GPIO_LED.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_LED.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度为2MHz GPIO_Init(GPIOB, &GPIO_LED); //根据设定参数初始化GPIOB0 GPIO_SetBits(GPIOB,GPIO_Pin_0); //GPIOB0输出高电平,初始化LED灭 }

led.h:

#ifndef __LED_H #define __LED_H #include "main.h" void led_init(void); #endif

main.c:

/* STM32F103VET6 SYSCLK = 72M HCLK = 72M APB1 = 36M APB2 = 72M */ #include "main.h" int i,j; int main(void) { led_init(); //LED初始化 while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_0); //点亮LED for(i=0;iGPIO_Mode) & ((uint32_t)0x10)) != 0x00) { /* Check the parameters */ assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); /* Output mode */ currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; } /*---------------------------- GPIO CRL Configuration ------------------------*/ /* Configure the eight low port pins */ if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) { tmpreg = GPIOx->CRL; for (pinpos = 0x00; pinpos


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3