#define HAL_PUT_UINT32(a, v) do {\
*(volatile unsigned long *)(a) = (unsigned long)(v);\
} while(0)
#define HAL_GET_UINT32(a) *(volatile unsigned long *)(a)
#define HAL_PUT_BITS(a,m,v) do { unsigned long val = *(volatile unsigned long *)(a);\
val = (val&(~(m)))|((v)&(m));\
*(volatile unsigned long *)(a) = (unsigned long)(val);\
}while(0)
For example:
*(volatile unsigned long *)(a) = (unsigned long)(v);\
} while(0)
#define HAL_GET_UINT32(a) *(volatile unsigned long *)(a)
#define HAL_PUT_BITS(a,m,v) do { unsigned long val = *(volatile unsigned long *)(a);\
val = (val&(~(m)))|((v)&(m));\
*(volatile unsigned long *)(a) = (unsigned long)(val);\
}while(0)
For example:
要将0xbf204004的第16~18bit写成101, ---> HAL_PUT_BITS(0xbf204004,7<<16,5<<16)
第二个操作数为mask,16-18共三bit,111,所以为7,写成101,对应为5.