OpenEdv-开源电子网

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

新手求助#define问题(帖子分类发错重发)

[复制链接]

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-6-21
在线时间
41 小时
发表于 2015-12-29 14:38:33 | 显示全部楼层 |阅读模式
1金钱

由于没注意版规,第一个帖子违规被删,现在重新发一下。
[size=18.018px][mw_shl_code=applescript,true]#define SysTick_BASE (SCS_BASE + 0x0010UL)
[size=18.018px]#define SysTick ((SysTick_Type *) SysTick_BASE )[/mw_shl_code]
[size=18.018px]本人新手,刚开始自学原子的stm32F1,才进到编程部分就被卡住了,对于第二个#define如何理解?原来学C的时候没见过这样写的。
[size=18.018px]结合原来帖子坛友的回答,SysTick_BASE所代表的地址值被强制转化为结构体指针类型,这个理解是否正确?
[size=18.018px]SysTick是一个symbol并不是指针变量,SysTick->CTRL是否合法?

最佳答案

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

#define SysTick_BASE (SCS_BASE + 0x0010UL) 这是定义了一个基地址,SysTick的寄存器就放在这个数值开始的地址 typedef struct { __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ __IO uint32_t VAL; /*!< Offset: 0x00 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2015-12-29 14:38:34 | 显示全部楼层
#define SysTick_BASE (SCS_BASE + 0x0010UL)
这是定义了一个基地址,SysTick的寄存器就放在这个数值开始的地址

typedef struct
{
  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
} SysTick_Type;
这是SysTick的几个寄存器,组织在一个结构体里了。

#define SysTick ((SysTick_Type *) SysTick_BASE )
这是把之前定义的基地址强制转换为一个指针,这个指针不是指向int,也不是指向char,而是指向SysTick结构体类型

这样就可以访问SysTick的寄存器了,SysTick->LOAD等等,或者( *SysTick ).LOAD,这是结构体指针的另一种访问形式,但是不直观。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-29 15:04:28 | 显示全部楼层
应该理解为:
第一个SysTick_BASE 等效为系统基地址
第二个SysTick 指向该基地址,且添加了指针类型修饰。
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-23
在线时间
14 小时
发表于 2015-12-29 15:52:58 | 显示全部楼层
第二个define把SysTick定义为 指向SysTick_BASE地址的指针,该指针的类型是SysTick_Type
回复

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-6-21
在线时间
41 小时
 楼主| 发表于 2015-12-29 17:14:33 | 显示全部楼层
365mcu 发表于 2015-12-29 15:04
应该理解为:
第一个SysTick_BASE 等效为系统基地址
第二个SysTick 指向该基地址,且添加了指针类型修饰 ...

第二个SysTick应该就是该地址,只是加了指针类型修饰
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-29 17:20:47 | 显示全部楼层
Allen.W 发表于 2015-12-29 17:14
第二个SysTick应该就是该地址,只是加了指针类型修饰

我理解是指向地址内容了
回复

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-6-21
在线时间
41 小时
 楼主| 发表于 2015-12-29 22:13:21 | 显示全部楼层
zzu65 发表于 2015-12-29 17:48
#define SysTick_BASE (SCS_BASE + 0x0010UL)
这是定义了一个基地址,SysTick的寄存器就放在这个数值开始 ...

解释的很详细,非常感谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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