历史上的今天
返回首页

历史上的今天

今天是:2024年10月26日(星期六)

2021年10月26日 | stm32专题二十:FSMC结构体分析

2021-10-26 来源:eefocus

FSMC结构体:


控制FSMC使用SRAM存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的SRAM时序结构体以及初始化结构体可以很方便地写入参数。


时序结构体配置:

SRAM初始化结构体配置:

硬件连接:

操作的时候,就直接进行指针操作,向相应的地址写入和读出就行了,非常简单。


sram.c


#include "./sram/sram.h"   


/**

  * @brief  初始化控制SRAM的IO

  * @param  无

  * @retval 无

  */

static void SRAM_GPIO_Config(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

  /* 使能SRAM相关的GPIO时钟 */

 

                         /*地址信号线*/

  RCC_APB2PeriphClockCmd(FSMC_A0_GPIO_CLK | FSMC_A1_GPIO_CLK | FSMC_A2_GPIO_CLK | 

                         FSMC_A3_GPIO_CLK | FSMC_A4_GPIO_CLK | FSMC_A5_GPIO_CLK |

                         FSMC_A6_GPIO_CLK | FSMC_A7_GPIO_CLK | FSMC_A8_GPIO_CLK |

                         FSMC_A9_GPIO_CLK | FSMC_A10_GPIO_CLK| FSMC_A11_GPIO_CLK| 

FSMC_A12_GPIO_CLK| FSMC_A13_GPIO_CLK|FSMC_A14_GPIO_CLK|

FSMC_A15_GPIO_CLK|FSMC_A16_GPIO_CLK|FSMC_A17_GPIO_CLK|FSMC_A18_GPIO_CLK|

                         /*数据信号线*/

                         FSMC_D0_GPIO_CLK | FSMC_D1_GPIO_CLK | FSMC_D2_GPIO_CLK | 

                         FSMC_D3_GPIO_CLK | FSMC_D4_GPIO_CLK | FSMC_D5_GPIO_CLK |

                         FSMC_D6_GPIO_CLK | FSMC_D7_GPIO_CLK | FSMC_D8_GPIO_CLK |

                         FSMC_D9_GPIO_CLK | FSMC_D10_GPIO_CLK| FSMC_D11_GPIO_CLK|

                         FSMC_D12_GPIO_CLK| FSMC_D13_GPIO_CLK| FSMC_D14_GPIO_CLK|

                         FSMC_D15_GPIO_CLK|  

                         /*控制信号线*/

                         FSMC_CS_GPIO_CLK  | FSMC_WE_GPIO_CLK | FSMC_OE_GPIO_CLK |

                         FSMC_UDQM_GPIO_CLK|FSMC_LDQM_GPIO_CLK, ENABLE);

 

 

 

/*-- GPIO 配置 -----------------------------------------------------*/

 

  /* 通用 GPIO 配置 */

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;       //配置为复用功能

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

  

  /*A地址信号线 针对引脚配置*/

  GPIO_InitStructure.GPIO_Pin = FSMC_A0_GPIO_PIN; 

  GPIO_Init(FSMC_A0_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A1_GPIO_PIN; 

  GPIO_Init(FSMC_A1_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A2_GPIO_PIN; 

  GPIO_Init(FSMC_A2_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A3_GPIO_PIN; 

  GPIO_Init(FSMC_A3_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A4_GPIO_PIN; 

  GPIO_Init(FSMC_A4_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A5_GPIO_PIN; 

  GPIO_Init(FSMC_A5_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A6_GPIO_PIN; 

  GPIO_Init(FSMC_A6_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A7_GPIO_PIN; 

  GPIO_Init(FSMC_A7_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A8_GPIO_PIN; 

  GPIO_Init(FSMC_A8_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A9_GPIO_PIN; 

  GPIO_Init(FSMC_A9_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A10_GPIO_PIN; 

  GPIO_Init(FSMC_A10_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A11_GPIO_PIN; 

  GPIO_Init(FSMC_A11_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A12_GPIO_PIN; 

  GPIO_Init(FSMC_A12_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A13_GPIO_PIN; 

  GPIO_Init(FSMC_A13_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A14_GPIO_PIN; 

  GPIO_Init(FSMC_A14_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A15_GPIO_PIN; 

  GPIO_Init(FSMC_A15_GPIO_PORT, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = FSMC_A16_GPIO_PIN; 

  GPIO_Init(FSMC_A16_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A17_GPIO_PIN; 

  GPIO_Init(FSMC_A17_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_A18_GPIO_PIN; 

  GPIO_Init(FSMC_A18_GPIO_PORT, &GPIO_InitStructure);

    

  /*DQ数据信号线 针对引脚配置*/

  GPIO_InitStructure.GPIO_Pin = FSMC_D0_GPIO_PIN; 

  GPIO_Init(FSMC_D0_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D1_GPIO_PIN; 

  GPIO_Init(FSMC_D1_GPIO_PORT, &GPIO_InitStructure);

    

  GPIO_InitStructure.GPIO_Pin = FSMC_D2_GPIO_PIN; 

  GPIO_Init(FSMC_D2_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D3_GPIO_PIN; 

  GPIO_Init(FSMC_D3_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D4_GPIO_PIN; 

  GPIO_Init(FSMC_D4_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D5_GPIO_PIN; 

  GPIO_Init(FSMC_D5_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D6_GPIO_PIN; 

  GPIO_Init(FSMC_D6_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D7_GPIO_PIN; 

  GPIO_Init(FSMC_D7_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D8_GPIO_PIN; 

  GPIO_Init(FSMC_D8_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D9_GPIO_PIN; 

  GPIO_Init(FSMC_D9_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D10_GPIO_PIN; 

  GPIO_Init(FSMC_D10_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D11_GPIO_PIN; 

  GPIO_Init(FSMC_D11_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D12_GPIO_PIN; 

  GPIO_Init(FSMC_D12_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D13_GPIO_PIN; 

  GPIO_Init(FSMC_D13_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D14_GPIO_PIN; 

  GPIO_Init(FSMC_D14_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_D15_GPIO_PIN; 

  GPIO_Init(FSMC_D15_GPIO_PORT, &GPIO_InitStructure);

  

  /*控制信号线*/

  GPIO_InitStructure.GPIO_Pin = FSMC_CS_GPIO_PIN; 

  GPIO_Init(FSMC_CS_GPIO_PORT, &GPIO_InitStructure);

    

  GPIO_InitStructure.GPIO_Pin = FSMC_WE_GPIO_PIN; 

  GPIO_Init(FSMC_WE_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_OE_GPIO_PIN; 

  GPIO_Init(FSMC_OE_GPIO_PORT, &GPIO_InitStructure);    

  

  GPIO_InitStructure.GPIO_Pin = FSMC_UDQM_GPIO_PIN; 

  GPIO_Init(FSMC_UDQM_GPIO_PORT, &GPIO_InitStructure);

  

  GPIO_InitStructure.GPIO_Pin = FSMC_LDQM_GPIO_PIN; 

  GPIO_Init(FSMC_LDQM_GPIO_PORT, &GPIO_InitStructure);

}  

 

 

/**

  * @brief  初始化FSMC外设

  * @param  None. 

  * @retval None.

  */

void FSMC_SRAM_Init(void)

{

FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;

FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;

 

/*初始化SRAM相关的GPIO*/

SRAM_GPIO_Config();

/*使能FSMC外设时钟*/

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

 

//地址建立时间(ADDSET)为1个HCLK 1/72M=14ns

readWriteTiming.FSMC_AddressSetupTime = 0x00;

 

//地址保持时间(ADDHLD)模式A未用到

readWriteTiming.FSMC_AddressHoldTime = 0x00;  

 

//数据保持时间(DATAST)+ 1个HCLK = 3/72M=42ns(对EM的SRAM芯片)

readWriteTiming.FSMC_DataSetupTime = 0x02;   

//设置总线转换周期,仅用于复用模式的NOR操作

readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;

//设置时钟分频,仅用于同步类型的存储器

readWriteTiming.FSMC_CLKDivision = 0x00;

 

//数据保持时间,仅用于同步型的NOR

readWriteTiming.FSMC_DataLatency = 0x00;

//选择匹配SRAM的模式

readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;  

    

 

// 选择FSMC映射的存储区域: Bank1 sram3

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;

//设置地址总线与数据总线是否复用,仅用于NOR

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; 

//设置要控制的存储器类型:SRAM类型

FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;   

//存储器数据宽度:16位

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; 

//设置是否使用突发访问模式,仅用于同步类型的存储器

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;

//设置是否使能等待信号,仅用于同步类型的存储器

FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;

//设置等待信号的有效极性,仅用于同步类型的存储器

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

//设置是否支持把非对齐的突发操作,仅用于同步类型的存储器

FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; 

推荐阅读

史海拾趣

富信半导体(FOSAN)公司的发展小趣事

台湾第一电阻(Firstohm)公司的发展故事

故事一:创立与早期技术积累

台湾第一电阻电容器股份有限公司(Firstohm)成立于1969年,初期便专注于电阻器的生产制造。在那个电子工业刚刚起步的年代,Firstohm凭借其敏锐的市场洞察力和对技术的不懈追求,逐步在电阻器领域站稳脚跟。1970年,公司开始接受日本东京应濑无线公司的代工订单,外销至日本市场,这一合作为Firstohm打开了国际市场的大门。此后,公司不断引进和吸收先进技术,如1986年从日本横演电子精工取得的精密级金属皮膜电阻技术,为公司的技术积累奠定了坚实基础。

故事二:晶圆电阻的突破

1987年,Firstohm成功研发并量产晶圆电阻(又称MELF电阻),这一成就标志着公司在电阻器制造技术上的重大突破。晶圆电阻以其优异的性能和广泛的应用领域,迅速获得了市场的认可。Firstohm也因此成为全球少数几家具备晶圆电阻生产能力的厂商之一,为公司后续的发展奠定了技术领先地位。

故事三:国际认证与品质提升

进入21世纪,Firstohm更加重视产品品质和国际化发展。2001年,公司获得ISO14001 Green Dove奖项及ISO9001认证,标志着公司在环境管理和质量管理方面达到了国际先进水平。此后,公司不断通过国际认证,如ISO9001:2008、IECQ品质认证等,进一步提升了产品的竞争力和市场信誉。这些认证不仅是对公司产品质量的认可,也为公司拓展国际市场提供了有力支持。

故事四:创新产品的研发

Firstohm始终坚持创新驱动发展战略,不断推出符合市场需求的新产品。例如,2012年,公司间隙式突波吸收器(SGS)获得日本、中国大陆及韩国专利许可;2017年,成功开发AEC-Q200车规级晶圆电阻;2020年,又成功开发出心电导线图(ECG cable)专用电阻器SSWAT系列。这些创新产品的研发和推出,不仅丰富了公司的产品线,也进一步巩固了公司在电阻器领域的市场地位。

故事五:自动化生产与全球化布局

随着电子行业的快速发展和市场竞争的加剧,Firstohm不断加大在自动化生产和全球化布局方面的投入。公司生产线高度自动化,生产效率和产品品质显著提升。同时,Firstohm积极拓展海外市场,与全球多家知名电子企业建立了长期稳定的合作关系。例如,与美国通用、THOMSON、法国雷诺等公司的合作,不仅提升了公司的品牌知名度,也为公司带来了更多的市场机遇和发展空间。

FILTRAN公司的发展小趣事

对于固态非易失性精密电位器构成的温度测量电路,网友可能关心的问题以及相应的回答如下:

  1. 固态非易失性精密电位器的工作原理是什么?
    • 回答:固态非易失性精密电位器(如X9C102/103/104/503)包含有99个电阻单元的电阻阵列。滑动单元的位置由CS、U/D和INC三个输入端控制,并且这个位置可以被存储在一个非易失性存储器中,因此在下一次上电时可以被重新调用。
  2. 这种电位器在温度测量电路中的具体应用是怎样的?
    • 回答:非易失性数控电位器如X9312可以构成温度测量电路,作为记数式模数转换电路。通过电位器的电阻值变化来反映温度的变化,实现温度的测量。
  3. 电位器的精度和分辨率如何?
    • 回答:非易失性数控电位器的分辨率等于最大的电阻值被99除。例如,X9C503(50kΩ)的每个抽头间的阻值为505Ω。精密电位器的精度可达0.1%。
  4. 非易失性存储器中的数据可以保存多久?
    • 回答:所有的Xicor非易失性存储器都设计成并经过测试能够用于持久地保存数据的应用场合。滑动端位置数据可保存100年。
  5. 这种电路对温度变化的响应速度如何?
    • 回答:由于参考文章中没有直接提及电位器对温度变化的响应速度,因此无法给出确切的数值。但一般来说,电位器的阻值变化与温度有一定的线性关系,可以较快地反映温度的变化。
  6. 在实际应用中需要注意哪些问题?
    • 回答:在实际应用中,需要注意电位器的额定功率、标称阻值、允许误差等级等参数。此外,电位器在低温环境下使用时需说明,以便采用特制的耐低温油脂。同时,电位器的轴或滑柄长度应尽量短,以提高稳定性和减少晃动。
  7. 电路的稳定性如何?
    • 回答:由于非易失性数控电位器具有非易失性存储功能,因此电路在上电时可以重新调用之前保存的电位器位置数据,从而保证了电路的稳定性。此外,电位器本身也具有较好的稳定性和可靠性。

以上是对固态非易失性精密电位器构成的温度测量电路网友可能关心的问题及相应回答的归纳和总结。

芯茂微电子公司的发展小趣事

随着市场竞争的日益激烈和技术创新的加速推进,芯茂微电子也面临着越来越多的挑战和机遇。面对这些挑战,公司始终坚持不懈地推进技术创新和产品研发,不断提升自身的核心竞争力和市场地位。同时,公司也积极寻求新的市场机遇和合作伙伴,不断拓展业务领域和市场空间。正是这种对挑战和机遇的积极应对和坚持不懈的努力,让芯茂微电子在电子行业中不断发展壮大。

E. Dold & Söhne KG公司的发展小趣事

在追求经济效益的同时,E. Dold & Söhne KG公司也高度重视环保和可持续发展。公司积极引进环保技术和设备,降低生产过程中的能耗和废弃物排放。此外,公司还倡导绿色采购和绿色供应链管理,推动整个产业链向环保和可持续方向发展。这种对环保和可持续发展的关注使得E. Dold & Söhne KG公司在行业内树立了良好的社会形象。

Hpc Technology Inc公司的发展小趣事

随着公司实力的不断增强,E. Dold & Söhne KG公司开始积极拓展海外市场。公司先后在多个国家和地区设立了分支机构或办事处,与当地企业开展合作,共同开发市场。此外,公司还积极参与国际展会和交流活动,与国际同行交流技术和管理经验,不断提升自身的竞争力。

Conflux公司的发展小趣事

在竞争激烈的电子行业中,Conflux始终保持对技术创新的追求。公司团队不断研发新的区块链应用场景,如供应链管理、物联网安全等。通过将这些技术应用于实际业务中,Conflux不仅提升了自身的竞争力,也推动了整个电子行业的进步。同时,公司还积极参与国际技术交流和合作,不断引进国际先进理念和技术,为公司的持续创新提供了有力支持。

问答坊 | AI 解惑

C51用指针对绝对地址访问

unsigned char xdata * xdp;//定义指向xdata存储空间的指针 xdp = 0x1000;//xdata指针赋值,指向xdata存储地址为1000H处 问题是:unsigned char 型的指针只有8问,0x1000是16位,这个赋值过程是怎样的呢?…

查看全部问答>

sqlite3.6.10的wince版本问题

刚接触sqlite,请问最新的sqlite3.6.10的wince版本现在有吗?有的话哪里获取? 没有的话可以利用官网上的源文件自己编译吗?可以的话要修改什么? 谢谢…

查看全部问答>

powerpc e300 的CS0访问NOr flash 的范围是如何控制的 ?

powerpc  e300 的CS0访问NOr flash 的范围是如何控制的 ? 如nor flsah 的地址是0xfc00 0000 - 0xffff ffff 而我设置LPC cs0 设置访问从0xffff 0000 开始, 那么如何访问0xfc00 0000 - 0xffff 0000 的空间呢?…

查看全部问答>

一个很奇怪的问题:用不同工具看NK.bin的大小不一样

今天发现一个很奇怪的问题: 1、在“Samsung_SMDK6410_Release”文件夹下看到的nk.bin的大小是:26.95Mbytes——右键单击\"nk.bin\"选“属性”; 2、可是运行\"viewbin nk.bin\"工具看到的结果是:27.39Mbytes。 这是为什么呢? …

查看全部问答>

卖几个AVR单片机和一本《深入浅出MFC》书

毕业在即,手头还剩几个AVR,新的,原来自己买来玩的,便宜卖了。   4个M16L,6个M16,1个M32L,2个M32。10快一个卖了。   还有一本“深入浅出MFC”,第二版,侯捷的。同学托我卖的,30块钱最低了。 有意者加 QQ:273898419 ...…

查看全部问答>

请教 这两个小任务是做什么的

void TaskB(void *pdata) { void * UdpTemp; uint8 eer;        while (1)     {         UdpTemp=OSQPend(RecUdpQFlag,0,&eer);              &n ...…

查看全部问答>

RS232转RS485

科技发展这么久了,现在有没有直接RS232 <——> RS485而中间不需经过TTL 这一步的芯片?…

查看全部问答>

tetramax ATPG流程分析

tetramax ATPG流程分析 目录:1.读入网表文件2.构造ATPG模式3.执行设计规则检查4.开始测试DRC5.ATPG准备6.运行ATPG 7.ATPG激励压缩8.ATPG激励压缩9.保存故障列表10.使用脚本文件 [ 本帖最后由 lsqswl 于 2011-10-24 23:30 编辑 ]…

查看全部问答>

求代做,有意者QQ联系。基于DSP的数字FIR滤波器的设计

题目 基于DSP的数字FIR滤波器的设计       需要做出硬件电路  不能通过DSP开发板实现   可以做的大神请加Q 或回复留下QQ详谈价  价钱详谈    本人QQ  7651801 &n ...…

查看全部问答>

模拟新手

欢迎大家一起讨论!向模拟界进军。…

查看全部问答>