历史上的今天
返回首页

历史上的今天

今天是:2025年04月10日(星期四)

正在发生

2019年04月10日 | STM32总结一 STM32三种点亮LED灯方式的不同之处

2019-04-10 来源:eefocus

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”即可点亮发光二极管。



推荐阅读

史海拾趣

ETA-USA公司的发展小趣事

随着业务的发展和市场的扩大,ETA-USA开始在全球范围内布局。公司先后在中国、欧洲等地设立了分公司或办事处,以更好地服务当地客户。这一全球扩张策略不仅增强了公司的市场竞争力,也为其带来了更多的商业机会和合作伙伴。

广东爱晟电子(exsense)公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,爱晟电子始终坚持以创新驱动发展。公司不断投入研发资金,加强研发团队的建设,推动技术的不断进步和创新。同时,公司还积极探索新的应用场景和市场领域,为未来的发展奠定了坚实的基础。这些努力使得爱晟电子在电子行业中保持了持续的发展势头和竞争力。

ASI [ASI Semiconductor, Inc]公司的发展小趣事

随着电子行业的快速发展,许多电子产品型号逐渐停产或变得稀缺。ASI敏锐地捕捉到了这一市场变化,并开始专注于生产停产及稀缺元器件的替代或新设计。其RF功率晶体管生产线主要提供Motorola、Philips及SGS Thomson公司的替代型号,而微波二极管生产线则主要提供HP、M/A-COM、Alpha及Loral/Frequency sources公司的替代型号。这一策略不仅满足了市场的需求,还进一步巩固了ASI在行业中的地位。

Compostar Technology Co Ltd公司的发展小趣事

随着产品线的不断丰富,Compostar Technology Co Ltd开始积极寻求市场拓展。公司通过与国内外知名电子品牌建立战略合作关系,成功将产品打入国际市场。同时,公司还积极参加各类行业展会和技术交流会,与业界同行建立了广泛的联系。这些努力不仅为公司带来了更多的商机,也进一步提升了公司的知名度和影响力。

Falco Electronics公司的发展小趣事

Falco Electronics非常重视企业文化建设。公司倡导“以人为本”的管理理念,注重员工的成长和发展。公司为员工提供了良好的工作环境和福利待遇,还定期开展各种培训活动,帮助员工提升技能水平。这种良好的企业文化吸引了大量优秀人才的加入,也为公司的持续发展提供了有力保障。

Frequency Devices公司的发展小趣事

为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。

问答坊 | AI 解惑

数据采集资料

数据采集,大家多交流问题,多提问!…

查看全部问答>

什么是单片机?单片机有什么用?

单片机又称单片微控制器]它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与 ...…

查看全部问答>

基于arm的大楼灯光控制器需要的硬件设备.

这是我的毕业设计题目,还不知道怎么做,希望得到帮助! …

查看全部问答>

关于NDIS显示数据包内容的问题

如果我要在NDIS中间驱动层拦截网络数据包,那么,如果要把NDIS中间驱动层中截获的一个NDIS封包全部输出来,包括头还有数据部分,以二进制的形式全部显示出来,应如何实现呢?…

查看全部问答>

To 一个简单的提问

我现在想开发一款USB驱动程序,我目前 的操作系统是Win2003,请问使用win2003DDK开发的驱动程序,能够在WIN2000及XP上使用吗?DDK有什么要求吗?谢谢,见笑了.…

查看全部问答>

遇到这事,你怎么办?

接到了二个offer,一个是作电子词典嵌入式开发,一个是作linux计费开发,现在不知去哪个好? 我以前的工作是在linux下的开发,但我有很想往嵌入式那边尝试,但现在不知道作电子词典开发有没有前途?因为那家公司的电子词典的操作系统不是linux,也不 ...…

查看全部问答>

信号切换问题

A,B两路信号选择一路通过,当然这是两路都有信号的情况,如果只有一路有就直接让它通过就是了.现在我用的是ls123触发器来判断哪路有信号但是试验板做出来老是有问题不知道还有没有别的什么思路不用ls123触发器.谢谢希望高手指点…

查看全部问答>

DS1302有关问题求指教

在定入单字节中为什么是for(i=0;i>1;         sck=1;         }这个时候的SDA是怎么样放的,为什么是与上0X01呢?而读出单字节的for(i=0;i>1;               &nbs ...…

查看全部问答>

拜托大家帮帮忙,电子秤的程序,帮我看看哪里错了,谢谢!!!

#include   \"60S2_V3.h\"    char bdata bittest ; sbit TIbit = bittest ^ 0 ; unsigned long i , sum = 0 , result = 0 , temp , ASC[] , count ; u8 T_COUNT , adc_hi , adc_low , a , sign ; void main(void) { / ...…

查看全部问答>

困扰我多久的问题,望高手解答

下面一个问题,已经困扰我很久了,一直找不到罪魁祸首,希望有高手帮我解答,非常感谢! 问题背景: 1.此项目为BLDC电机供电,提供310V,15V,GND,电机的VSP与FG由其他控制板输出或接收 2.附件原理图只是电源部分的简要示意图,非完整原理图, ...…

查看全部问答>