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?”
“因为我懒。。”
-
单片机
+关注
关注
6036文章
44555浏览量
635065 -
RTT
+关注
关注
0文章
65浏览量
17122 -
RT-Thread
+关注
关注
31文章
1288浏览量
40111 -
RISC-V
+关注
关注
45文章
2277浏览量
46149 -
ch32
+关注
关注
0文章
73浏览量
639
发布评论请先 登录
相关推荐
评论