#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




















