ch582 io 和51 操作一样 P01=1;P01=0 我移植51程序 到CH582 里PA1=1;PA1=0;位操作怎么实现 ???PA1=1或0就是输出高电平或低电平??
怎么实现 怎么移植到CH582 简单的位操作求教会???怎么移植啊???
同样的问题请不要重复在各个帖子下提问,相同的帖子已经联系管理员删除,尽量不要在不相关的主题下追帖,
ch582是不支持像51里面这种直接对单个io位操作的,可以调用这两个函数:
#define GPIOA_ResetBits(pin)? ? ? (R32_PA_CLR |= pin)
#define GPIOA_SetBits(pin)? ? ? ? (R32_PA_OUT |= pin)
#define GPIOB_ResetBits(pin)? ? ? (R32_PB_CLR |= pin)
#define GPIOB_SetBits(pin)? ? ? ? (R32_PB_OUT |= pin)
分别为A口和B口拉低拉高操作。
和没有说一样 ?
stm32 怎么就可以啊???
ch582是不支持这样操作的,可以通过R32_PA_OUT |= pin和R32_PA_CLR |= pin控制io拉高拉低。
stm32有支持位段操作所以可以通过代码来实现。
如果想要在582上去实现也可以通过自己代码通过位域列表方式实现。
顺便问一下能用原子指令实现操作单个gpio吗?rv32i的atomic扩展,amoor,amoand指令。
ch582是支持RV32MAC指令集的,其中A就是原子指令扩展,使用原子指令去控制io的目的是不被中断打断,实际上操作io也是32位寄存器,按位去操作的,
uint32_t __AMOXOR_W_(volatile int32_t *addr,uint32_t value)
{
uint32_t result;
__asm volatile ("amoxor.w %0, %2, %1" : \
"=r"(result), "+A"(*addr) : "r"(value) : "memory");
return *addr;
}
__AMOXOR_W_(&R32_PB_OUT,GPIO_Pin_0);
ok,你们确认可行就放心了。因为有见过别的riscv mcu core支持atomic扩展,而总线不支持,这种情况。