本文主要是介绍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已经测试过,可以正常使用。
这篇关于ch32vxx模仿stm32位带操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!