试用CSM32RV20开发板时,想做个计时器显示时分秒,看了手册和论坛里前辈的帖子,rtc似乎不太适用,便想采用timer,可是折腾半天也没成功。
首先main中设置timer1计数方式,使能中断:
Timer1_UpCounting_Mode_Init();//向上计数Interrupt_Enable(TIMER1_updata_int_ID);//CLIC使能中断
SYS_Interrupt_Enable();//CLIC开总中断
修改timer.c中的Timer1_Update_IRQhandler函数:
volatile uint8_t timer_fg = 0;
volatile uint16_t irq_cnt = 0;
void Timer1_Update_IRQhandler(void)
{
if(TIMER1->SR&0x1)
{
TIMER1->SR &= ~0x1;
}
irq_cnt ++;
//ee_printf("in Timer1_Update_IRQhandler\r\n");
if(irq_cnt == 1000) {
Interrupt_Disable(TIMER1_updata_int_ID);
//ee_printf("timer cnt 1000\r\n");
irq_cnt = 0;
timer_fg = 1;
}
}
这里的irq_cnt++到5次应用就停止了,打印了一堆乱码。需要注意的是,不要在中断函数中打印debug信息,一方面打印频率会非常高,并且printf过程中会被中断打断,导致乱码。CSM32RV20开发板如果串口打印非常频繁,会影响新程序的下载,下载时按复位没反应。刚开始出现无法下载现象时我很慌乱,意为这板子被我玩坏了,后来按其他板子的经验,按住复位重新加电,待出现下载串口时立刻点下载,才又下载成功了。:(
中断函数中的Interrupt_Disable(TIMER1_updata_int_ID)似乎没有起作用,中断没有停下来。
修改分频和预装载值,也没有达到预期效果。分频数改大后,索性没有中断了。我曾在Timer1_UpCounting_Mode_Init中试了几个值。
而且使能中断后,串口打印信息总是出现乱码。
看来timer方式暂时不行了,用笨办法简单实现一个试用demo吧。代码如下,献丑了。待有空时好好研究CSM32RV20的timer和rtc。
更多回帖