OpenEdv-开源电子网

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

最近学习FSMC的一点总结和疑问

[复制链接]

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-10-13
在线时间
0 小时
发表于 2014-10-13 16:11:34 | 显示全部楼层 |阅读模式
5金钱
实验室做控制平台,STM32做主控芯片,用FSMC与控制芯片的链接是这样的

然后FSMC_CS链接在FSMC_NE4,那也就是选择的NOR Flash BANK1中的子BANK4了?? 
1.  请问BANK1中的四个子BANK的起始地址分别是什么? 在手册上的FSMC部分怎么没有看见这个?
然后,我理解的工作原理是这样的(恳请指正!):硬件电路连接好了之后,我就需要写控制芯片的底层驱动函数,这些函数的作用就是实现与主控芯片之间进行数据交换,由于FSMC的工作特点,所以我在函数中就是通过这样的赋值语句(*(volatile unsigned short int*)(0x60000000 | X_Add) = val;)直接可以实现一定的数据(val)写在了一定的地址(0x60000000 | X_Add),这时val值就通过D0-D15呈现出来,而地址(0x60000000 | X_Add)就通过A0-A25呈现出来,其中0x60000000指示了NOR Flash BANK1中子BANK1的基地址子BANK4是否是0x60000000 | 0x0C000000???),而X_Add就使FSMC_A0-FSMC_A4保持住0x0006一段时间,传递到控制芯片的A1-A4,从而A1-A4端的电平状态就映射指示到了控制芯片的内部目标寄存器COMW,然后D0-D15的16位数据就自动写入了COMW。
这里有个问题2.请问网友的例程一般都是FSMC驱动LCD,所以会把FSMC_A0接在了LCD的RS端,所以最后的地址赋值需要左移一位,而我的A0端直接接在了控制芯片的地址上,这时候我在地址赋值的时候是否就不用再移位,而是直接赋值??
按照上面的原理我就编写了如下的控制芯片驱动函数:
[mw_shl_code=c,true]#include "PCL_Function.h" uint16 *pBufw0, *pBufw1, *pComw, *pOtpw, *pMSTSW, *pSSTSW; // 根据各轴的地址分别设置各轴对应的主寄存器地址 void SetAxis(uint32 axis) { switch(axis) { case AXIS_X: pComw = (uint16*)((AXIS_X << 3) | (COMW << 1)); // 以下都需要加上BANK的基地址0x60000000 | 0x0C000000 pBufw0 = (uint16*)((AXIS_X << 3) | (BUFW0 << 1)); pBufw1 = (uint16*)((AXIS_X << 3) | (BUFW1 << 1)); pOtpw = (uint16*)((AXIS_X << 3) | (OTPW << 1)); pMSTSW = (uint16*)((AXIS_X << 3) | (MSTSW << 1)); pSSTSW = (uint16*)((AXIS_X << 3) | (SSTSW << 1)); break; case AXIS_Y: pComw = (uint16*)((AXIS_Y << 3) | (COMW << 1)); pBufw0 = (uint16*)((AXIS_Y << 3) | (BUFW0 << 1)); pBufw1 = (uint16*)((AXIS_Y << 3) | (BUFW1 << 1)); pOtpw = (uint16*)((AXIS_Y << 3) | (OTPW << 1)); pMSTSW = (uint16*)((AXIS_Y << 3) | (MSTSW << 1)); pSSTSW = (uint16*)((AXIS_Y << 3) | (SSTSW << 1)); break; case AXIS_Z: pComw = (uint16*)((AXIS_Z << 3) | (COMW << 1)); pBufw0 = (uint16*)((AXIS_Z << 3) | (BUFW0 << 1)); pBufw1 = (uint16*)((AXIS_Z << 3) | (BUFW1 << 1)); pOtpw = (uint16*)((AXIS_Z << 3) | (OTPW << 1)); pMSTSW = (uint16*)((AXIS_Z << 3) | (MSTSW << 1)); pSSTSW = (uint16*)((AXIS_Z << 3) | (SSTSW << 1)); break; case AXIS_U: pComw = (uint16*)((AXIS_U << 3) | (COMW << 1)); pBufw0 = (uint16*)((AXIS_U << 3) | (BUFW0<<1)); pBufw1 = (uint16*)((AXIS_U << 3) | (BUFW1<<1)); pOtpw = (uint16*)((AXIS_U << 3) | (OTPW<<1)); pMSTSW = (uint16*)((AXIS_U << 3) | (MSTSW<<1)); pSSTSW = (uint16*)((AXIS_U << 3) | (SSTSW<<1)); break; default: break; } } // 写命令操作 void WriteCommand(uint32 comm, uint32 axisaddr, uint32 axissel) { uint32 axiscomm = comm | axissel; SetAxis(axisaddr); *pComw = axiscomm; } // 写Buffer操作 void WriteBuffer(uint32 axisaddr, uint32 buf0, uint32 buf1) { SetAxis(axisaddr); *pBufw0 = buf0; *pBufw1 = buf1; } // 读Buffer操作 void ReadBuffer(uint32 axisaddr, uint32 *buf0, uint32 *buf1) { SetAxis(axisaddr); *buf0 = *pBufw0; *buf1 = *pBufw1; } // 读MSTSW void ReadMSTSW(uint32 axisaddr, uint32 *sts) { SetAxis(axisaddr); *sts = *pMSTSW; } // 读SSTSW void ReadSSTSW(uint32 axisaddr, uint32 *sts) { SetAxis(axisaddr); *sts = *pSSTSW; } // 写I/O口 void WriteOTPW(uint32 axisaddr, uint32 value) { SetAxis(axisaddr); *pOtpw = value; } // 写寄存器 void WriteRegister(uint32 comm, uint32 buf0, uint32 buf1, uint32 axisaddr, uint32 axissel) { WriteBuffer(axisaddr, buf0, buf1); WriteCommand(comm, axisaddr, axissel); } // 读寄存器 void ReadRegister(uint32 comm, uint32 *buf0, uint32 *buf1, uint32 axisaddr) { WriteCommand(comm, axisaddr, AxisSel_Default); ReadBuffer(axisaddr, buf0, buf1); } [/mw_shl_code]
通过上面的驱动函数,在主程序中我就可以直接调用来读写控制芯片内部的寄存器,从而达到控制的目的....
请问,上面的编写是否可以实现!??搞了一个星期了,就搞出来点儿这个东西,还不知道对不对,恳请原子哥给点儿意见!!
最后的问题就是,3.请问编写完了这个,我是否就可以在主程序中进行FSMC的响应配置了,关于FSMC的配置有什么指导性的技术贴,请原子哥给推荐推荐。
    非常感谢.......


最佳答案

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

回复【5楼】MichealLee: --------------------------------- 那就得根据PCL6045的时序,去配置FSMC。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-13 16:11:35 | 显示全部楼层
回复【5楼】MichealLee:
---------------------------------
那就得根据PCL6045的时序,去配置FSMC。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-10-13
在线时间
0 小时
 楼主| 发表于 2014-10-13 20:06:52 | 显示全部楼层
大神们,求帮助呀,刚开始学习,就承担项目的整个软件任务,有些吃力....
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13138
金钱
13138
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-10-13 20:53:04 | 显示全部楼层
帮顶  ..
学无止境
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-13 23:08:27 | 显示全部楼层
楼主,你这是要驱动一个什么外设啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-10-13
在线时间
0 小时
 楼主| 发表于 2014-10-15 11:33:19 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯嗯,原子哥,你好,是这样的,我们用的STM32作为主控芯片,通过FSMC端连接运动控制芯片 CL6045,他们之间的任务就是进行数据交换就可以了....不知道上面的东西对不对呢!
回复

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-10-13
在线时间
0 小时
 楼主| 发表于 2014-10-16 09:56:53 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
控制芯片时序!?   控制芯片有什么时序呀?
    呃,我上面底层函数的编写正确不正确呀!?利用这些函数是否就可以把数据写进我的控制芯片了??    这些函数写好了,我才可以往下进行工作的。
         关于如何根据外设时序配置FSMC,请问是否有比较容易理解的例程??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-16 23:51:17 | 显示全部楼层
回复【7楼】MichealLee:
---------------------------------
看数据手册啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-10-13
在线时间
0 小时
 楼主| 发表于 2014-10-17 17:16:57 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
呃,我最想知道的就是我的底层函数是否能够这么写,FSMC是否能够这么用!?
      控制芯片上的数据手册着实没有芯片的时序讲解.....
           新手,真的是找不到门道...嘿嘿
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-18 00:43:00 | 显示全部楼层
回复【9楼】MichealLee:
---------------------------------
貌似不正常,你可以自己测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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