stm32 中地址的理解

liuchang910781261 2015-03-18 01:35:42
小弟最近对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)
...全文
1709 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jastinxu 2017-11-06
  • 打赏
  • 举报
回复
楼主C语言不过关啊
lr2131 2015-03-19
  • 打赏
  • 举报
回复
引用 9 楼 liuchang910781261 的回复:
[quote=引用 8 楼 lr2131 的回复:] [quote=引用 6 楼 liuchang910781261 的回复:] 小弟还是有个疑问: 问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 问题2:一般情况下:我如何知道一个地址单元它可以表达的数据量是多大? 例如:对于32位的stm32单片机,它的一个地址单元(例如0x80000000)能表示的数据量是多少(就是这样数据占用内存是多少)?
谢谢大神~~~ 你思考问题的切入点不对,你不要老揪着这几个宏定义的东西去考虑它是什么。 你应该是结合上下文,去找这些宏在什么地方用的,是怎么用的,这样你才能真正理解,别人就算给你解释,也一样会带上这些代码实例给你讲,那不如你自己去参考这些代码嘛[/quote][/quote] 我不是大神,我也有一堆子东西不会,我自己也时常感觉很惭愧,和很多同行比,我还差得很远。 我现在也越来越沉不下心来搞技术学新东西了,感觉技术路越走只有越黑,越走只有越窄的。 认认真真搞技术可能也就这两年了,以后的路还不知道怎么走。 我说话直了点也请不要见怪,完全没有冒犯和鄙夷的意思,还请见谅。
liuchang910781261 2015-03-19
  • 打赏
  • 举报
回复
引用 8 楼 lr2131 的回复:
[quote=引用 6 楼 liuchang910781261 的回复:] 小弟还是有个疑问: 问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 问题2:一般情况下:我如何知道一个地址单元它可以表达的数据量是多大? 例如:对于32位的stm32单片机,它的一个地址单元(例如0x80000000)能表示的数据量是多少(就是这样数据占用内存是多少)?
谢谢大神~~~ 你思考问题的切入点不对,你不要老揪着这几个宏定义的东西去考虑它是什么。 你应该是结合上下文,去找这些宏在什么地方用的,是怎么用的,这样你才能真正理解,别人就算给你解释,也一样会带上这些代码实例给你讲,那不如你自己去参考这些代码嘛[/quote]
liuchang910781261 2015-03-19
  • 打赏
  • 举报
回复
引用 10 楼 lr2131 的回复:
[quote=引用 9 楼 liuchang910781261 的回复:] [quote=引用 8 楼 lr2131 的回复:] [quote=引用 6 楼 liuchang910781261 的回复:] 小弟还是有个疑问: 问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 问题2:一般情况下:我如何知道一个地址单元它可以表达的数据量是多大? 例如:对于32位的stm32单片机,它的一个地址单元(例如0x80000000)能表示的数据量是多少(就是这样数据占用内存是多少)?
谢谢大神~~~ 你思考问题的切入点不对,你不要老揪着这几个宏定义的东西去考虑它是什么。 你应该是结合上下文,去找这些宏在什么地方用的,是怎么用的,这样你才能真正理解,别人就算给你解释,也一样会带上这些代码实例给你讲,那不如你自己去参考这些代码嘛[/quote][/quote] 我不是大神,我也有一堆子东西不会,我自己也时常感觉很惭愧,和很多同行比,我还差得很远。 我现在也越来越沉不下心来搞技术学新东西了,感觉技术路越走只有越黑,越走只有越窄的。 认认真真搞技术可能也就这两年了,以后的路还不知道怎么走。 我说话直了点也请不要见怪,完全没有冒犯和鄙夷的意思,还请见谅。[/quote] 没有啊,真的很感激你~~~
lr2131 2015-03-18
  • 打赏
  • 举报
回复
引用 6 楼 liuchang910781261 的回复:
小弟还是有个疑问: 问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 问题2:一般情况下:我如何知道一个地址单元它可以表达的数据量是多大? 例如:对于32位的stm32单片机,它的一个地址单元(例如0x80000000)能表示的数据量是多少(就是这样数据占用内存是多少)?
你思考问题的切入点不对,你不要老揪着这几个宏定义的东西去考虑它是什么。 你应该是结合上下文,去找这些宏在什么地方用的,是怎么用的,这样你才能真正理解,别人就算给你解释,也一样会带上这些代码实例给你讲,那不如你自己去参考这些代码嘛
zhxianbin 2015-03-18
  • 打赏
  • 举报
回复
问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 这还是 C 语言的问题 ,指针(p)变化的步长 = sizeof(*p)
liuchang910781261 2015-03-18
  • 打赏
  • 举报
回复
小弟还是有个疑问: 问题1:还是以((uint32_t)0x08000000) 为例: 这个0x8000000给出的其实是起始地址(而地址在内存中占用的长度是不变的,就想指针在32位系统下永远是占用4个字节一样),(uint32_t)就好比是地址单元变化的步长,我可以这样理解吗?那它的步长是多少呢? 问题2:一般情况下:我如何知道一个地址单元它可以表达的数据量是多大? 例如:对于32位的stm32单片机,它的一个地址单元(例如0x80000000)能表示的数据量是多少(就是这样数据占用内存是多少)?
liuchang910781261 2015-03-18
  • 打赏
  • 举报
回复
引用 4 楼 lr2131 的回复:
[quote=引用 2 楼 liuchang910781261 的回复:] [quote=引用 1 楼 lr2131 的回复:] [quote=引用 楼主 liuchang910781261 的回复:] 小弟最近对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)
建议你好好研究下memory map这一章。 1.byte 2.uint16_t和uint32_t不是描述地址的,是描述变量的长度的。 3.问题和2类似。楼主要明白,指针的长度都是一样的,指针指向的变量长度才是有不一样的。 你有见过 void类型的指针没? void *p,那sizeof(p)又该是多少呢。 楼主,你的C语言感觉基础还不够牢固,这些问题和单片机没有关系,你得好好把书再看看。[/quote] 大神说的是~小弟受教了~~~ 再请教大神一个问题: #define FLASH_BASE ((uint32_t)0x08000000) 那FLASH_BASE是个地址,为什么要对这个地址使用(uint32_t)转换呢?[/quote] 你看看这个宏定义是在什么地方使用的,看名字,应该是赋给某个地址变量的,那个变量的类型应该就是uint32_t的。 你当然也可以不在宏定义的地方给出类型,而在赋值的时候自己做类型转换,甚至让编译器自己做自动类型转换可能也是可以的,只是效率低一点,代码可读性差一点。[/quote] 小弟明白了,非常感谢你~~~ 也就是说:我通过地址的格式就知道数据位的长度,是这个意思吧?
lr2131 2015-03-18
  • 打赏
  • 举报
回复
引用 2 楼 liuchang910781261 的回复:
[quote=引用 1 楼 lr2131 的回复:] [quote=引用 楼主 liuchang910781261 的回复:] 小弟最近对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)
建议你好好研究下memory map这一章。 1.byte 2.uint16_t和uint32_t不是描述地址的,是描述变量的长度的。 3.问题和2类似。楼主要明白,指针的长度都是一样的,指针指向的变量长度才是有不一样的。 你有见过 void类型的指针没? void *p,那sizeof(p)又该是多少呢。 楼主,你的C语言感觉基础还不够牢固,这些问题和单片机没有关系,你得好好把书再看看。[/quote] 大神说的是~小弟受教了~~~ 再请教大神一个问题: #define FLASH_BASE ((uint32_t)0x08000000) 那FLASH_BASE是个地址,为什么要对这个地址使用(uint32_t)转换呢?[/quote] 你看看这个宏定义是在什么地方使用的,看名字,应该是赋给某个地址变量的,那个变量的类型应该就是uint32_t的。 你当然也可以不在宏定义的地方给出类型,而在赋值的时候自己做类型转换,甚至让编译器自己做自动类型转换可能也是可以的,只是效率低一点,代码可读性差一点。
of123 2015-03-18
  • 打赏
  • 举报
回复
就是赋给它一个数据类型。这样,*FLASH_BASE 就是一个双字(4字节)。
liuchang910781261 2015-03-18
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
[quote=引用 楼主 liuchang910781261 的回复:] 小弟最近对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)
建议你好好研究下memory map这一章。 1.byte 2.uint16_t和uint32_t不是描述地址的,是描述变量的长度的。 3.问题和2类似。楼主要明白,指针的长度都是一样的,指针指向的变量长度才是有不一样的。 你有见过 void类型的指针没? void *p,那sizeof(p)又该是多少呢。 楼主,你的C语言感觉基础还不够牢固,这些问题和单片机没有关系,你得好好把书再看看。[/quote] 大神说的是~小弟受教了~~~ 再请教大神一个问题: #define FLASH_BASE ((uint32_t)0x08000000) 那FLASH_BASE是个地址,为什么要对这个地址使用(uint32_t)转换呢
lr2131 2015-03-18
  • 打赏
  • 举报
回复
引用 楼主 liuchang910781261 的回复:
小弟最近对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)
建议你好好研究下memory map这一章。 1.byte 2.uint16_t和uint32_t不是描述地址的,是描述变量的长度的。 3.问题和2类似。楼主要明白,指针的长度都是一样的,指针指向的变量长度才是有不一样的。 你有见过 void类型的指针没? void *p,那sizeof(p)又该是多少呢。 楼主,你的C语言感觉基础还不够牢固,这些问题和单片机没有关系,你得好好把书再看看。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧