Работя с микроконтролер 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
. Не мога да разбера как да накарам B
да се разшири, без също да разширя A
, поне в GCC. Има заобиколни решения за това, но търся чисто решение. съществува ли