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

stm32如何读取并⼝_STM32的并⼝总线的所有接⼝类型解决
⽅法
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)
vero
// 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));
}877uu
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. 函数的调⽤

本文发布于:2024-09-22 04:35:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/570788.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模式   延时   时间
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议