打印

学习STM32的一些疑惑

[复制链接]
1368|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2014-1-23 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
记得学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一旦设定好后貌似不能再直接修改了,有没有其他办法了?

沙发
Leeone| | 2014-1-23 21:14 | 只看该作者
1.加括号是为了更清晰
2. u32也是宏而已,无符号32位,可以找到
3.没看他的书
个人理解,后续高手验证。。。

使用特权

评论回复
板凳
jjjkkk00| | 2014-1-24 09:03 | 只看该作者
本帖最后由 jjjkkk00 于 2014-1-24 09:05 编辑

我也觉得加括号是为了阅读方便 和 保证算法不受优先级的影响。
u32就是32位的无符号整型。
typedef uint32_t  u32;
CC++编程语言中,typedef是一个关键字。它用来对一个资料类型取一个新名字。目的是为了使源代码更易于阅读和理解。

使用特权

评论回复
地板
人民币的幻想| | 2014-1-24 10:43 | 只看该作者
建议看看权威指南中关于地址映射和存储器系统的说明

使用特权

评论回复
5
msblast| | 2014-1-24 11:06 | 只看该作者
1、C语言中的括号有很多用法。就本例而言,是让定义的常量以一个整体出现。
2、u32是一个32bit无符号整数类型。(u32)是强制转换类型。所有的地址都是无符号整数类型。
3、谭浩强的c语言教材是一个入门教材。但是关于编译预处理和类型强制转换还是有提及的。

使用特权

评论回复
6
zhangyang86| | 2014-1-24 11:48 | 只看该作者
u32是啥,你可以在mdk里面选中,然后右键:go to definition of ,就可以查看到了。。。

使用特权

评论回复
7
tianli1980| | 2014-1-24 20:54 | 只看该作者
论坛有个此类问题的帖子,说的很详细,LZ搜索 一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝