((*(volatile unsigned long *) (reg)))

#define LONGREG(reg)    ((*(volatile unsigned long *) (reg)))

1.(unsigned long *)(reg) 代表“reg”是1个unsigned long类型的指针;

  1. volatile是一个修饰符,告诉编译器此段代码不要优化,确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值;

  2. (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
((*(volatile unsigned long *) (reg)))_第1张图片

你可能感兴趣的:(c语言,物联网)