苦逼了。。看了将近一个礼拜的STM32F103 FSMC 片选NOR的异步形式。。。。或许对项目提高不大。。。现在看同步突发形式。。我也不知道怎样翻译。。。嵌入式学得不太久。。不说了 一会看手册啊。。
———————————-我是无耻的分割线———————————————–
首要关于NOR异步形式总结一下:
1.硬件线路必定要对
2.需求知道可以用一根地址线(Ax)或许一些地址线挑选RS或许其他的东西,很有用。
3.我用的是不复用形式144脚,假如是复用形式或许地址线会更乱一些。
4.必定要先初始化RCC,GPIO在初始化FSMC。。要不或许会有问题,经验之谈。。
5.21IC上有很多FSMC的帖子。。很有用。。
6.要去官网下appliction note和芯片手册。。最威望
之后关于一些要重复回忆的话:
FSMC一切输出信号都是上升沿有用。
最终给出我用示波器测验出来数据:
ADDSET = 0DATASET = 2实践数据传输率: 7MHz (挨近最快)
ADDSET = 0DATASET = 6实践数据传输率: 5MHz
ADDSET = 15 DATASET = 255 实践数据传输率: 260KHz (挨近最慢)
异步形式NE也便是信号有点古怪,我以为他是片选信号,可是为什么会依据transaction拉低,transaction完毕后又拉高,保持一固定一小段时刻??(有待持续看手册)
通过异步形式的丈量与验证,依照时序核算,一次transaction(NE从低到高的进程),时刻核算和手册是相同的:
我用的是扩展形式B: Tclc(write) =ADDSET + 1 + DATASET + 1;
其间ADDSET最小为0,而DATASET最小为1.
手册上没有的常识,通过一下午的丈量,得出NE信号的恢复时刻,即transaction完毕后,NE拉高,再拉地的时刻大致为6个HCLK。(假如同步形式和你的分频有关,为6个CLK)
————————————————————————————————-
下面是同步形式:
为了确保memory clock(CLK)在NADV低电平的中心上升,FSMC会在一个HCLK周期后操作CLK(在NADV前)。
Data latency:便是在采样前等候的时刻周期,可是不包含NADV为低时的时刻,可以从图1看出。
留意的是:一些NOR FLASH包含NADV为低时的周期,所以有下面的状况
NOR Flash latency = DATLAT + 2
NOR Flash latency = DATLAT + 3
同步形式代码我贴出来吧:
void LED_FSMCConfigMy(void)
{
FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDefp;
memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
memset((unsigned char *)&FSMC_NORSRAMInitStructure, 0, sizeof(FSMC_NORSRAMInitTypeDef));
p.FSMC_CLKDivision =0x09;
p.FSMC_DataLatency =0x01;
p.FSMC_AccessMode = FSMC_AccessMode_A;
//– Data/Address MUX = Disable
//– Memory Type = SRAM
//– Data Width = 16bit
//– Write Operation = Enable
//– Extended Mode = Disable
//– Asynchronous Wait = Disable
//– WaitSignalPolarity = Low
//– BurstAccessMode = Enable
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//NOR和SRAM的BANK
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; //不复用
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM ; //由于我需求写,同步形式只要PSRAM才能写,和输出时钟信号
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//16位输出
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Enable; //这个不太懂
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; //同步形式dont care
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//WAITCFG = 0 默认值,其实无所谓
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//WREN 同步写时不行更改
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Enable;//答应等候
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;//不必扩展形式
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Enable;//运用同步形式有必要开
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}
别的,我用赤色高亮的代码是我遇到问题后的解决方案,便是不管你怎样设置分频和时延,都是预期的成果。
http://bbs.21ic.com/viewthread.php?tid=375165&highlight=
原因很简单:
由于STM32 给的库,在这个结构体问题上FSMC_NORSRAMTimingInitTypeDef, 并没有初始化!!!
天知道本来是什么值,加上库里直接把存放器用 或 的方法悉数赋值,假如结构体自身就有数值,进行 或 了
今后当然天知道他变成什么值了!!
FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] =
(uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime |
(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) |
(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) |
(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) |
(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) |
(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) |
FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode;
加了一句 清零结构体数值句子。
memset((unsigned char *)&p, 0, sizeof(FSMC_NORSRAMTimingInitTypeDef));
确保他可以成功写入存放器
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/258112.html