OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11307|回复: 4

C语言,关于STM32库函数指针定义问题. #define USART1 ((USART_TypeDef *) USART1_BASE) 是怎么回事?

[复制链接]

7

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-10-31
在线时间
1 小时
发表于 2015-1-29 00:04:08 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#define USART1 ((USART_TypeDef *) USART1_BASE) #define USART1_BASE (APB2PERIPH_BASE + 0x1000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define PERIPH_BASE ((uint32_t)0x40000000) typedef struct { __IO uint16_t SR; /*!< USART Status register, Address offset: 0x00 */ uint16_t RESERVED0; /*!< Reserved, 0x02 */ __IO uint16_t DR; /*!< USART Data register, Address offset: 0x04 */ uint16_t RESERVED1; /*!< Reserved, 0x06 */ __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ uint16_t RESERVED2; /*!< Reserved, 0x0A */ __IO uint16_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ uint16_t RESERVED3; /*!< Reserved, 0x0E */ __IO uint16_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ uint16_t RESERVED4; /*!< Reserved, 0x12 */ __IO uint16_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ uint16_t RESERVED5; /*!< Reserved, 0x16 */ __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ uint16_t RESERVED6; /*!< Reserved, 0x1A */ } USART_TypeDef; [/mw_shl_code]
这段代码是库文件的一个 USART1 的定义,我能看明白  USART1 是一个 USART_TypeDef *类型的指针,但是不明白整个定义是什么意思。
USART_TypeDef *) ( 0x40000000 + 0x00010000 + 0x1000 )是定义一个USART_TypeDef *指针,但是后面跟着一个地址是干嘛的?
结构体指针定义可以直接跟地址?地址应该是一个常量,定义不是应该跟一个变量吗?比如 int a ;     不能是int 5;这样吧。

请问给位高手能否给小弟指点一下迷津?



最佳答案

查看完整内容[请看2#楼]

就是指将这个地址,强制转换为USART_TypeDef *指针类型,名字为USART1。 然后就可以放心的用USART1里面的各个寄存器了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-1-29 00:04:09 | 显示全部楼层
就是指将这个地址,强制转换为USART_TypeDef *指针类型,名字为USART1。
然后就可以放心的用USART1里面的各个寄存器了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-1-29 08:47:04 | 显示全部楼层
楼上说的对啊。 malloc用过吗。感觉有点像那个。申请了一段内存,首地址强制转换为你需要类型(如USART_TypeDef *)的指针。或者说让这个类型的指针(USART_TypeDef *)指向这段内存的首地址。
小小蜗牛
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-1-27
在线时间
3 小时
发表于 2015-1-29 12:54:52 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那假如我要操纵的地址是 0x00000001;  能不能写成这样
#define  name    *((u32*)(0x00000001))
   name =1;
这个name的指针是什么类型的?  U32么
我只想说,我想静静,别问静静是谁
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-1-30 00:06:06 | 显示全部楼层
回复【4楼】a751217081:
---------------------------------
你这样,name就是个u32,存储在0x00000001地址
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 06:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表