OpenEdv-开源电子网

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

FSMC是如何识别是读命令,还是写命令的?

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
发表于 2016-11-18 11:03:09 | 显示全部楼层 |阅读模式
1金钱
在使用fsmc控制LCD的是时候有读写操作,如下是画一个点和读一个点

//画点
//x,y:坐标
//POINT_COLOR:此点的颜色
void LCD_DrawPoint(u16 x,u16 y)
{
        LCD_SetCursor(x,y);                //设置光标位置
        LCD_WriteRAM_Prepare();        //开始写入GRAM
        LCD->LCD_RAM=POINT_COLOR;
}

//读取个某点的颜色值         
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
       ……
        b=LCD_RD_DATA();
        ……               
}
问题:fsmc是如何区分读写操作的?是通过那条语句告诉fsmc我要对LCD进行读或是写操作了?求助,谢谢。

       

最佳答案

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

读写LCD本质上是对寻址空间的某一个地址进行读写操作; 读:var = *(uint32_t *)0x6C000080; 写:*(uint32_t *)0x6C000080 = var; 为了更明显,咱来看看生成的汇编指令: 因此,如果是读LCD,则使用的一定是LDR指令(Load Register) 写LCD,则使用的是STR指令(Store Register) 不同的指令会对应不同的总线访问时序。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-11-18 11:03:10 | 显示全部楼层
读写LCD本质上是对寻址空间的某一个地址进行读写操作;

读:var = *(uint32_t *)0x6C000080;
写:*(uint32_t *)0x6C000080 = var;


为了更明显,咱来看看生成的汇编指令:

8.png

因此,如果是读LCD,则使用的一定是LDR指令(Load Register)
写LCD,则使用的是STR指令(Store Register)

不同的指令会对应不同的总线访问时序。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
发表于 2016-11-18 11:40:40 | 显示全部楼层
读写控制是FSMC自动控制的,你向指定地址写数据(如 *(vu16*) (LCD_BASE1)= (data);),FSMC会自动控制相应的引脚(CS、RS、RD、WR等)发送写数据时序,读也是一样的。
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-8-16
在线时间
16 小时
发表于 2016-11-18 17:56:06 | 显示全部楼层
配置好FSMC,对数据的操作是直接对地址的操作!
下面代码是我FSMC对W5300的操作,贴出来给你借鉴!
/*******************************************************************
*        函数名: IINCHIP_READ
*        参     数: addr :寄存器地址
*        返     回: 寄存器值
*        功     能: 读出W5300 寄存器的值
*/
uint16_t IINCHIP_READ(uint32_t addr)
{
    return (*((volatile uint16_t*)addr));  
}

/********************************************************************
*        函数名: IINCHIP_WRITE
*        参  数: addr :寄存器地址
*                        writedata : 写入的数据
*        返  回: 无
*        功  能: 写W5300寄存器的值
*/
void IINCHIP_WRITE(uint32_t addr, uint16_t writedata)
{
    (*((volatile uint16_t*)addr)) = writedata;
}

回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-20 14:19:56 | 显示全部楼层
l30439129 发表于 2016-11-18 11:40
读写控制是FSMC自动控制的,你向指定地址写数据(如 *(vu16*) (LCD_BASE1)= (data);),FSMC会自动控制相应 ...

谢谢您的回复。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-20 14:22:12 | 显示全部楼层
zky26 发表于 2016-11-18 17:56
配置好FSMC,对数据的操作是直接对地址的操作!
下面代码是我FSMC对W5300的操作,贴出来给你借鉴!
/*** ...

非常感谢您
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 00:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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