打印
[应用相关]

如何利用C语言寄存器去实现一种流水灯呢

[复制链接]
647|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
什么叫寄存器映射?寄存器到底是什么?
如何利用C语言寄存器去实现一种流水灯呢?
一、STM32F103系列芯片的存储器映射和寄存器映射原理

1.存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址 的过程就称为存储器映射,具体见下图。如果给存储器再分配一个地址就叫存储器重映射。
存储器区域功能划分
在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个 块也都规定了用途,具体分类见表格 6-1。每个块的大小都有 512MB,显然这是非常大的,芯片厂商在每个块的范围内设计各具特色的外设时并不一定都用得完,都是只用了其中的 一部分而已。

2.寄存器映射
我们知道,存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫 寄存器映射?寄存器到底是什么?
在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共 32bit, 每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到 每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通 过这种地址的方式来访问,不仅不好**还容易出错,这时我们可以根据每个单元功能的 不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个 给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
比如,我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C(至于这 个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是 32bit,低 16bit 有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指 针的操作方式,让 GPIOB 的 16 个 IO 都输出高电平。
二、 用C语言寄存器实现流水灯



三、总结

通过查阅资料与请教,慢慢的理解了stm32的工作原理,以及串行口的转换关系,基本掌握了软硬件结合的实验。

使用特权

评论回复
沙发
qiufengsd| | 2023-11-11 13:49 | 只看该作者
可以使用数组来存储每个流水灯的状态

使用特权

评论回复
板凳
sdCAD| | 2023-11-11 14:12 | 只看该作者
使用循环遍历GPIOA的所有引脚,设置相应的位为高电平或低电平。

使用特权

评论回复
地板
geraldbetty| | 2023-11-11 14:26 | 只看该作者
对整个流水灯控制系统进行测试和调试,确保流水灯能够按照预期的方式进行控制。

使用特权

评论回复
5
zerorobert| | 2023-11-11 15:18 | 只看该作者
可以使用GPIO_SetBits()函数来设置GPIO引脚的输出状态。

使用特权

评论回复
6
febgxu| | 2023-11-11 15:49 | 只看该作者
可以使用一个while循环来持续控制GPIO引脚的输出状态。

使用特权

评论回复
7
pl202| | 2023-11-12 09:30 | 只看该作者
流水灯需要在每个时间间隔内只有一个LED点亮,其余LED均为熄灭状态,流水灯可以通过循环左移实现。

使用特权

评论回复
8
burgessmaggie| | 2023-11-12 12:53 | 只看该作者
在主循环中轮询这些寄存器来决定何时改变灯光的状态,或者使用中断来在特定事件发生时自动更新寄存器。

使用特权

评论回复
9
wilhelmina2| | 2023-11-12 15:28 | 只看该作者
在循环控制逻辑中,需要根据具体的流水灯效果要求进行处理。

使用特权

评论回复
10
albertaabbot| | 2023-11-12 16:34 | 只看该作者
循环左移是将操作数的二进制位按1位进行循环左移,移出的位并不会丢失

使用特权

评论回复
11
gygp| | 2023-11-12 22:47 | 只看该作者
总线方法实现流水灯。              

使用特权

评论回复
12
linfelix| | 2023-11-13 11:06 | 只看该作者
流水灯需要在每个时间间隔内只有一个LED点亮,其余LED均为熄灭状态,流水灯可以通过循环左移实现。

使用特权

评论回复
13
wengh2016| | 2023-11-13 13:16 | 只看该作者
用寄存器控制8个LED流水灯效果的

使用特权

评论回复
14
bartonalfred| | 2023-11-13 14:57 | 只看该作者
在主循环中轮询这些寄存器来决定何时改变灯光的状态,或者使用中断来在特定事件发生时自动更新寄存器。

使用特权

评论回复
15
albertaabbot| | 2023-11-13 17:52 | 只看该作者
利用C语言寄存器去实现一种流水灯需要先对GPIO引脚进行初始化,然后配置GPIO引脚的输出状态,并通过循环控制逻辑来实现流水灯效果。

使用特权

评论回复
16
sesefadou| | 2023-11-19 11:20 | 只看该作者
每秒钟移动一位,你可以每秒钟将当前灯的位置加一,然后将下一个灯的位置更新为此位置。

使用特权

评论回复
17
minzisc| | 2023-11-19 11:58 | 只看该作者
利用C语言寄存器去实现一种流水灯需要先对GPIO引脚进行初始化,然后配置GPIO引脚的输出状态,并通过循环控制逻辑来实现流水灯效果。

使用特权

评论回复
18
vivilyly| | 2023-11-19 22:38 | 只看该作者
可以根据时间间隔来控制GPIO引脚的输出状态变化,从而实现流水灯的效果。

使用特权

评论回复
19
sesefadou| | 2023-11-20 13:15 | 只看该作者
用寄存器控制8个LED流水灯效果的

使用特权

评论回复
20
mikewalpole| | 2023-11-20 13:41 | 只看该作者
可以使用for循环、延时函数等实现流水灯的效果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

528

主题

1720

帖子

0

粉丝