这是一段对nor存储器的时序进行编程的函数,函数形式为void fsmc_norsraminit(fsmc_norsraminittypedef* fsmc_norsraminitstruct),里面只有一个参数,这个参数为指针类型,指向一段数据结构,这个数据结构就保存着对时序进行配置的的各个参数,这个结构的详细内容为
点击(此处)折叠或打开
typedef struct
{
uint32_t fsmc_bank;//nor被分为四块,其中这个参数是说明对那个块编程
uint32_t fsmc_dataaddressmux;//地址\数据是否复用
uint32_t fsmc_memorytype;//存储器类型
uint32_t fsmc_memorydatawidth;//数据总线宽度 8位/16位
uint32_t fsmc_burstaccessmode;//是否进行成组模式访问
uint32_t fsmc_waitsignalpolarity;//等待信号有效级性
uint32_t fsmc_wrapmode;//该位决定控制器是否支持把非对齐的ahb成组操作分割成2次线性操作;该位仅在存储器的成组模式下有效。 uint32_t fsmc_waitsignalactive;//当闪存存储器处于成组传输模式时,nwait信号指示从闪存存储器出来的数据是否有效或是否需要插入等待周期。该位决定存储器是在等待状态之前的一个时钟周期产生nwait信号,还是在等待状态期间产生nwait信号。 uint32_t fsmc_writeoperation;//该位指示fsmc是否允许/禁止对存储器的写操作。 uint32_t fsmc_waitsignal;//当闪存存储器处于成组传输模式时,这一位允许/禁止通过nwait信号插入等待状态。 uint32_t fsmc_extendedmode;//该位允许fsmc使用fsmc_bwtr寄存器,即允许读和写使用不同的时序。 uint32_t fsmc_writeburst; //对于处于成组传输模式的闪存存储器,这一位允许/禁止通过nwait信号插入等待状态。读操作的同步成组传输协议使能位是fsmc_bcrx寄存器的bursten位。 fsmc_norsramtiminginittypedef* fsmc_readwritetimingstruct;//读时序配置指针
fsmc_norsramtiminginittypedef* fsmc_writetimingstruct;//写时序配置指针
}fsmc_norsraminittypedef;两个指针的结构如下
点击(此处)折叠或打开
typedef struct
{
uint32_t fsmc_addresssetuptime;//这些位定义地址的建立时间,适用于sram、rom和异步总线复用模式的nor闪存操作。 uint32_t fsmc_addressholdtime;//这些位定义地址的保持时间,适用于sram、rom和异步总线复用模式的nor闪存操作。 uint32_t fsmc_datasetuptime;//这些位定义数据的保持时间,适用于sram、rom和异步总线复用模式的nor闪存操作。 uint32_t fsmc_busturnaroundduration;//这些位用于定义一次读操作之后在总线上的延迟(仅适用于总线复用模式的nor闪存操作),一次读操作之后控制器需要在数据总线上为下次操作送出地址,这个延迟就是为了防止总线冲突。如果扩展的存储器系统不包含总线复用模式的存储器,或最慢的存储器可以在6个hclk时钟周期内将数据总线恢复到高阻状态,可以设置这个参数为其最小值。 uint32_t fsmc_clkdivision;//定义clk时钟输出信号的周期,以hclk周期数表示: uint32_t fsmc_datalatency;//处于同步成组模式的nor闪存,需要定义在读取第一个数据之前等待的存储器周期数目。 这个时间参数不是以hclk表示,而是以闪存时钟(clk)表示。在访问异步nor闪存、sram或rom时,这个参数不起作用。操作cram时,这个参数必须为0。 uint32_t fsmc_accessmode; //访问模式}fsmc_norsramtiminginittypedef;函数内容如下
点击(此处)折叠或打开
void fsmc_norsraminit(fsmc_norsraminittypedef* fsmc_norsraminitstruct){ /* 验证参数*/ assert_param(is_fsmc_norsram_bank(fsmc_norsraminitstruct->fsmc_bank)); assert_param(is_fsmc_mux(fsmc_norsraminitstruct->fsmc_dataaddressmux)); assert_param(is_fsmc_memory(fsmc_norsraminitstruct->fsmc_memorytype)); assert_param(is_fsmc_memory_width(fsmc_norsraminitstruct->fsmc_memorydatawidth)); assert_param(is_fsmc_burstmode(fsmc_norsraminitstruct->fsmc_burstaccessmode)); assert_param(is_fsmc_wait_polarity(fsmc_norsraminitstruct->fsmc_waitsignalpolarity)); assert_param(is_fsmc_wrap_mode(fsmc_norsraminitstruct->fsmc_wrapmode)); assert_param(is_fsmc_wait_signal_active(fsmc_norsraminitstruct->fsmc_waitsignalactive)); assert_param(is_fsmc_write_operation(fsmc_norsraminitstruct->fsmc_writeoperation)); assert_param(is_fsmc_waite_signal(fsmc_norsraminitstruct->fsmc_waitsignal)); assert_param(is_fsmc_extended_mode(fsmc_norsraminitstruct->fsmc_extendedmode)); assert_param(is_fsmc_write_burst(fsmc_norsraminitstruct->fsmc_writeburst)); assert_param(is_fsmc_address_setup_time(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_addresssetuptime)); assert_param(is_fsmc_address_hold_time(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_addressholdtime)); assert_param(is_fsmc_datasetup_time(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_datasetuptime)); assert_param(is_fsmc_turnaround_time(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_busturnaroundduration)); assert_param(is_fsmc_clk_div(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_clkdivision)); assert_param(is_fsmc_data_latency(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_datalatency)); assert_param(is_fsmc_access_mode(fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_accessmode)); /* 将控制参数组合成32位数据送给fsmc_bank 寄存器,其中fsmc_bank 为偏移地址*/ fsmc_bank1->btcr[fsmc_norsraminitstruct->fsmc_bank] = (uint32_t)fsmc_norsraminitstruct->fsmc_dataaddressmux | fsmc_norsraminitstruct->fsmc_memorytype | fsmc_norsraminitstruct->fsmc_memorydatawidth | fsmc_norsraminitstruct->fsmc_burstaccessmode | fsmc_norsraminitstruct->fsmc_waitsignalpolarity | fsmc_norsraminitstruct->fsmc_wrapmode | fsmc_norsraminitstruct->fsmc_waitsignalactive | fsmc_norsraminitstruct->fsmc_writeoperation | fsmc_norsraminitstruct->fsmc_waitsignal | fsmc_norsraminitstruct->fsmc_extendedmode | fsmc_norsraminitstruct->fsmc_writeburst;//如果为nor内存 if(fsmc_norsraminitstruct->fsmc_memorytype == fsmc_memorytype_nor) {//允许对nor闪存存储器的访问操作 fsmc_bank1->btcr[fsmc_norsraminitstruct->fsmc_bank] |= (uint32_t)bcr_faccen_set; } /* 将参数组合,操作时序配置寄存器 fsmc_bank 为偏移地址 +1(+4)指向时序配置寄存器*/ fsmc_bank1->btcr[fsmc_norsraminitstruct->fsmc_bank+1] = (uint32_t)fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_addresssetuptime | (fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_addressholdtime (fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_datasetuptime (fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_busturnaroundduration (fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_clkdivision (fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_datalatency fsmc_norsraminitstruct->fsmc_readwritetimingstruct->fsmc_accessmode; /* 是否使用写时序*/ if(fsmc_norsraminitstruct->fsmc_extendedmode == fsmc_extendedmode_enable) {//写时序配置参数是否正确 assert_param(is_fsmc_address_setup_time(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_addresssetuptime)); assert_param(is_fsmc_address_hold_time(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_addressholdtime)); assert_param(is_fsmc_datasetup_time(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_datasetuptime)); assert_param(is_fsmc_clk_div(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_clkdivision)); assert_param(is_fsmc_data_latency(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_datalatency)); assert_param(is_fsmc_access_mode(fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_accessmode));//正确则组合参数赋给写时序配置寄存器其中fsmc_bank和上面一样为偏移地址,则基地址为写时序配置寄存器组的基地址 fsmc_bank1e->bwtr[fsmc_norsraminitstruct->fsmc_bank] = (uint32_t)fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_addresssetuptime | (fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_addressholdtime (fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_datasetuptime (fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_clkdivision (fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_datalatency fsmc_norsraminitstruct->fsmc_writetimingstruct->fsmc_accessmode; } else {//否则写时序配置寄存器无效 fsmc_bank1e->bwtr[fsmc_norsraminitstruct->fsmc_bank] = 0x0fffffff; }}配置完毕。
