打印

GD32VF103 Systimer调试

[复制链接]
1964|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
readocean|  楼主 | 2021-6-12 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32VF103系列RISC-V单片机在官方的文档中没有相应的Systick说明,在提供的固件库中只有读取此寄存器的函数,没有提供对计数寄存器设定,比较寄存器设定函数,计数时钟控制寄存器也不能操作。对此查找其他一些资料,编写了对Systimer计数寄存器、比较寄存器、控制寄存器的操作函数,可以实现对Systick主要寄存器的使用。
void SysTimer_Start(void)     //计数时钟启动控制
{
    (* (unsigned long *) (TIMER_CTRL_ADDR+TIMER_MTIMECTL )) &= ~(SysTimer_MTIMECTL_TIMESTOP_Msk);
}

void SysTimer_Stop(void)    //计数时钟停止控制
{
    (* (unsigned long *) (TIMER_CTRL_ADDR+TIMER_MTIMECTL ))|= SysTimer_MTIMECTL_TIMESTOP_Msk;
}

void Systimer_SetLoadvalue(uint64_t value)   //设定计数寄存器
{
    uint32_t value_h,value_l;
    value_l=(uint32_t) value;
    value_h=(uint32_t)(value>>32);
    (* (unsigned long *) (TIMER_CTRL_ADDR + 4)) = value_h;
    (* (unsigned long *) (TIMER_CTRL_ADDR )) = value_l;
}

void Systimer_Set_Comparvalue(uint64_t tick)   //设定比较寄存器
{
    uint32_t tick_h,tick_l;
    tick_l=(uint32_t)tick;
    tick_h=(uint32_t)(tick>>32);
    (* (unsigned long *) (TIMER_CTRL_ADDR +TIMER_MTIMECMP+ 4)) = tick_h;
    (* (unsigned long *) (TIMER_CTRL_ADDR+TIMER_MTIMECMP )) = tick_l;
}

TIMER_MTIMECTL偏移地址需要需要自己定义一下,
#define TIMER_MTIMECTL 0xFF8
#define TIMER_MTIMECTL_size   0x4

#define SysTimer_MTIMECTL_TIMESTOP_Pos      0U                                          /*!< SysTick Timer MTIMECTL: TIMESTOP bit Position */
#define SysTimer_MTIMECTL_TIMESTOP_Msk      (1UL << SysTimer_MTIMECTL_TIMESTOP_Pos)

其它地址在固件库中有

在实际调试中,一开始发现中断设置后,不能产生中断,后验证发现,在中断函数内
需要每次都对比较寄存器进行重载,才能清除中断标志位,使得中断可以触发。
不知在大家使用GD32VF103是否还有其它操作方法。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

10

帖子

0

粉丝