ch582 io 和51 操作一样 P01=1;P01=0 我移植51程序

ch582 io 和51 操作一样   P01=1;P01=0  我移植51程序  到CH582 里PA1=1;PA1=0;位操作怎么实现 ???PA1=1或0就是输出高电平或低电平??

图片.png


怎么实现 怎么移植到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扩展,而总线不支持,这种情况。


只有登录才能回复,可以选择微信账号登录