大家好,关于这个问题我有一些浅薄的理解,希望大家指正
首先是1.指针占据的大小是固定的,如果是32位机,那么是恒定4个字节也就是32位
2.地址并没有变成缩短,地址也是固定的,因为stm32的地址总线为32条,所以地址也是32位的
3.指针的数据类型代表了指向内容的数据类型,如果指针p是char型,那么指针操作:p+1会跳转一个字节,如果指针p是int型,那么p+1会跳转4个字节
4.回到问题代码:#define ILI9341_CMD_ADDR (__IO uint16_t*)(0x60000000)
我一开始的理解是,把地址缩短成16位的指针,我的想法是,那么地址长度缩减不就丢失信息了吗
其实可以这么理解,有一个例子:(网上寻得)
p = (int *)&a[0];
a是一个数组,a[0]表示数组第一个元素,&a[0]表示数组第一个元素在内存中的地址。
(int *)是强制转换成int型指针类型。
所以这个赋值语句是取a[0]在内存中的地址,并且把这个地址强制转换成int型指针值,赋给p。
实际上这条操作的结果,应该是把变量p变成了int*型的指针,也就是指针操作为4个字节,指针的值为a[0]的地址
那么回到FSMC读写SRAM,#define DATA_ADDR (__IO uint8_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned char类型指针的值(值是重点),赋给一个变量,这个变量就会变成指针类型为unsigned char ,值为这个地址的指针,那么指针操作一次为8个位,一个字节,也就实现了一个字节一个字节的操作
同样的,#define DATA_ADDR (__IO uint16_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned short类型指针的值,赋给一个变量,这个变量就会变成指针类型为unsigned short ,值为这个地址的指针,那么指针操作一次为16个位,2个字节,也就实现了2个字节2个字节的操作。
这样我们想读16位的数据,指针一次操作2个字节,操作地址0,外部SRAM放回0,1 ;操作地址2,指针指向地址2,外部SRAM可以放回2,3字节,这样就就实现了16位的读写。
问题和回答都写的很乱,望大家海涵,仅是一些想法。
大家好,关于这个问题我有一些浅薄的理解,希望大家指正
首先是1.指针占据的大小是固定的,如果是32位机,那么是恒定4个字节也就是32位
2.地址并没有变成缩短,地址也是固定的,因为stm32的地址总线为32条,所以地址也是32位的
3.指针的数据类型代表了指向内容的数据类型,如果指针p是char型,那么指针操作:p+1会跳转一个字节,如果指针p是int型,那么p+1会跳转4个字节
4.回到问题代码:#define ILI9341_CMD_ADDR (__IO uint16_t*)(0x60000000)
我一开始的理解是,把地址缩短成16位的指针,我的想法是,那么地址长度缩减不就丢失信息了吗
其实可以这么理解,有一个例子:(网上寻得)
p = (int *)&a[0];
a是一个数组,a[0]表示数组第一个元素,&a[0]表示数组第一个元素在内存中的地址。
(int *)是强制转换成int型指针类型。
所以这个赋值语句是取a[0]在内存中的地址,并且把这个地址强制转换成int型指针值,赋给p。
实际上这条操作的结果,应该是把变量p变成了int*型的指针,也就是指针操作为4个字节,指针的值为a[0]的地址
那么回到FSMC读写SRAM,#define DATA_ADDR (__IO uint8_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned char类型指针的值(值是重点),赋给一个变量,这个变量就会变成指针类型为unsigned char ,值为这个地址的指针,那么指针操作一次为8个位,一个字节,也就实现了一个字节一个字节的操作
同样的,#define DATA_ADDR (__IO uint16_t*)(0x60000000) ,应该理解成把这个地址转变成一个unsigned short类型指针的值,赋给一个变量,这个变量就会变成指针类型为unsigned short ,值为这个地址的指针,那么指针操作一次为16个位,2个字节,也就实现了2个字节2个字节的操作。
这样我们想读16位的数据,指针一次操作2个字节,操作地址0,外部SRAM放回0,1 ;操作地址2,指针指向地址2,外部SRAM可以放回2,3字节,这样就就实现了16位的读写。
问题和回答都写的很乱,望大家海涵,仅是一些想法。
举报