在stm32中如何使用、配置FSMC配置

由于内部每个地址对应一个字节,外部设备16位宽,FSMC的一个地址对应两个字节

             

 FSMC初始化

LCD背光BL直接PB0控制

成员变量 Instance 和成员变量 Extended 实际上是用来在指定的时序模型下,寄存器基地址
和扩展模式寄存器基地址


在HAL库中配置



SRAM_HandleTypeDef TFTSRAM_Handler;    //SRAM句柄(用于控制LCD)

void LCD_Init(void)
{ 	  
	GPIO_InitTypeDef GPIO_Initure;
	FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
	FSMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
    
	__HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟
	GPIO_Initure.Pin=GPIO_PIN_0;          	//PB0,背光控制
	GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
	HAL_GPIO_Init(GPIOB,&GPIO_Initure); 
	
	TFTSRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;                
	TFTSRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;    
    
	TFTSRAM_Handler.Init.NSBank=FSMC_NORSRAM_BANK4;     				//使用NE4
	TFTSRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE; 	//地址/数据线不复用
	TFTSRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM;   			//SRAM
	TFTSRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度
	TFTSRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到
	TFTSRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
	TFTSRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;   //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
	TFTSRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;    //存储器写使能
	TFTSRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE;           //等待使能位,此处未用到
	TFTSRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_ENABLE;        //读写使用不同的时序
	TFTSRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
	TFTSRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURST_DISABLE;           //禁止突发写
    
	//FMC读时序控制寄存器
	FSMC_ReadWriteTim.AddressSetupTime=0x06;       	//地址建立时间(ADDSET)为7个HCLK 13.8ns*7=96.6ns
	FSMC_ReadWriteTim.AddressHoldTime=0;
	FSMC_ReadWriteTim.DataSetupTime=26;				//数据保存时间为27个HCLK	=13.8*27=372.6ns
	FSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;//模式A
	//FMC写时序控制寄存器
	FSMC_WriteTim.BusTurnAroundDuration=0;			//总线周转阶段持续时间为0,此变量不赋值的话会莫名其妙的自动修改为4。导致程序运行正常
	FSMC_WriteTim.AddressSetupTime=3;          		//地址建立时间(ADDSET)为4个HCLK =55.2ns 
	FSMC_WriteTim.AddressHoldTime=0;
	FSMC_WriteTim.DataSetupTime=0x06;              	//数据保存时间为13.8ns*7个HCLK=96.6ns
	FSMC_WriteTim.AccessMode=FSMC_ACCESS_MODE_A;    //模式A
	HAL_SRAM_Init(&TFTSRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);	


}

FSMC_BWTRx 则组合成 BWTR[7],他们的对应关系如下:
BWTR[0]对应 FSMC_BWTR1, BWTR[2]对应 FSMC_BWTR2,
BWTR[4]对应 FSMC_BWTR3, BWTR[6]对应 FSMC_BWTR4,

FSMC_BWTRx 寄存器
ADDSET 设置为 0,即 1 个 HCLK 周期
//重新配置写时序控制寄存器的时序   提速
Bank1.region4	即BWTR[6]对应 FSMC_BWTR4 	

						    
		FSMC_Bank1E->BWTR[6]&=~(0XF<<0);//地址建立时间(ADDSET)清零 	 
		FSMC_Bank1E->BWTR[6]&=~(0XF<<8);//数据保存时间清零
		
		FSMC_Bank1E->BWTR[6]|=1<<0;		//地址建立时间(ADDSET)为2个HCLK =28ns  	 
		FSMC_Bank1E->BWTR[6]|=1<<8; 	//数据保存时间(DATAST)为13.8ns*2个HCLK=28ns

时钟72M,HCLK周期1/72M=13.6ns

//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线 
//注意设置时STM32内部会右移一位对其! 			    
#define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款基于ARM Cortex-M3内核的微控制器,具有强大的性能和丰富的外设资源,适合用于各种嵌入式系统的开发。FSMC(Flexible Static Memory Controller)是STM32F103系列微控制器上的外设之一,用于连接外部存储器或外设,如SRAM、NOR Flash和NAND Flash等。PWM(Pulse Width Modulation)是一种常用的数字信号调制技术,可以用来控制电机、LED灯等设备的亮度和速度。 要在STM32F103上配置FSMC和PWM,首先需要在芯片手册和相关的技术文档了解这两个外设的寄存器配置和工作原理。然后,在开发环境,可以使用ST官方提供的CubeMX或者Keil等开发工具,通过图形化界面或者C语言编程,对FSMC和PWM进行配置初始化。 在使用STM32CubeMX进行配置时,首先选择相应型号的STM32F103芯片,然后在"Pinout & Configuration"选项卡分配FSMC和PWM的引脚功能,接着在"Configuration"选项卡设置FSMC和PWM的时钟、模式、分辨率等参数。最后生成代码后,将相应的初始化函数调用放入主程序,即可实现对FSMC和PWM的配置。 在Keil等集成开发环境,可以直接编写C语言代码来对FSMC和PWM进行配置初始化,具体的操作步骤包括设置相应的寄存器值、配置时钟、模式和断等。 总之,对于STM32F103系列微控制器来说,配置FSMC和PWM需要仔细阅读官方文档,了解外设的特性和工作原理,然后通过适当的工具和编程语言进行配置初始化,从而实现对外部存储器和PWM信号的有效控制和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值