ch582 io 和51 操作一樣?? P01=1;P01=0? 我移植51程序? 到CH582 里PA1=1;PA1=0;位操作怎么實(shí)現(xiàn) ???PA1=1或0就是輸出高電平或低電平??
怎么實(shí)現(xiàn) 怎么移植到CH582? 簡單的位操作求教會(huì)???怎么移植?。???
同樣的問題請不要重復(fù)在各個(gè)帖子下提問,相同的帖子已經(jīng)聯(lián)系管理員刪除,盡量不要在不相關(guān)的主題下追帖,
ch582是不支持像51里面這種直接對單個(gè)io位操作的,可以調(diào)用這兩個(gè)函數(shù):
#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有支持位段操作所以可以通過代碼來實(shí)現(xiàn)。
如果想要在582上去實(shí)現(xiàn)也可以通過自己代碼通過位域列表方式實(shí)現(xiàn)。
順便問一下能用原子指令實(shí)現(xiàn)操作單個(gè)gpio嗎?rv32i的atomic擴(kuò)展,amoor,amoand指令。
ch582是支持RV32MAC指令集的,其中A就是原子指令擴(kuò)展,使用原子指令去控制io的目的是不被中斷打斷,實(shí)際上操作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,你們確認(rèn)可行就放心了。因?yàn)橛幸娺^別的riscv mcu core支持atomic擴(kuò)展,而總線不支持,這種情況。