#define LONGREG(reg) ((*(volatile unsigned long *) (reg)))
1.(unsigned long *)(reg)
代表“reg
”是1个unsigned long
类型的指针;
-
volatile
是一个修饰符,告诉编译器此段代码不要优化,确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值; -
(volatile unsigned long *) (reg)
的意思是把reg
强制转换成
volatile unsigned long
类型的指针,暂记为p
,那么就是
#define LONGREG(reg) *p
即LONGREG(reg)
为p
指针指向位置的内容了。
这里就是通过内存寻址访问到寄存器reg
,可以读/写操作。
#define STM0CKSEL LONGREG(0xFFDD8000U)
此时修改STM0CKSEL
的值,就是向地址为0xFFDD8000U
的寄存器中写入值。
通过查芯片手册可知,地址为0xFFDD8000U
的寄存器为STM0CKSEL