OpenEdv-开源电子网

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

一个很重要的问题——MDK是怎样操作STM32地址的

[复制链接]

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2011-6-11
在线时间
0 小时
发表于 2012-2-22 19:06:19 | 显示全部楼层 |阅读模式

以下是关于STM32地址操作的心得,同时还有个问题请教大家

---------------------------------------------------------------------------------------------------------------

记得学51单片机时,如果要对某个特殊功能寄存器操作,在C51中可以用sfr先定义这个寄存器

但是现在STM32中却看不到SFR了,那么它是怎么操作那么多的寄存器的呢? 拿GPIOA举例来说

我顺藤摸瓜找到了它是怎样一步步被定义出来的,见下面的代码

  #define PERIPH_BASE            ((u32)0x40000000)                        //定义外设基地址   
  #define APB2PERIPH_BASE    (PERIPH_BASE + 0x10000)               //定义APB2外设基地址
  #define GPIOA_BASE             (APB2PERIPH_BASE + 0x1800)         //定义GPIOE的基地址              
  #define GPIOA                      ((GPIO_TypeDef *) GPIOA_BASE)       //可以推测出这句话定义了一个地址在 GPIOA_BASE 的GPIO_TypeDef 结构体

好了下面可以在我们的程序中操作寄存器了,比如让GPIOA输出全零;
  GPIOA->ODR=0x0000;

-------------------------------------------------------------------------------------------------------------------

问题来了:1、 上面代码中宏定义加括号是什么用法,为什么要加括号,

               2、 第一条语句中的u32又是什么用法,没见过这样用的

               3、 我在谭浩强书上没找到这种用法,求高人详细分析

再问个有趣的问题,要是STM32可以在运行的时候根据CPU的使用率(用ucos可以统计)调节PLL的值来降低STM32的功耗,但是问题是PLL一旦设定好后貌似不能再直接修改了,有没有其他办法

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-22 19:43:46 | 显示全部楼层
回复【楼主位】trusture:
---------------------------------
就是个类型说明,你不要那个u32也可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2011-6-11
在线时间
0 小时
 楼主| 发表于 2012-2-22 19:52:32 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
加括号是什么用法呢
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2011-6-11
在线时间
0 小时
 楼主| 发表于 2012-2-22 22:04:23 | 显示全部楼层
自己顶  求原子哥解答一下第二个问题
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2012-2-22 22:14:59 | 显示全部楼层
论坛有个此类问题的帖子,说的很详细,LZ搜索 一下。
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2011-6-11
在线时间
0 小时
 楼主| 发表于 2012-2-22 23:03:17 | 显示全部楼层
回复【5楼】螃蟹爱虫:
---------------------------------
我用地址做关键词搜都搜不到我说的问题

螃蟹 你说的是《 Keil编程环境下STM32内存管理研究[转载]》这篇帖子吧    可惜这和我说的完全不是一回事
其实我的问题就是关于C语言宏定义的一种奇怪的用法,你知道这种用法么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-22 23:30:46 | 显示全部楼层
回复【3楼】trusture:
---------------------------------
加括号就是强制转换!
u32,因为在这里,数据本来就是u32的,所以不加这个也可以,但是为了增强可读性,以及代码一致性,这里加u32,显得更加专业和安全.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2011-10-24
在线时间
31 小时
发表于 2012-2-23 08:38:58 | 显示全部楼层
C51的寄存器都对应的是地址(也是数字)
STM32的寄存器直接定义成数字,道理是一样的。
回复 支持 反对

使用道具 举报

5

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2011-10-24
在线时间
31 小时
发表于 2012-2-23 08:40:13 | 显示全部楼层
你可以看看C51   0,P1,P2等等,都有固定的地址(用数字表示)。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2012-2-23 08:50:57 | 显示全部楼层
回复【6楼】trusture:
---------------------------------
帮你找到了。http://www.openedv.com/posts/list/918.htm
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2011-6-11
在线时间
0 小时
 楼主| 发表于 2012-2-23 09:18:54 | 显示全部楼层
回复【10楼】螃蟹爱虫:
---------------------------------
感谢螃蟹,这篇帖子以前扫了一下,不知道他除了讲volatile,还讲了#define 的这种特殊用法,
其实自己分析代码,已经可以推测出这种用法的含义了,但是就是觉得突然冒出来的新用法,在谭浩强的书上又找不到,一时难以接受。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 23:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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