STM32总结一 STM32三种点亮LED灯方式的不同之处

发布者:码梦创想最新更新时间:2019-04-10 来源: eefocus关键字:STM32  LED灯 手机看文章 扫描二维码
随时随地手机看文章

STM32点亮LED灯有很多种方法。第一种是操作寄存器来点亮LED灯,(以GPIOC的第一个LED为例)操作的方法是首先在中文手册,首先要声明的是,手册里面看到的地址,都是字节,表示第多少多少个字节,然后这个数字对应一个字节位,所以每一个32位的寄存器占四个字节,找到block2(这个是外设区,所有的外设地址都在这个区)的基地址,然后加上第一段偏移地址,就越过APB1总线的内存区,到达了APB2总线这个区的基地址。然后再加上相对于APB2的偏移地址就可以定位出某个特定外设的基地址,这里所指的是GPIOC端口的基地址,然后再在这个端口外设基地址的基础上,加上相应的偏移地址,就可以定义出这个端口的寄存器地址,这些寄存器是紧紧的挨着的,一个接一个的,每个寄存器占四个字节。然后就参考手册的寄存器介绍图来编程,从而操作寄存器相应的位来实现引脚输入输出的不同,也就是配置寄存器实现相关的功能。(要注意的是:其实这里我们所定义的宏(也就是定义的地址)其实就是相关的寄存器的基地址,这个寄存器的全程还包括这个基地址以后的四个字节,其实这里定义的这个宏代表的就是这个寄存器,虽然它只用了每个寄存器的基地址来表示),其实都是一样的,每个数字对应着一个位。要让GPIOC的引脚0输出低电平的意思就是配置BSRR寄存器的BS0位为1。当然在配置这个之前,我们还需要了解GPIOC的基本结构(其实每个GPIO的结构都是一样的,这里用GPIOC引脚来举例子)和它的八种工作模式。这里需要着重说一下的是,除了模拟输入和模拟输出这两种工作模式用的是模拟量以外,其他的工作模式,如果是输入则从引脚处进去模拟量通过施密特触发器以后变成数字0和1,如果是输出则通过一个模拟量输出然后经过MOS管的处理变成了输出量为高电平和低电平,这里本质上就是把控制引脚输出高低电平的寄存器位设置为0或者1,然后会让相应的引脚输出高低电平。当然在配置寄存器让引脚输出高低电平之前,还需要配置其他的寄存器,让这个引脚位置有相应的工作模式和工作速度。这样就实现了LED点亮(本质上就是引脚位置输出了一个低电平接在LED灯的一端,LED灯的另一端接了一个VDD正电源,然后灯就亮了)。所有的点亮LED灯的操作说白了都是这个最基本原理,配置寄存器,输出低电平,点亮灯。在GPIO每个端口的某个引脚输出电平时,其实可以在输入端测出到底输出的是高电平还是低电平(测的原理就和输入原理一样)。


第二种方式用的是固件库模板点亮LED。这种方法的本质和第一种是一样的都是操作寄存器的位从而实现对应引脚输出不同的电平。使用这种方法首先需要创建一个模板,创建方式可以参考中文参考手册和开发攻略。然后再自己新定义一个函数,将用到的函数从已经定义好的库文件中调用出来即可。再在main.c函数中调用新定义的函数初始化寄存器即可。虽然与第一种方式不同,但实际上达到的效果是一样的(也就是说最后实现的配置结构是一样的,只是配置的方式并不相同)。


第三种方法是位带操作。


STM32所基于的ARM Cortex-M3内核引入了一种新颖的“位带”技术(英文称为Bit

Band),这种“位带”技术将部分其片内的部分称为“位带区”的存储区域和另外一部分称为“位带别名区”的区域映射起来。一个比较完整的描述是:Cortex-M3的内部存储空间有2个“位带区”,分别称为“SRAM位带区”和“外设存储位带区”,各自位于SRAM区和外设存储区各自最低的1MBit空间;并有对应的2个“位带别名区”,分别称为“SRAM位带别名区”和“外设存储位带别名区”,每个别名区大小为32MBit。“位带”技术将两个“位带区”的每一位分别映射带对应的“位带别名区”的一个“字”(即32位)的最低位上。图1展示了这种关系:


图1


图1中,左边的0x40000000表示“外设存储位带区”的起始地址,而右边的0x42000000则表示“外设存储位带别名区”的存储地址,0th Bit、1th Bit等表示从地址0x40000000依次往后的第0位,第1位等。右边的0x42000000表示STM32内部的“外设存储位带别名区”起始地址,而下面的0x42000000 – 0x420000010、0x42000010 – 0x420000020等则表示从地址0x42000000依次往后的第1个、第二个“字”空间。在此要注意到的是,STM32作为一款32位控制器,其数据总线当然是32位的,但其内部存储空间不仅支持32位存取,同时也支持8位(字节)、16位(半字)存取方式,因此其内部存储空间是按照最小存取长度(8位)来对齐的,以图1中的0x42000000 – 0x420000010为例,其存储空间的排列情况如下图2所示。假设想这段空间内写入数据0x12345678,则实际内容(假设是小端存储格式)如图3所示。


图2                                                                                                                          图3


8位长度的对齐方式决定了用户通过应用程序操作存储空间的最小长度为8位,亦即1个字节。因此如果要单独对某一“位”进行操作,则必须使用上文中所讲述的办法。


但通过这种“位带”技术进行存储空间的映射后,可以很轻易快捷的实现位操作。当对“位带别名区”的某一个“字”空间的最低位进行清除操作时,则对应的“位带区”所对应的“位”即会被清除,反之当对“位带别名区”的某一个“字”空间的最低位进行置位操作时,,则对应的“位带区”所对应的“位”也会被置位。这样一来,前文所讲述的“读出——修改——写入”就变成了只有“写入”的过程,这是一种非常典型的空间换时间的做法。也许有读者会疑问,这样岂不是损失掉了2个32MBit的存储空间?答案是这部分存储空间是通过映射技术“虚拟”出来的,STM32片内的这部分地址空间并没有物理存储介质存在。


下面通过一个简单的例子讲述如何实现STM32微控制器平台上的“位带”技术实现一个简单的点亮发光二极管的操作。其中发光二极管使用STM32的PA4引脚的输出高电平点亮,则只要在PA4引脚输出一个高电平,即可点亮该发光二极管。


通过查阅STM32的开发手册可以知道,要在PA4引脚输出高电平,则只需要在初始化完毕GPIOA设备之后对GPIOA的ODR寄存器的第4位写入一个“1”即可。这个目的很简单,重点是如何计算ODR寄存器的第4位在“位带别名区”中所对应的“字”空间地址。获取该地址的过程如下图4所示。


图4


事实上有了前文的描述,相信图4是比较容易理解的。图中自上往下最终推算出了GPIOA的ODR各个位的“位带别名区”的地址,可以看到ODR寄存器的第4位所对应的“字”空间地址为0x42210190。从STM32的开发手册上也可以获取“位带别名区”的字空间所对应的“位”:

bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)

上述公式中,bit_word_addr表示“位带别名区”字空间,bit_band_base表示对应的“位带区别名区”起始地址,byte_offset表示“位”在“位带区”中的字节偏移地址,bit_number则表示“位”在对应“位带区”字节中的位置。


以对GPIOA的ODR寄存器的第4位写入一个“1”为例,首先要找到ODR寄存器的第4位的“位带区”起始地址,字节偏移地址和在字节中的位置。其中“位带区”起始地址已知为0x42000000,而字节偏移地址由在图4找出为0x0001080C(注意是此处偏移地址,不是图中的绝对地址),同时位置为第4位,因此可以套用上述公式计算对应的“字空间”

bit_word_addr = 0x42000000 + (0x0001080C × 32) + (4 × 4) = 0x42210190

可知可图中推算的结果一致。因此,只要向地址为0x42210190的空间写入“1”即可点亮发光二极管。



关键字:STM32  LED灯 引用地址:STM32总结一 STM32三种点亮LED灯方式的不同之处

上一篇:STM32F103利用定时器2与串口接收指令控制LED亮度
下一篇:stm32 pwm 呼吸灯

推荐阅读最新更新时间:2024-03-16 16:27

基于STM32设计的酒驾报警系统
1. 前言 随着社会的发展和人们生活水平的提高,汽车已经成为人们出行的主要代步工具,与此同时,酒后驾车所引发的事故越来越多,对人们的生命安全带来了威胁。为了控制酒后驾车,本文设计了一款能够安装在车辆驾驶室内的酒后驾车监测系统。 系统主控芯片采用STM32,采用酒精传感器采集数据进行分析,如果发现酒精超标,会通过GPRS模块向指定的手机号码发送提醒短信;系统还带了一块LCD显示屏,可以实时显示检测的酒精含量,酒精超标后,本地蜂鸣器也会发出警报,提醒驾驶员。 测量酒驾的标准是: (1)饮酒驾车是指车辆驾驶人员血液中的酒精含量大于或者等于20mg/100ml,小于80mg/100ml的驾驶行为。(2)醉酒驾车是指车辆驾驶人员
[单片机]
基于<font color='red'>STM32</font>设计的酒驾报警系统
立达信率先采用复合材料制成LED灯泡散热片
     立达信光电采用沙伯基础创新塑料新款白色LNP Konduit复合材料制造LED灯泡散热片厦门(2011年3月10日)总部位于厦门的立达信光电利用一种新的复合材料作为铝制散热片的替代物,从而免去二次喷漆就能完成白色美观部件,通过注塑成型来提高生产效率,并且符合行业对电绝缘的要求。      立达信光电采用的是沙伯基础创新塑料的新款白色LNP Konduit热传导复合材料,具有外形美观、易于制造且散热性能优异的特点,有助于推动LED照明设备的普及。      "作为首家采用白色LNP Konduit复合材料制成散热片的照明设备制造商,我们通过为客户提供高效、美观的LED照明产品来引领整个行业的发展,”厦门立达信光电总
[电源管理]
STM32到TM4C123
我主要是最近看ACfly的代码时,发现他有的工程的文件的.s文件讲道理是启动文件不是STM32,而是TM4C123,我怀疑是TI的芯片,查了下果然是的,应该是电赛准备的。但是这里可以看到换成其他芯片也是有专门的启动文件的。 从51单片机到STM32再到TM4C123 目录 系统时钟 GPIO相关 通用定时器相关 PWM相关 UART通信相关 写在前面: 进入TI的学习,说明STM32 已经掌握的差不多了,没有掌握的很好也没关系,正好两块单片机对比着学习更能加深映像。这篇只是简单的介绍TI,篇幅比较短比,主要还是叙述了32和TI的不同的地方,相似的就没有再写出来,不能完全的拿来当作学习资料。 一点学习TI
[单片机]
从<font color='red'>STM32</font>到TM4C123
STM32 禁用swd-jtag下载口后,重新下载程序的方法
由于工作需要,复用了PA15的时候,程序禁用swd-jtag功能,网上多方查找解决方法。 在重新上电的时候,保证BOOT0为高电平,BOOT1为低电平,即可禁止程序从烧写过的代码启动,这时,重新烧写程序即可。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash。 2)SRAM=芯片内置的RAM区,就是内存啦。 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROROMM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位
[单片机]
STM32 keyboard USB键盘功能的实现
下面编写下USB键盘的程序,依然在CustomHID工程上修改。 依旧最先修改的是usb_desc.c文件。我们从设备描述符开始讲述。 设备描述符需要修改下bMaxPacketSize(最大包长度)域为0x08,因为被本次的工程最大通讯长度就是8字节,正好符合USB规范,所以这里改成0x08,还要注意在usb_prop.c的DEVICE_PROP Device_Property结构体里注册的最大长度也要是0x08,与设备描述符的要相同(我们在下文说到)。这里最好还要修改下PID和VID的域的值,以防该PID和VID对应的设备已经在电脑里有了驱动而导致功能不正常。 /* USB标准设备描述符*/ const uint8_t Keyb
[单片机]
stm32的定时器使用方法
STM32学习笔记(六)----TIM (待补充) 1、使能TIM时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE); 2、基础设置 TIM_TimeBaseStructure.TIM_Period 计数值 TIM_TimeBaseStructure.TIM_Prescaler 预分频,此值+1为分频的除数 TIM_TimeBaseStructure.TIM_ClockDivision = 0 时钟因子 待做进一步说明 TI
[单片机]
嵌入式设计:STM32自动量程电压表设计方案
方案中的整个系统可以用一块9V电池供电,实现了低功耗和便携功能。交流测量是用AD637真有效值转换芯片将交流信号转换成直流电压后测量;用带钳位保护的反向放大器进行输入电压转换,实现了10MΩ的输入阻抗和高安全性。电路中关键器件采用TI公司的精密运算放大器OPA07和仪表放大器INA128,实现了高精度的测量;ADC采用STM32f103ZET6片内自带的12位AD,实现了低功耗,量程自动切换功能。 0 引言 在智能仪器中,常常用到自动量程转换技术,这使得仪器在很短的时间内自动选取最合适的量程实现高精度的测量。自动量程的实现一般通过控制输入信号的衰减放大倍数实现,就电压表来说其输入测量电压会大于其AD 转换器的输入范围,所以
[单片机]
嵌入式设计:<font color='red'>STM32</font>自动量程电压表设计方案
STM32学习——两轮平衡小车之硬件设计
这篇文先写最开始的电路设计,之后会更新后续的代码编写和小车调试。 电路设计的基本过程一般是这样的:需求分析——元件选型——原理图设计——PCB设计——焊接调试。 需求分析:在这里,主要是确定小车需要哪些模块、外设或接口。首先,stm32最小系统是必须的,这是小车控制的核心。然后小车的两个轮子需要两个H桥驱动和编码器接口。需要陀螺仪感知小车的姿态(包括倾角,转向角,角速度等)。需要一些调试和指示用的外设(蜂鸣器,LED等)。需要电源电路为系统供电。需要电池电压采集电路来实时采集电池电压,做低压报警,防止电池过放。需要下载接口和调试用的串口。基本就是根据自己想要实现功能,然后确定需要那些部分的电路。 元件选型:为需要的各个
[单片机]
<font color='red'>STM32</font>学习——两轮平衡小车之硬件设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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