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

描述

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位来写入。

ch32

反正也只是读取数据,就无所谓了。

#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?”

“因为我懒。。”

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分