STM32/STM8技术论坛
直播中

Fingalxv

3年用户 27经验值
擅长:嵌入式技术
私信 关注
[问答]

大家好,请教一个stm32的FSMC中的指针问题

1.

本人在正在学习野火stm32教程,学到了FSMC驱动LCD屏幕这一章,大致就是通过FSMC的地址映射,采用指针来访问stm32内部SRAM的方式来访问液晶驱动芯片ILI9341的FLASH内的16位数据,问题代码在于这里:

#define ILI9341_CMD_ADDR (__IO uint16_t*)(0x60000000)

#define ILI9341_DATA_ADDR (__IO uint16_t*)(0x60020000)

我们将stm32内部SRAM的地址强制类型转换成指针,再用指针来访问后面的地址,我想请问一下大家:stm32的地址总线是32位的,这里将一个32位的地址转换成了16位的指针,为什么是这样的,难道不应该是
#define ILI9341_DATA_ADDR (__IO uint32_t*)(0x60020000)

这样子转换吗?

2

之前学习FMSC访问SRAM时同样出现类似疑问,外部SRAM支持8位,16位的访问,于是就有了类似以下的代码

#define DATA_ADDR (__IO uint8_t*)(0x60000000)

#define DATA_ADDR (__IO uint16_t*)(0x60000000)

将内部地址强制转换成了8位和16位的指针,这又是为什么?这个指针指向的不是内部SRAM的地址吗?如果是,这样子转换不会导致数据丢失吗,如果不是,这个指针又是指向哪里?难道是直接映射到外部SRAM里面了吗?

恳请求教,十分感谢!

已退回5积分

回帖(3)

黄先生

2022-8-26 16:00:13
这个我用白话文讲吧。
有一栋高楼有1000层,每层有1000个房间,每个房间有1000个小房间,每个小房间都有独立的房间号。其中2楼是饭店,3是KTV,4是超市。。。。
有个人进入高楼说去来福饭店103号房间,你知道他的地址吗?0002(饭店楼)102(来福饭店房号)103(房间号).
FSMC也是你选了SRAM模式就确定了楼层了,你选了块BANK就确定了饭店号,你只需要知道房间号就可以了,所以16位足够了。
然后你说的8位16位,就是饭店里面的房间数,有些饭店有1000间有些饭店有100间,你去100间的酒店说101号,要么被当做走错了送走(报错)要么忽略前面那个1送你去001号。


举报

Fingalxv

2022-9-4 17:58:58
大家好,关于这个问题我有一些浅薄的理解,希望大家指正
首先是1.指针占据的大小是固定的,如果是32位机,那么是恒定4个字节也就是32位
2.地址并没有变成缩短,地址也是固定的,因为stm32的地址总线为32条,所以地址也是32位的
3.指针的数据类型代表了指向内容的数据类型,如果指针p是char型,那么指针操作:p+1会跳转一个字节,如果指针p是int型,那么p+1会跳转4个字节

4.回到问题代码:#define ILI9341_CMD_ADDR (__IO uint16_t*)(0x60000000)
我一开始的理解是,把地址缩短成16位的指针,我的想法是,那么地址长度缩减不就丢失信息了吗
其实可以这么理解,有一个例子:(网上寻得)

p = (int *)&a[0];
a是一个数组,a[0]表示数组第一个元素,&a[0]表示数组第一个元素在内存中的地址。
(int *)是强制转换成int型指针类型。
所以这个赋值语句是取a[0]在内存中的地址,并且把这个地址强制转换成int型指针值,赋给p。


实际上这条操作的结果,应该是把变量p变成了int*型的指针,也就是指针操作为4个字节,指针的值为a[0]的地址

那么回到FSMC读写SRAM,#define DATA_ADDR (__IO uint8_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned char类型指针的值(值是重点),赋给一个变量,这个变量就会变成指针类型为unsigned char ,值为这个地址的指针,那么指针操作一次为8个位,一个字节,也就实现了一个字节一个字节的操作

同样的,#define DATA_ADDR (__IO uint16_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned short类型指针的值,赋给一个变量,这个变量就会变成指针类型为unsigned short ,值为这个地址的指针,那么指针操作一次为16个位,2个字节,也就实现了2个字节2个字节的操作。

这样我们想读16位的数据,指针一次操作2个字节,操作地址0,外部SRAM放回0,1 ;操作地址2,指针指向地址2,外部SRAM可以放回2,3字节,这样就就实现了16位的读写。

问题和回答都写的很乱,望大家海涵,仅是一些想法。


举报

RRJDZGZS

2022-10-8 16:59:26
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分