STM32 的并口总线的所有接口类型解决方法

STM32的并口总线支持NOR, SRAM, PSRAM,NAND接口,本文以PSRAM为例实现并口的同步非复用, 异步复用和异步非复用操作!以STM32F207IG(176脚)系列为例,步骤如下:

1.  初始化并口的各个引脚

//Add[0-25] : F0-F5(6); F12-F15(4); G0-G5(6); D11-D13(3); E3-E6(4); E2(1); G13-G14(2)

//Data[0-15]: D14-D15(2);D0-1(2);E7-15(9);D8-10(3)

//FSMC_NIORD: F6   NC           for PC CARD

//FSMC_NREG : F7   NC           for PC CARD

//FSMC_NIOWR: F8   NC           for PC CARD

//FSMC_CD   : F9   NC           for PC CARD

//FSMC_INTR : F10  NC           for PC CARD

//FSMC_INT2 : G6   NC           for COMMON

//FSMC_INT3 : G7   NC           for COMMON

//FSMC_CLK  : D3                for NOR/PSRAM

//FSMC_NOE  : D4                for COMMON

//FSMC_NWE  : D5                for COMMON

//FSMC_NWAIT: D6                for COMMON

//FSMC_NE1  : D7   FSMC_NCE2    for NOR/PSRAM  for NAND

//FSMC_NE2  : G9   FSMC_NCE3    for NOR/PSRAM  for NAND

//FSMC_NE3  : G10  NC           for NOR/PSRAM

//FSMC_NCE4 : G11  NC           for NOR/PSRAM

//FSMC_NE4  : G12  NC           for NOR/PSRAM

//FSMC_NL   : B7                for NOR/PSRAM

//FSMC_NBL0 : E0                for NOR/PSRAM

//FSMC_NBL1 : E1                for NOR/PSRAM

void FsmcInit(void)

{

u8 i=0;

// 1.

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB  | RCC_AHB1Periph_GPIOD  |        RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);

for(i=0; i

{

GPIO_PinAFConfig((GPIO_TypeDef *)GPIOx,  GPIO_PinSourceX, GPIO_AF_FSMC);

}

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 ;

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

for(i=0; i

{

GPIO_InitStructure.GPIO_Pin   = (1<

GPIO_Init((GPIO_TypeDef *)GPIOx,   &GPIO_InitStructure);

}

// FSMC_NWAIT: D6

GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 ;

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

FsmcBank1BusTypeInit(FSMC_TYPE_NOMUX_SYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);

//  FsmcBank1BusTypeInit(FSMC_TYPE_MUX_ASYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);

// FsmcBank1BusTypeInit(FSMC_TYPE_NOMUX_ASYN, FSMC_Bank1_NORSRAM1, FSMC_MemoryType_PSRAM, FSMC_MemoryDataWidth_16b);

}

2. 初始化FSMC

u8 FsmcBank1BusTypeInit(u8 uchBusType, u32 uiBank1Numb, u32 uiMemType, u32 uiDataWide)

{

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingRead;

FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingWrite;

if(((FSMC_TYPE_NOMUX_SYN == uchBusType)||(FSMC_TYPE_MUX_SYN == uchBusType)) &&(uiMemType == FSMC_MemoryType_NOR))

{//同步访问Nor 只支持读操作

return FSMC_OPT_FAIL;

}

// 0.默认初始化结构体,读写的时序

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingRead;

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &FSMC_NORSRAMTimingWrite;

FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);

// 1. 总线类型初始化

FSMC_NORSRAMInitStructure.FSMC_Bank                  = uiBank1Numb;

FSMC_NORSRAMInitStructure.FSMC_MemoryType            = uiMemType;

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = uiDataWide;

// 2.根据芯片类型初始化

if((FSMC_TYPE_NOMUX_SYN == uchBusType)||(FSMC_TYPE_MUX_SYN == uchBusType))

{//同PSRAM, 同步非复用

//同步模式设置:// 2.1 总线类型

if(FSMC_TYPE_MUX_SYN == uchBusType)

{

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Enable;

}

else

{

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Disable;

}

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Enable;   //同步模式下使用,for NOR Flash(PSRAM)

// 2.2. 其他设置,burst模式禁用,burst mode disable: Paras. valid only when accessing Flash memories in burst mode

FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Enable;          //在同步模式下支持Write burst,但读时无效; 异步模式下设0,禁用,表示在异步模式下写操作总是容许的

FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;   //异步操作时是否采用NWAIT信号来进行数据准备的延时

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;       //是否支持扩展模式A,B,C,D,根据需要来设定

FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Enable;          //在burst模式下,是否插入NWAIT等待延时信号 ,同步必须插

FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;      //是否支持写操作

FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_DuringWaitState; // 延时等待信号在FSMC_WaitSignalPolarity时表示正在等待,不是之前一个时钟周期类在等待

FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;           //对总线宽度不一致时使用

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;    //异步操作若开启延时,此表示延迟等待的电平,非此电平表示延时结束,for NOR Flash(PSRAM) WAITEN、WAITCFG、WAITPOL

// 2.3 延时时间设置,根据芯片来设计,同步模式,下列前三个不用设置

FSMC_NORSRAMTimingRead.FSMC_AddressSetupTime         = 10;  //地址建立时间的持续时间, 异步使用

FSMC_NORSRAMTimingRead.FSMC_AddressHoldTime          = 5;   //地址的建立后的保持时间, 异步使用

FSMC_NORSRAMTimingRead.FSMC_DataSetupTime            = 10;  //数据建立时间的持续时间,异步复用中使用

FSMC_NORSRAMTimingRead.FSMC_BusTurnAroundDuration    = 2;   //总线周转时间?!,         复用模式使用

FSMC_NORSRAMTimingRead.FSMC_CLKDivision              = 3;   //定义输出时钟分频,      同步使用, 0x0 to get CLK = HCLK(个别芯片不支持),0x1 to get CLK = 2 × HCLK,... , 0x0f;    ==2,clk == 40M,==3,clk == 30M

FSMC_NORSRAMTimingRead.FSMC_DataLatency              = 0;   //内存时钟周期数,        同步使用,  DataLatency = 1 for NOR Flash; DataLatency = 0 for PSRAM

FSMC_NORSRAMTimingRead.FSMC_AccessMode               = FSMC_AccessMode_A;//Specifies the asynchronous access mode

memcpy((u8 *)&FSMC_NORSRAMTimingWrite, (u8 *)&FSMC_NORSRAMTimingRead, sizeof(FSMC_NORSRAMTimingInitTypeDef));

}

else if((FSMC_TYPE_MUX_ASYN == uchBusType) || (FSMC_TYPE_NOMUX_ASYN == uchBusType))

{ //异步复用模式,   异步非复用

// 2.1 总线类型

if(FSMC_TYPE_MUX_ASYN == uchBusType)

{

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Enable;

}

else

{

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux    = FSMC_DataAddressMux_Disable;

}

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;   //同步模式下使用,for NOR Flash(PSRAM)

// 2.2. 其他设置,burst模式禁用,burst mode disable: Paras. valid only when accessing Flash memories in burst mode

FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;         //在同步模式下支持Write burst ; 异步模式下设0,禁用,表示在异步模式下写操作总是容许的

FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;    //异步操作时是否采用NWAIT信号来进行数据准备的延时

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;       //是否支持扩展模式A,B,C,D,根据需要来设定

FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Disable;         //在burst模式下,是否插入NWAIT等待延时信号

FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;      //是否支持写操作

FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_BeforeWaitState; // 延时等待信号在FSMC_WaitSignalPolarity时表示正在等待,不是之前一个时钟周期类在等待

FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;           //对总线宽度不一致时使用

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_High;    //异步操作若开启延时,此表示延迟等待的电平,非此电平表示延时结束,for NOR Flash(PSRAM) WAITEN、WAITCFG、WAITPOL

// 2.3 延时时间设置,根据芯片来设计

FSMC_NORSRAMTimingRead.FSMC_AddressSetupTime         = 20;  //地址建立时间的持续时间, 异步使用

FSMC_NORSRAMTimingRead.FSMC_AddressHoldTime          = 5;  //地址的建立后的保持时间, 异步使用

FSMC_NORSRAMTimingRead.FSMC_DataSetupTime            = 30;  //数据建立时间的持续时间,异步复用中使用

FSMC_NORSRAMTimingRead.FSMC_BusTurnAroundDuration    = 5;  //总线周转时间?!,         复用模式使用

FSMC_NORSRAMTimingRead.FSMC_CLKDivision              = 1;  //定义输出时钟分频,      同步使用, 0x0 to get CLK = HCLK(个别芯片不支持),0x1 to get CLK = 2 × HCLK,... , 0x0f;

FSMC_NORSRAMTimingRead.FSMC_DataLatency              = 0;  //内存时钟周期数,        同步使用,  DataLatency = 1 for NOR Flash; DataLatency = 0 for PSRAM

FSMC_NORSRAMTimingRead.FSMC_AccessMode               = FSMC_AccessMode_D;//Specifies the asynchronous access mode

memcpy((u8 *)&FSMC_NORSRAMTimingWrite, (u8 *)&FSMC_NORSRAMTimingRead, sizeof(FSMC_NORSRAMTimingInitTypeDef));

}

else//FSMC_TYPE_MUX_SYN: 同步复用

{

return FSMC_OPT_FAIL;

}

// 5.写配置到REG

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

FSMC_NORSRAMCmd(uiBank1Numb, ENABLE);

return FSMC_OPT_OK;

}

3. 函数的调用

void PsramWrite(u32 uiRegAddr, u16 ushValue)

{

// Transfer data to the memory

*(__IO u16 *) (cuistBank1BaseAddr[FSMC_FEC_BANK_NUMB] + (uiRegAddr<<1)) = ushValue;

}

u16 PsramRead(u32 uiRegAddr)

{

u16 ushVal = 0;

// Read data from the memory

ushVal = *(__IO u16*) (cuistBank1BaseAddr[FSMC_FEC_BANK_NUMB] + (uiRegAddr<<1));

return ushVal;

}

总结:一般异步模式下,需要调试建立时间,同步模式下则不用!

特别说明,对于非STM32标准的接口,如motorola和intel总线的并口,需要在调用PsramWrite和PsramRead时,手动进行片选FSMC_NEx的上拉和下拉!

stm32如何读取并口_STM32 的并口总线的所有接口类型解决方法相关推荐

  1. R语言读取出现 列的数目比列的名字要多的解决方法

    R语言读取出现 列的数目比列的名字要多的解决方法 参考文章: (1)R语言读取出现 列的数目比列的名字要多的解决方法 (2)https://www.cnblogs.com/cyh1989/p/9112 ...

  2. python读取和写入excel里面的数据(附int变float解决方法)

    python读取和写入excel里面的数据(附int变float解决方法) 参考文章: (1)python读取和写入excel里面的数据(附int变float解决方法) (2)https://www. ...

  3. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

    模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...

  4. 测试软件为什么不能识别串口,COM口识别,状态正常,设备无法通讯的解决方法...

    COM口识别,状态正常,设备无法通讯的解决方法 打开注册表HKEY_LOCAL_MACHINE//SYSTEM//CurrentControlSet//Control//COM Name Arbite ...

  5. 计算机u盘 硬盘无法读取,U盘、移动硬盘盘符不显示及无法识别解决方法

    U盘.移动硬盘盘符不显示及无法识别解决方法 发布时间:2012-12-21 17:36:04   作者:佚名   我要评论 我们使用的绝大多数移动硬盘和U盘都是使用USB接口,属于即插即用类型.我们经 ...

  6. 计算机u盘 硬盘无法读取,电脑无法识别usb设备,电脑无法识别u盘,移动硬盘解决方法汇总...

    2020-03-21 通常我们用来储存数据的有U盘和移动硬盘,移动硬盘储存的数据要多很多,而使用中我们也会遇到一些问题,如移动硬盘无法识别,在Win10电脑中也会出现,如出现右下角弹窗, 无法识别US ...

  7. usb口拒绝访问_【u盘拒绝访问】解决方法大全

    U盘是我们常用的数据储存工具,然而有时用户在使用U盘时会发现插入到电脑中,在系统中打不开,出现U盘拒绝访问的情况,这时很多用户不知道如何解决,其实原因不同解决方法也不一样,下面小编就为大家分享下[u盘 ...

  8. 3v stm32 供电 晶振起振_32.768kHz晶振不起振的终极解决方法?

    32.768kHz晶振不起振的终极解决方法 32.768kHz晶振是市面上使用最为广泛的一类晶振.爱普生/EPSON目前提供三类32.768kHz晶振产品以满足客户不同需要,分别是:32.768kHz ...

  9. java 获取年 两位,java使用jxl读取日期年份只显示前两位的解决方法

    上传的excel日期为"1988/9/1",java使用jxl包读取结果为"19-9-1",年份缺少了前面的两位. 解决方法是使用DateCell. 如下面的代 ...

最新文章

  1. oracle 外部表及解决ora-29400,ora-29913错误
  2. Docker 制作镜像-redis
  3. gym中render()函数在远端server运行的解决方案
  4. A good security site
  5. 岗位内推 | 微软亚洲研究院智能多媒体组招聘实习生
  6. 《你不知道的JavaScript(上卷)》读书笔记
  7. Vue 跳转相同路由携带不同参数,而页面不刷新
  8. Kubernetes master无法加入etcd 集群解决方法
  9. python怎么读取excel某一列-Python从Excel中读取日期一列的方法
  10. 为什么有了scanf还要getchar()
  11. SLAM_局部束调整(local Bundle Adjustment, BA)步骤与代码示例
  12. [转载] New Concept English 1——Lesson 12 Whose is this…?This is my/your/her…
  13. 反三角函数的积分公式
  14. 如何用ppt做自我介绍
  15. 图书管理系统需求规格说明文档目录_一个已经超越普通设计素材管理范畴的文档管理软件—Eagle...
  16. CAD高版本窗体阵列LISP_如何把CAD高版本阵列对话框在低版本调出来?
  17. Solver 配置详解
  18. datadog-define-tags by AOP
  19. 欧几里得  拓展欧几里得算法 讲解 (Euclid Extend- Euclid Algorithm)
  20. spring中的loc和aop

热门文章

  1. Profile 是什么意思
  2. 大学计算机一级实验报告,大学计算机实验报告范文
  3. 双电阻差分电流采样_模拟电路-差分放大电路
  4. Sketch 入门学习
  5. 高新技术企业认定的指标要求
  6. zcy算法入门笔记003-树
  7. 如何用pip从阿里云镜像下载python包
  8. BZOJ 2716 Violet 3 天使玩偶
  9. 两天学完软件测试工程师所需的MySQL数据库技术
  10. 数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第八章数据集成和互操作篇...