OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6023|回复: 6

关于STM32F407算FSMC地址计算

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-10
在线时间
2 小时
发表于 2016-6-5 11:21:33 | 显示全部楼层 |阅读模式
2金钱
目前我调试TFT液晶驱动的时候,看到计算地址:
//使用NOR/SRAM的Bank1.sector4,地址位HADDR[27,26]=11,A6作为数据命令区分线
//注意设置时STM32内部会右移一位对其:111 1110 = 0x7E  
#define LCD_BASE        ((u32)(0x6C000000 | 0x0000007E))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

目前在开发板是按照这个地址来驱动,如果//使用NOR/SRAM的Bank1.sector0,地址位HADDR[27,26]=00,
那么基地址0x60000000,假设A16作为数据命令区分线,那么数据位地址怎么算,是否对应的地址:
#define LCD_BASE        ((u32)(0x60000000 | 0x0001FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

不知这样是否正确

最佳答案

查看完整内容[请看2#楼]

你在三楼提到: 其实NT35510_CMDBASS不仅可以使0x60000000,0x60000010也可以,甚至0x6000xxx0都可以, 你理解一下为什么,就释然了, 等于说是STM32把LCD当成一个SRAM,但这个SRAM只有两个地址可以用,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-5 11:21:34 | 显示全部楼层
aiq1210 发表于 2016-6-6 09:32
是的,目前看到正点原子开发板对TFT LCD液晶驱动地址例程不知道怎么算,不是很理解。

你在三楼提到:
# define NT35510_CMDBASS           0x60000000
# define NT35510_DATABASS         0x60020000


其实NT35510_CMDBASS不仅可以使0x60000000,0x60000010也可以,甚至0x6000xxx0都可以,

你理解一下为什么,就释然了,

等于说是STM32把LCD当成一个SRAM,但这个SRAM只有两个地址可以用,
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-5 17:00:54 | 显示全部楼层
贴一个我曾经写过的代码,你看看我是怎样计算的。。


[mw_shl_code=c,true]
# define FSMC_BANK1_BASE            ((uint32_t)0x60000000U)     /* Cortex-M3 External RAM(1GB) Address Base */
# define FSMC_PSRAM_BASE            FSMC_BANK1_BASE

# define NT35510_RS_An              (16U)                       /* Determined by the hardware pin assignment */
# define NT35510_CS_NEn             (1U)                        /* Determined by the hardware pin assignment */

# define NT35510_CMDBASS            (FSMC_PSRAM_BASE | ((NT35510_CS_NEn-1)<<26UL))
# define NT35510_DATABASS           (NT35510_CMDBASS | (1UL<<(NT35510_RS_An+1)))
# define NT35510_ReadDATA()         (*((uint16_t volatile *)NT35510_DATABASS))
# define NT35510_WriteDATA(wData)   (*((uint16_t volatile *)NT35510_DATABASS) = (wData))
# define NT35510_WriteCMD(wCommand) (*((uint16_t volatile *)NT35510_CMDBASS) = (wCommand))
[/mw_shl_code]


坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-10
在线时间
2 小时
 楼主| 发表于 2016-6-5 18:41:36 | 显示全部楼层
xkwy 发表于 2016-6-5 17:00
贴一个我曾经写过的代码,你看看我是怎样计算的。。

你的计算方式我能理解按照这个算出来
# define NT35510_CMDBASS           0x60000000
# define NT35510_DATABASS         0x60020000
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-6-5 21:49:14 | 显示全部楼层
aiq1210 发表于 2016-6-5 18:41
你的计算方式我能理解按照这个算出来
# define NT35510_CMDBASS           0x60000000
# define NT3551 ...

封装好之后,再改引脚的话只需修改一下宏就行了,不用再计算了,不会出错
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-10
在线时间
2 小时
 楼主| 发表于 2016-6-6 09:32:34 | 显示全部楼层
xkwy 发表于 2016-6-5 21:49
封装好之后,再改引脚的话只需修改一下宏就行了,不用再计算了,不会出错

是的,目前看到正点原子开发板对TFT LCD液晶驱动地址例程不知道怎么算,不是很理解。
参考.png
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11477
金钱
11477
注册时间
2014-4-1
在线时间
1298 小时
发表于 2016-6-6 10:57:32 | 显示全部楼层
没仔细看,插一句,

假设1表示数据,0表示命令,
那么,把A16直接用1替换,再写成HEX格式,就是数据的地址;用0替换就是命令的地址。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 01:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表