记得学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一旦设定好后貌似不能再直接修改了,有没有其他办法了?
|