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?”
“因为我懒。。”
-
单片机
+关注
关注
6074文章
45340浏览量
663536 -
RTT
+关注
关注
0文章
66浏览量
18134 -
RT-Thread
+关注
关注
32文章
1540浏览量
44280 -
RISC-V
+关注
关注
48文章
2792浏览量
51905 -
ch32
+关注
关注
0文章
74浏览量
1156
发布评论请先 登录
【RTT大赛作品连载】AB32VG1评估板到货控制彩灯测试
【RTT大赛作品连载】CH32V103开发板资料及上电首测
【RTT大赛作品连载】中科蓝讯AB32VG1开发板开箱篇
【RTT大赛作品连载】CH32V103 USBHID键盘鼠标
【有奖活动】RT-Thread创新应用大赛作品连载征文
RTT Studio ch32v307的堆内存最大化
华大单片机HC32L136+RTT踩坑(官方延时函数)
MM32F013x——RTT使用技巧

【RTT大赛作品连载】CH32V RTT微秒延时的实现
评论