欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

STM32 FSMC 16位寻址 地址移位的解读

程序员文章站 2022-08-12 10:38:13
一、当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1] FSMC_A[24:0]。当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0] FSMC_A[25:0]。二、//LCD 操作结构体typedef struct{ vu16 LCD_REG;vu16 LCD_RAM;} LCD_TypeDef;//使用 NOR/SRAM 的 Bank1.sector4,地址位 HADDR[27,26]=11 A10 作为数据命令区分线//注意 16 位....


一、
当 Bank1 接的是 16 位宽度存储器的时候:HADDR[25:1] FSMC_A[24:0]。
当 Bank1 接的是 8 位宽度存储器的时候:HADDR[25:0] FSMC_A[25:0]。

二、
//LCD 操作结构体
typedef struct
{ vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用 NOR/SRAM 的 Bank1.sector4,地址位 HADDR[27,26]=11 A10 作为数据命令区分线
//注意 16 位数据总线时,STM32 内部地址会右移一位对齐! 
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)

三、
FSMC控制LCD,关于原子程序16位寻址的个人理解:
1.16位寻址和8位寻址差了一倍,所以地址线差出一根;
2.16位寻址时,芯片内总线寻址HADDR[25:1],地址从A1开始,对应IO口寻址为 FSMC_A[24:0],地址从A0开始,
为什么选择以上偏移1位的对应关系,见下表:


总线寻址HADDR[25:1]            IO寻址FSMC_A[24:0]
0000=0,                        0000=0
0010=2,                        0001=1
0100=4,                        0010=2
0110=6,                        0011=3
1000=8,                    0100=4    
1010=A                        0101=5                
1100=C                        0110=6    
1110=E                        0111=7    

偏移以后,内部寻址右移一位,就变成一半,内部变化两个字节,IO外面变化一个字节;
因内部总线地址0x6C000000,以字节变化,16位寻址IO以双字节变化,所以通过内部总线双字节变化实现外部IO地址的递增奇偶变化。                            

typedef struct
{ vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
定义的结构体内部变量是占用16位两个字节的寄存器,定义了基地址后,只要在基地址的基础上加0x02,2个字节
即可使外部IO的16位地址变化一次,内部0x7FE=0111 1111 1110,加2=0x00000800=1000 0000 0000,各右移一位,
则A10由0变为1,地址由0变为1,LCD控制则有命令REG变为数据RAM

本文地址:https://blog.csdn.net/u011878611/article/details/107317741