我正在使用 STM32F1 微控制器,它提供了一个标头,用于定义寄存器的位掩码和值,如下所示:
#define RCC_CFGR_PLLMULL //Mask of PLL multiplier setting bits
#define RCC_CFGR_PLLMULL1 //Value of PLL multiplier bits for PLL x1
#define RCC_CFGR_PLLMULL2 //Value of PLL multiplier bits for PLL x2
#define RCC_CFGR_PLLMULL3 //Value of PLL multiplier bits for PLL x3
等等等等
我想要做的是将我的 PLL 乘法器定义为一个整数,这样我就可以使用它来导出时钟值 - 即PLLCLK = IN_CLK * PLL_MULT
- 并将该值粘贴到RCC_CFGR_PLLMULL
以获得正确的设置位。我通常会使用的宏如下:
#define APPEND_VAL_HELPER(A, B) A##B
#define APPEND_VAL(A, B) APPEND_VAL_HELPER(A,B)
然后,如果我将 SOME_NUM 定义为 123:
#define FOO APPEND_VAL(BAR, SOME_NUM)
结果FOO
定义为BAR123
。通常这是有效的。这就是问题所在:在这种情况下,RCC_CFGR_PLLMULL
在粘贴之前是一个有效的令牌。这导致它在调用中扩展,APPEND_VAL
我得到类似((uint32_t)0x003C0000)123
. 至少在 GCC 中,我无法弄清楚如何在B
不扩展的情况下进行扩展。A
有解决方法,但我正在寻找一个干净的解决方案。它存在吗?