嵌入式C语言寄存器操作

671 words

一、常用寄存器操作

1
2
3
4
5
6
7
8
/* 设置位 (置1)	*/
*pReg |= (1 << bit_position);

/* 清除位 (置0) */
*pReg &= ~(1 << bit_position);

/* 取反 */
*pReg ^= (1 << bit_position);

二、寄存器写操作

如下所示为配置Pc13引脚为输出模式的错误示例

1
2
3
4
5
6
7
8
/* 配置为通用输出 
* 00:Input mode
* 01:General purpose output mode
* 10:Alternate function mode
* 11:Analog mode(reset state)
*/
pReg = (uint32_t *)(0x48000800 + 0x00);
*pReg |= 0x01 << 26;

默认配置为为11,上述操作只修改了第二位,第一位未修改,导致配置错误,正确配置如下:

1
2
3
4
/* 配置为通用输出 */
pReg = (uint32_t *)(0x48000800 + 0x00);
*pReg &= ~(0x03 << 26);
*pReg |= 0x01 << 26;

上述配置仍存在一定的安全问题,在对寄存器进行操作时,我们一定要遵守:读->改->写的步骤:

1
2
3
4
5
/ 单次读-修改-写保证原子性
uint32_t temp = *pReg;
temp &= ~(0x03 << 26); // 清除MODER13区域
temp |= 0x01 << 26; // 设为输出模式
*pReg = temp;