CH32V103是沁恒出的一款基于RiscV核心的單片機(jī),在官網(wǎng)有該芯片的資料、庫函數(shù)和例程,另外沁恒還開發(fā)了一款I(lǐng)DE:MounRiver Studio。里面也提供了不少的例程可以參考,其中就有帶rt-thread操作系統(tǒng)的例程,雖然只有一個(gè)LED的,但聊勝于無,畢竟rt-thread的bsp中還沒有支持到這個(gè)芯片。
所以我就基于led功能進(jìn)行了新功能的開發(fā),但發(fā)現(xiàn)其中bsp這塊確實(shí)匱乏,只有g(shù)pio和uart的drv實(shí)現(xiàn),其他的都還沒做移植,也罷,那我就!!
先不用其他了。。iic spi之類的直接用庫函數(shù)來操作了。什么?你說移植下不就好了?
對(duì)啊,但是打工人沒時(shí)間啊。。哎
會(huì)到本帖主題,在調(diào)試IIC的時(shí)候我發(fā)現(xiàn)總是卡在busy,初始化之后就開始總線繁忙,怎么也越不過去了。。。雖然我知道這不一定是像STM32那樣的硬件故障導(dǎo)致的,但是卡的我還是選擇了軟件仿真iic,結(jié)果直接就能讀到數(shù)據(jù)了。。。
嗯,本帖也不是講IIC的,是在過程中我發(fā)現(xiàn)沒有微妙延時(shí)啊,drv_common也沒有移植過來。。。所以rt_hw_us_delay()這個(gè)光有聲明沒有實(shí)現(xiàn)。。
于是我參考drv_common中的實(shí)現(xiàn)方法,實(shí)現(xiàn)了個(gè)
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);
}
因?yàn)镃H32V103的systick寄存器定義和st的有些差異,因此這里我就直接取值定義了兩個(gè)宏,在CH32V103的手冊(cè)中有描述,系統(tǒng)計(jì)數(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?”
“因?yàn)槲覒小!!?/span>
-
單片機(jī)
+關(guān)注
關(guān)注
6032文章
44521瀏覽量
633120 -
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17088 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1273瀏覽量
39928 -
RISC-V
+關(guān)注
關(guān)注
44文章
2230瀏覽量
46036 -
ch32
+關(guān)注
關(guān)注
0文章
73瀏覽量
628
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論