ch32vxx模仿stm32位带操作

stm32系列中内核为cm3的芯片支持位带操作,国产芯片模仿stm32规格的很多(c8t6现实标准),最近买了块沁恒的ch32v103r8t6板子,ch32vxx系列是riscv内核的,不支持位带操作,这意味着好多代码没法直接借鉴(无奈)。

通过网络搜索和C语言重新学习(位域和宏),找到了以下替代方法。

typedef struct { //根据芯片内存大小端设置,当前为小端模式,大端反过来
	uint32_t bit0 :1;
	uint32_t bit1 :1;
	uint32_t bit2 :1;
	uint32_t bit3 :1;
	uint32_t bit4 :1;
	uint32_t bit5 :1;
	uint32_t bit6 :1;
	uint32_t bit7 :1;
	uint32_t bit8 :1;
	uint32_t bit9 :1;
	uint32_t bit10 :1;
	uint32_t bit11 :1;
	uint32_t bit12 :1;
	uint32_t bit13 :1;
	uint32_t bit14 :1;
	uint32_t bit15 :1;
	uint32_t bit16 :1;
	uint32_t bit17 :1;
	uint32_t bit18 :1;
	uint32_t bit19 :1;
	uint32_t bit20 :1;
	uint32_t bit21 :1;
	uint32_t bit22 :1;
	uint32_t bit23 :1;
	uint32_t bit24 :1;
	uint32_t bit25 :1;
	uint32_t bit26 :1;
	uint32_t bit27 :1;
	uint32_t bit28 :1;
	uint32_t bit29 :1;
	uint32_t bit30 :1;
	uint32_t bit31 :1;
} GPIO_REG;

//只写了PA,其他同理
#define PAout(n)	(((GPIO_REG *)(&(GPIOA->OUTDR)))->bit##n)
#define PAin(n)		(((GPIO_REG *)(&(GPIOA->INDR)))->bit##n)

查看汇编可知。

自制的仿冒位带操作包含两次访存(一次lbu,一次sb),官方库包含一次调用一次访存(call GPIO_WriteBit,sw),性能上肯定有损失,但低速io场合应该够用,PAout已经测试过,可以正常使用。

你可能感兴趣的:(stm32,mcu,risc-v)