stm32的地址分配方面的问题求解,恳请大神细心指针,不胜感激~~~
小弟最近对stm32的地址分配理解不了,很是疑惑,请大神指点~~~(我尽量把问题描述清楚哈)如下为什么STM32官方库文件中摘取的一部分问题1:STM32的中地址是按Bi...
小弟最近对stm32的地址分配理解不了,很是疑惑,请大神指点~~~(我尽量把问题描述清楚哈)
如下为什么STM32官方库文件中摘取的一部分
问题1:STM32的中地址是按Bit,Byte,还是Word作为单位的? 例如0x8000000,它后面的单位是什么?
问题2:为什么有的地址是按照uint16_t,有的是按照uint32_t,这个是为什么?
问题3:如GPIOC和DMA1_Channel1,它们其实都是一个指针,按我的理解,在32位系统下,所有的指针都是占用4个Byte,那干嘛还需要区分 ((GPIO_TypeDef *) 类型指针和 ((DMA_Channel_TypeDef *)指针?
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) 展开
如下为什么STM32官方库文件中摘取的一部分
问题1:STM32的中地址是按Bit,Byte,还是Word作为单位的? 例如0x8000000,它后面的单位是什么?
问题2:为什么有的地址是按照uint16_t,有的是按照uint32_t,这个是为什么?
问题3:如GPIOC和DMA1_Channel1,它们其实都是一个指针,按我的理解,在32位系统下,所有的指针都是占用4个Byte,那干嘛还需要区分 ((GPIO_TypeDef *) 类型指针和 ((DMA_Channel_TypeDef *)指针?
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) 展开
展开全部
1 地址单位一定是字节
2 表示在这个地址的数据宽度
3 指针的区分类型 ,是给你看的 ,对于cpu来说只有地址,偏移,数据大小的区别 ,对人来说才有意义, 通过定义不同的类型可以让指针对一个确定的基址、 偏移量、数据大小
比如 u32 * p1=(u32 *)0x20000000; u8 * p2=(u8 *)0x20000000;
*p1=0x ff ff ff ff;
*p2=0; +0 +1 +2 +3
此时0x20000000处的四个字节是 0x00 0xff 0xff 0xff
2 表示在这个地址的数据宽度
3 指针的区分类型 ,是给你看的 ,对于cpu来说只有地址,偏移,数据大小的区别 ,对人来说才有意义, 通过定义不同的类型可以让指针对一个确定的基址、 偏移量、数据大小
比如 u32 * p1=(u32 *)0x20000000; u8 * p2=(u8 *)0x20000000;
*p1=0x ff ff ff ff;
*p2=0; +0 +1 +2 +3
此时0x20000000处的四个字节是 0x00 0xff 0xff 0xff
追问
非常感谢大神你的回答
问题1:地址的单位是字节,1Byte=8Bit,那对于stm32来说,假定A是stm32的一个寄存器,它是32位的,那是不是这个寄存器就需要4个Byte的地址来表示?小弟这样理解正确吗?
问题2:请问大神:例如A的地址是uint16_6类型,那是不是代表A的数据类型就是16位的?uint32_t依次类推?
问题3:这个问题小弟搞明白了,谢谢哈
追答
问题1:一个32位的寄存器占用从xx地址开始的4个字节,这样描述可能更好理解, 这样描述某个存储变量也是可以的
问题2:应该说是该数据类型的大小是多少字节(一般不使用位来描述数据类型的大小)建议参考c语言的关键字 sizeof 它的结果就是字节
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询