STM32之LED配置

发布者:anluran最新更新时间:2020-08-27 来源: eefocus关键字:STM32  LED  配置 手机看文章 扫描二维码
随时随地手机看文章

最近准备开始学习stm32,当然51的学习也会一起进行,如开头所讲,希望每天都能有所收获吧!!!菜鸟思维,写的可能会有一点繁琐,但是我觉得学习是要一步一步来的,也希望自己可以把每一点都弄懂,嗯,就是这样


开始学习之前当然要先搭建好学习环境,关于软件的下载以及工程搭建,CSDN上有很多博主写的都很详细,下面给出两篇参考博客,也是我在学习过程中借鉴的博客(博主写的可以说超级详细了):

  • https://blog.csdn.net/qq_34952376/article/details/81166033

  • https://blog.csdn.net/ReCclay/article/details/86616210


stm32编程方式有两种:一种是直接操作寄存器,另一种是配置库函数, emmm,感觉大多数情况下还是库函数比较好用,配置寄存器的话要记的东西比较多,感觉我也记不住,哈哈。但是关于寄存器的知识我们还是要了解的,具体知识可以参照《STM32中文参考手册》来学习,下面我们来说说怎么实现LED的配置的。


开始写配置LED的函数之前,我们还是和学习51时一样,需要先看一下原理图,明确一下LED的电路结构:
在这里插入图片描述
从原理图上我们可以看到:单片机的各个引脚是通过一个573锁存器和LED相连的,这个573我们在51里也很常见,需要注意的就是只有在使能573的情况下才能实现端口数据的传输,也就是说我们需要把N-LE对应的引脚拉高。


接下来我们找一下红线框部分对应的引脚(emmm,这里和51就不太一样,可以看一下图)
在这里插入图片描述
在这里插入图片描述
上面分别是J1和J2两个排针,上面的引脚是一一对应的,从开发板上我们也可以看到,这两个排针的对应引脚是用跳线帽连接在一起的(感觉很方便呀)
N-LE对应的是PD2,而D0到D7这八个LED分别对应PC8-PC15

那么LED的配置是配置什么呢?
引脚模式,也可以理解成一种初始化函数,具体步骤是:配置端口时钟(时钟使能),设置引脚号,设置引脚速率,配置端口模式,配置输出数据。

下面我们就按照步骤来一步一步完成LED的配置:

  • 配置端口时钟
    明确: STM32的GPIO外设是挂接在APB2总线上的,所以要完成使能我们就需要设置APB2外设时钟使能寄存器,这时候可以查阅手册看一下APB2外设时钟使能寄存器的相关知识:
    在这里插入图片描述
    图上红色线框部分是GPIO外设的相关时钟,而我们从原理图上可以得知,LED配置需要使能的时钟是:GPIOC(IO端口C)和GPIOD(IO端口D)
    在这里插入图片描述
    置1表示使能
    下面我们用两种方法来实现一下时钟的使能,也顺便理解比较一下stm32编程的两种方法:

  1. 配置寄存器法:
    在stm32f10x.h文件(库函数内)中我们可以找到外设时钟使能寄存器的相关定义:
    在这里插入图片描述
    RCC的声明,使用RCC_TypeDef类型指针对RCC端口时钟地址进行强制类型转换,也就是说把RCC_BASE强制转换成一个结构体指针,然后通过宏定义,替换成用RCC表示的,这样我们在结构体中定义的各个变量也就相应的移植到了RCC内部的地址空间。
    在这里插入图片描述
    好了,明确了上面的那些内容,我们就可以进行相应时钟(GPIOD和GPIOC)的使能了,GPIOC和GPIOD分别对应位4和位5,所以我们下面要做的就是让APB2外设时钟使能寄存器的位4和位5置1,看代码:

RCC->APB2ENR |= (1 << 4);//使能GPIOC时钟

RCC->APB2ENR |= (1 << 5);//使能GPIOD时钟


我们上面解释过了RCC是一个结构体指针,APB2ENG是这个结构体内部声明的一个变量,所以在调用时就需要用 “->” 这个符号,下面以使能GPIOC为例解释一下为什么可以实现位4置1:
先来看1 << 4:1用16进制表示出来是:00000001,左移四位变成了00010000;RCC->APB2ENR |= (1 << 4),APB2外设时钟使能寄存器的复位值是00000000,和00010000进行或运算,结果是:00010000,实现了位4置1,并且不改变其它位
注意:位是从0 开始表示的,所以位4实际上就是第5位

  1. 调用库函数法:
    STM32有着非常好用的库函数,功能很全也很多,其中就有初始化时钟的函数,在stm32f10x_rcc.h文件中可以找到相关定义,然后可以点击函数名按快捷键F12,直接定位到函数体,然后我们就可以明白各个变量的含义了:

第一个变量表示使能哪一个时钟,NewState表示使能(ENABLE)还是不使能(DISABLE)
在这里插入图片描述
看代码:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOD和GPIOC


/*还可以分开写*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOD


  • 设置引脚相关:
    引脚号,引脚速率,引脚模式,也就是初始化引脚配置,我们这里就直接用库函数配置的方法来做:
    STM32的IO模式(引脚模式)有8种:模拟输入、浮空输入、上拉输入、下拉输入、通用推挽输出、通用开漏输出、复用推挽输出、复用开漏输出,这8种模式比较重要,想要详细了解的话,可以参照下面的博客:
    https://blog.csdn.net/techexchangeischeap/article/details/72569999
    此外输出模式还包括3种输出速率,emmm,可以想见我们的库函数里对于这一部分肯定也是用结构体封装的。
    在stm32f10x_gpio.h文件里我们可以找到相关定义:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在stm32f10x_gpio.h文件里我们可以找到对应的端口引脚定义:
    在这里插入图片描述

ok,现在我们来写引脚模式配置的部分,以GPIOD(PD2)为例说明:
思想就是:先定义一个GPIO_InitTypeDef类型的结构体变量,然后为这个结构体的各个变量赋值,然后再调用初始化函数

GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体变量


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//设置引脚号

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置引脚速率10MHZ

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置为通用推挽输出模式

GPIO_Init(GPIOD, &GPIO_InitStructure);//调用初始化函数,初始化引脚配置


关于初始化函数,在stm32f10x_gpio.h文件里可见定义,还是同样的操作,按快捷键F12,找到对应的函数体:
在这里插入图片描述
关于GPIOC相关引脚的配置,在设置引脚号时有技巧:
我们如果一个一个引脚定义的话,需要从PC8定义到PC15,太麻烦了,我们可以把对应的地址相加,得到结果是0xFF00,就实现了这8个引脚号的配置了:
在这里插入图片描述

  • 配置输出数据:
    说白了就是给我们上面定义的引脚赋一个初值(我们默认上电LED的状态是关闭的,所以这里要把相关引脚拉高),但是要注意LED相关引脚的赋值要在使能573的情况下进行,这里我们可以操作寄存器,也可以操作相应的库函数,emmm,前面对两种方法已经作了比较,这里就不过多说明,我觉得这里操作寄存器比较方便,就说下操作寄存器的方法吧:
    这里就又涉及到了一个知识,就是GPIO端口寄存器的结构,读者可以在手册上查找到相关内容,这里我只说一下端口输出数据寄存器(要用到的):
    在这里插入图片描述
    这个部分和RCC时钟配置差不多,思想也是一样的,相关结构体的定义在stm32f10x,h文件里可以找到,下面贴出:
    在这里插入图片描述
    一样的思想,还是强制类型转换,通过宏定义将GPIOA等定义为和GPIO_TypeDef同类型的结构体指针
    在这里插入图片描述

  • 看代码:

  • GPIOC->ODR |= 0xFF00;//将PC8-PC15引脚拉高

  • GPIOD->ODR |= (1 << 2);//拉高PD2,使能573

  • GPIOD->ODR &= ~(1 << 2);//关闭使能


  • 下面是完整代码:


  • #include "stm32f10x.h"


  • void LED_Init(void)

  • {

  •     GPIO_InitTypeDef GPIO_InitStructure;

  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOD和GPIOC

  •     

  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//设置引脚号

  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置引脚速率10MHZ

  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置为通用推挽输出模式

  •     GPIO_Init(GPIOD, &GPIO_InitStructure);//调用初始化函数,初始化引脚配置

  •     

  •     GPIO_InitStructure.GPIO_Pin = 0xFF00;

  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  •     GPIO_Init(GPIOC, &GPIO_InitStructure);

  •     

  •     GPIOC->ODR |= 0xFF00;//将PC8-PC15引脚拉高

  •     GPIOD->ODR |= (1 << 2);//拉高PD2,使能573

  •     GPIOD->ODR &= ~(1 << 2);//关闭使能

  • }


  • 完毕~~


  • emmm,再给一个测试例程吧,实现L1每隔1s闪烁:


  • #include "stm32f10x.h"

  • #include "led.h"


  • u32 TimingDelay = 0;


  • void Delay_Ms(u32 nTime);


  • //Main Body

  • int main(void)

  • {

  •     SysTick_Config(SystemCoreClock/1000);

  • LED_Init();

  •     

  • while(1)

  •     {

  •         GPIOC->ODR ^= (1 << 8);

  •         GPIOD->ODR |= (1 << 2);

  •         GPIOD->ODR &= ~(1 << 2);

  •         Delay_Ms(1000);

  •     }

  • }


  • void Delay_Ms(u32 nTime)

  • {

  • TimingDelay = nTime;

  • while(TimingDelay != 0);

  • }


  • 解释一下 “GPIOC->ODR ^= (1 << 8);” 介个东东:

  • ^异或符学过51的应该不陌生,很好用,这个异或是按位异或,对每一位都执行操作的,我们每隔1000ms让GPIOC->ODR中的数据和(1 <<8)相异或,也就是实现第8位每隔1s取反,视觉上就是L1每隔1s闪烁了:

  • GPIOC->ODR初始化数据:11111111

  • (1 << 8):10000000

  • 按位异或 GPIOC->ODR ^= (1 << 8):01111111

  • 实现了第8位每隔1s取反的操作~~~

关键字:STM32  LED  配置 引用地址:STM32之LED配置

上一篇:【STM32】HAL库 STM32CubeMX教程九---ADC
下一篇:STM32——GPIO设置:快速点亮第一个LED灯

推荐阅读最新更新时间:2024-11-12 19:00

STM32系列第15篇--灵活的静态存储控制器FSMC
FSMC特性 FSMC管理1GB空间,拥有4个Bank连接外部存储器 每个Bank有独立的片选信号 每个Bank有独立的时序配置 同步批量传输访问最高频率可达60MHz fCLK= HCLK /2 静态地址映射存储器支持的存储器类型 SRAM PSRAM NOR/ONENAND ROM LCD接口-支持8080和6800模式 NANDFlash和16位PCCard,NAND Flash具有硬件ECC 结构 FSMC分为四块BANK,每块各占256M字节空间,每块分为四个区,每个区占64M。 NOR/PSRAM 256M字节的空间需要28根地址线寻址 HADDR是内部AHB地址总线 HADDR 来自外部存储器
[单片机]
<font color='red'>STM32</font>系列第15篇--灵活的静态存储控制器FSMC
东南DX7空间大、配置高、关键还省油,这样的SUV你会考虑吗?
    东南DX7   新车指导价:9.69-13.99万   东南DX7最大的亮点在于外观造型由东南汽车和著名的宾尼法利纳设计公司共同打造,动感大气,没有使用常见的“大嘴”设计,也没有过分地使用镀铬装饰。   东南DX7的内饰设计也能吸引不少人的眼球,棕黑搭配的车内不沉闷,做工也较为精细。该车的方向盘运动感较强,仪表盘显现出的效果不乏科技感,中控台造型简洁,竖立在上面的屏幕是个亮点。   动力方面,东南DX7前期配备的是来自沈阳航天三菱的4A91T 1.5T发动机,最大功率156马力,峰值扭矩215牛。米,有6速手动或5速自动变速箱可选。   出自宾尼法利纳设计团队之手的东南DX7,其外形设计是其加分项,而内
[汽车电子]
基于STM32从零写操作系统系列---用GDB调试LED程序
目的 通过调试程序,观察程序的运行情况。主要是简单介绍程序的调试方法,当然相对于一些集成开发环境,这种调试方法就显得有点落后了。由于我坚持不使用集成开发环境,所以只能这样了。 要求 安装TrueSTUDIO for STM32,这是STM32官方免费的集成开发环境。安装这个IDE的目的只有一个,就是使用它的GDBServer。 实验步骤 1.使用《基于STM32从零写操作系统系列---点亮LED灯》这篇文章的源代码。 2.下载TrueSTUDIO for STM32。 3.安装TrueSTUDIO for STM32软件。正常安装就可以,没有特别的设置。 4. 在命令行中,进入led_proj文件夹,输入mak
[单片机]
基于<font color='red'>STM32</font>从零写操作系统系列---用GDB调试<font color='red'>LED</font>程序
球形光度计计量LED总光通量的关键技术解析
球形光度计是用测量 LED产品 光通量和光效的一种高效快速的设备,涉及光通量测量的计量机构、产品检测中心和企业质控部门,是目前用于 LED 光通量和光效检测的最主要设备。如何合理使用球形光度计获得准确的光通量值是测试人员普遍关心的问题。本文将尝试讨论球形光度计计量LED总光通量的关键技术要点。    1 球形光度计原理   球形光度计是利用积分球测量光源总光通量的光度计,基本结构见图1。光源S放在积分球内(常见位置是球中心位置的4π测量方式,或者球壁附近的 2π测量方式),光探头D在球壁上贴着探测孔。该孔在球壁上,并放置有漫射器。若探头D是光度探头,其输出电流经I/V转换成电压,最后在读数仪表R上显示出来;若探头D是光纤收集面,
[电源管理]
球形光度计计量<font color='red'>LED</font>总光通量的关键技术解析
大众测试自动泊车 将在2020年配置该技术
据外媒报道,大众计划在2020年为旗下量产车型配置自动泊车功能。大众、奥迪及保时捷均在汉堡机场测试该项技术。 在测试场景中,用户利用一款应用,在汉堡机场预定一个停车位,等驱车至多层停车场入口处时转身离去,由车辆自行完成泊车操作。所有的操作都将由车辆自动完成:车辆寻找空置的停车位,如必要,还会停在电动车充电站处进行充电,上述操作完全基于停车场的地图来实现。 只需在多层停车场内安装简单易懂的图形标志(simple pictorial markers),就能为车辆提供方向指引,所有停车场都采用了该方法。 该自动泊车测试项目在汉堡机场进行,是大众集团与汉堡市移动出行战略合作的重要组成部分,双方旨在将汉堡市发展为未来城市移动出行的模范城市。
[汽车电子]
STM32 SysTick配置函数
之前使用SysTick滴答定时器都是通过查找内核编程手册配置寄存器让SysTick滴答定时器工作的。其实在内核相关的头文件core_cm4.h中已经有SysTick滴答定时器的相关配置了。 条件__Vendor_SysTickConfig == 0成立,配置函数才能使用。 刚好在stm32f4xx.h中定义了__Vendor_SysTickConfig = 0,所以可以使用该配置函数。 观察函数__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks),其中的寄存器和我们在Systick查询定时中用到的寄存器其实是一样的。 __STATI
[单片机]
<font color='red'>STM32</font> SysTick<font color='red'>配置</font>函数
基于温度反馈控制的RGB汽车氛围灯应用研究
  随着人们对于汽车个性化、舒适性的要求逐渐提高,可变色的全彩汽车内饰氛围灯逐渐成为一种新的趋势。应用在汽车中的 LED 在使用寿命和可靠性等方面比普通LED的要求高很多,随着汽车级RGB单封装LED的出现,RGB氛围灯的设计也变得越来越灵活,比采用三颗R、G、B不同颜色的汽车级LED颗粒,更节省车内有限的宝贵空间,且混光更均匀。同时汽车内饰背光及其氛围灯对于颜色和亮度一致性要求很高,由于氛围灯的安装位置和工作温度各不相同,RGB中任何一个的颜色或亮度的变化都会引起最终混光的颜色和亮度变化,因此颜色一致性的控制成为RGB氛围灯的应用难点。本文从RGB混光的基本原理和LED的特性出发,探讨了基于温度探测反馈的RGB汽车氛围灯颜色一致
[电源管理]
基于温度反馈控制的RGB汽车氛围灯应用研究
LED发光二极管特性测试(一)
   1 引 言   目前半导体 发光二极管 (LED)已经被广泛应用于指示灯、仪表显示、手机 背光源 和车载光源等 照明 领域。本文搭建的LED特性测试系统,具有结构简单、综合性强、耗费资金少的优势,可直接测量LED的伏安特性、光强分布特性、光谱特性、光功率和电流关系特性以及发光效率和电流关系特性;间接计算LED的发光波长、正常工作电压和半值角、光通量和发光效率。这些工作不仅丰富了普物实验的教学内容,使学生理解电子跃迁、空穴的形成以及光强、光照度等基本概念,还可以深入、全面地研究LED的特性。    2 实 验   2.1 实验器材   实验器材包括:精密数显直流稳流稳压电源、照度表、光功率计、分光计、直尺、
[电源管理]
<font color='red'>LED</font>发光二极管特性测试(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved