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是否还有其它操作方法。 |