CH32V103是沁恒出的一款基于RiscV核心的單片機,在官網有該芯片的資料、庫函數和例程,另外沁恒還開發了一款IDE:MounRiver Studio。里面也提供了不少的例程可以參考,其中就有帶rt-thread操作系統的例程,雖然只有一個LED的,但聊勝于無,畢竟rt-thread的bsp中還沒有支持到這個芯片。
所以我就基于led功能進行了新功能的開發,但發現其中bsp這塊確實匱乏,只有gpio和uart的drv實現,其他的都還沒做移植,也罷,那我就!!
先不用其他了。。iic spi之類的直接用庫函數來操作了。什么?你說移植下不就好了?
對啊,但是打工人沒時間啊。。哎
會到本帖主題,在調試IIC的時候我發現總是卡在busy,初始化之后就開始總線繁忙,怎么也越不過去了。。。雖然我知道這不一定是像STM32那樣的硬件故障導致的,但是卡的我還是選擇了軟件仿真iic,結果直接就能讀到數據了。。。
嗯,本帖也不是講IIC的,是在過程中我發現沒有微妙延時啊,drv_common也沒有移植過來。。。所以rt_hw_us_delay()這個光有聲明沒有實現。。
于是我參考drv_common中的實現方法,實現了個
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的手冊中有描述,系統計數器低位/高位寄存器可以通過8位/16位/32位來讀取,但只能8位來寫入。
反正也只是讀取數據,就無所謂了。
#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);
}
這段函數定義在board.c中,這樣就不用聲明,直接可以用了。
這樣我的模擬iic速度就起來了。
“為啥不移植下drv_common.c?”
“因為我懶。。”
-
單片機
+關注
關注
6037文章
44560瀏覽量
635537 -
RTT
+關注
關注
0文章
65瀏覽量
17145 -
RT-Thread
+關注
關注
31文章
1290瀏覽量
40161 -
RISC-V
+關注
關注
45文章
2283瀏覽量
46177 -
ch32
+關注
關注
0文章
73瀏覽量
656
發布評論請先 登錄
相關推薦
評論