完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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位的指针,为什么是这样的,难道不应该是 这样子转换吗? 2 之前学习FMSC访问SRAM时同样出现类似疑问,外部SRAM支持8位,16位的访问,于是就有了类似以下的代码 #define DATA_ADDR (__IO uint8_t*)(0x60000000) 和 #define DATA_ADDR (__IO uint16_t*)(0x60000000) 将内部地址强制转换成了8位和16位的指针,这又是为什么?这个指针指向的不是内部SRAM的地址吗?如果是,这样子转换不会导致数据丢失吗,如果不是,这个指针又是指向哪里?难道是直接映射到外部SRAM里面了吗? 恳请求教,十分感谢! |
|
相关推荐
3个回答
|
|
这个我用白话文讲吧。
有一栋高楼有1000层,每层有1000个房间,每个房间有1000个小房间,每个小房间都有独立的房间号。其中2楼是饭店,3是KTV,4是超市。。。。 有个人进入高楼说去来福饭店103号房间,你知道他的地址吗?0002(饭店楼)102(来福饭店房号)103(房间号). FSMC也是你选了SRAM模式就确定了楼层了,你选了块BANK就确定了饭店号,你只需要知道房间号就可以了,所以16位足够了。 然后你说的8位16位,就是饭店里面的房间数,有些饭店有1000间有些饭店有100间,你去100间的酒店说101号,要么被当做走错了送走(报错)要么忽略前面那个1送你去001号。 |
|
|
|
大家好,关于这个问题我有一些浅薄的理解,希望大家指正
首先是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位的读写。 问题和回答都写的很乱,望大家海涵,仅是一些想法。 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 12:40 , Processed in 0.899481 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号