CH32V103是沁恒出的一款基于RiscV核心的單片機,在官網(wǎng)有該芯片的資料、庫函數(shù)和例程,另外沁恒還開發(fā)了一款I(lǐng)DE:MounRiver Studio。里面也提供了不少的例程可以參考,其中就有帶rt-thread操作系統(tǒng)的例程,雖然只有一個LED的,但聊勝于無,畢竟rt-thread的bsp中還沒有支持到這個芯片。
所以我就基于led功能進行了新功能的開發(fā),但發(fā)現(xiàn)其中bsp這塊確實匱乏,只有g(shù)pio和uart的drv實現(xiàn),其他的都還沒做移植,也罷,那我就??!
先不用其他了。。iic spi之類的直接用庫函數(shù)來操作了。什么?你說移植下不就好了?
對啊,但是打工人沒時間啊。。哎
會到本帖主題,在調(diào)試IIC的時候我發(fā)現(xiàn)總是卡在busy,初始化之后就開始總線繁忙,怎么也越不過去了。。。雖然我知道這不一定是像STM32那樣的硬件故障導(dǎo)致的,但是卡的我還是選擇了軟件仿真iic,結(jié)果直接就能讀到數(shù)據(jù)了。。。
嗯,本帖也不是講IIC的,是在過程中我發(fā)現(xiàn)沒有微妙延時啊,drv_common也沒有移植過來。。。所以rt_hw_us_delay()這個光有聲明沒有實現(xiàn)。。
于是我參考drv_common中的實現(xiàn)方法,實現(xiàn)了個
void rt_hw_us_delay(rt_uint32_t us)
{
rt_uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do {
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
} while(delta < us_tick * us);
}
因為CH32V103的systick寄存器定義和st的有些差異,因此這里我就直接取值定義了兩個宏,在CH32V103的手冊中有描述,系統(tǒng)計數(shù)器低位/高位寄存器可以通過8位/16位/32位來讀取,但只能8位來寫入。
反正也只是讀取數(shù)據(jù),就無所謂了。
#define SysTick_VAL ((UINT32 *) 0xE000F004)
#define SysTick_LOAD ((UINT32 *) 0xE000F00C)
void rt_hw_us_delay(rt_uint32_t us)
{
rt_uint32_t start, now, delta, reload, us_tick;
start = *SysTick_VAL;
reload = *SysTick_LOAD;
us_tick = SystemCoreClock / 1000000UL;
do {
now = *SysTick_VAL;
delta = start > now ? start - now : reload + start - now;
} while(delta < us_tick * us);
}
這段函數(shù)定義在board.c中,這樣就不用聲明,直接可以用了。
這樣我的模擬iic速度就起來了。
“為啥不移植下drv_common.c?”
“因為我懶。?!?/span>
-
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635235 -
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17127 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40125 -
RISC-V
+關(guān)注
關(guān)注
45文章
2277瀏覽量
46158 -
ch32
+關(guān)注
關(guān)注
0文章
73瀏覽量
646
發(fā)布評論請先 登錄
相關(guān)推薦
評論