打印
[RISC-V MCU 应用开发]

[MCU应用开发] [RISC-V MCU CH32V103测评]+定时器

[复制链接]
471|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海洋无限|  楼主 | 2020-11-14 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
到周末了,又可以玩玩板子,今天更新定时器部分,其实也比较简单,定时器1是高级定时器,定时器2 3 4都是基本定时器,由于之前系统滴答没有搞定,这里将定时器2作为系统滴答定时器开始后面的代码开发,本次实验先测试下定时器2 3 4的基本功能,直接看代码,下面这个地方不太明白,请论坛里面指导的给以讲解,少了这段code运行不起来
void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void TIM4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));



定义定时器中断间隔:
#define TIM2_PSC    72
#define TIM2_ARR    1000    //1ms

#define TIM3_PSC    7200
#define TIM3_ARR    5000    //500ms

#define TIM4_PSC    7200
#define TIM4_ARR    5000    //500ms



每个定时器的配置如下,这里就以定时器2为例:
/*******************************************************************************
* Function Name  : TIM2_Int_Init
* Description    : TIM2_Int_Init.
* Input          : None
* Return         : None
*******************************************************************************/
void TIM2_Int_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM3时钟

    TIM_TimeBaseStructure.TIM_Period = TIM2_ARR-1;   //指定下次更新事件时要加载到活动自动重新加载寄存器中的周期值。
    TIM_TimeBaseStructure.TIM_Prescaler =TIM2_PSC-1; //指定用于划分TIM时钟的预分频器值。
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频因子
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM计数模式,向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能TIM2中断,允许更新中断

    //初始化TIM NVIC,设置中断优先级分组
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;           //TIM2中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //设置响应优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断
    NVIC_Init(&NVIC_InitStructure); //初始化NVIC

    TIM_Cmd(TIM2, ENABLE); //TIM2使能
}
定时器中断函数如下:
/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : TIM2_IRQHandler.
* Input          : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
    static u8 i=0;
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
    {
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    //清除TIM3的中断挂起位。
//        printf("Enter interrupt\n");
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
    }
}


启动时对定时器进行初始化
TIM2_Int_Init();
    TIM3_Int_Init();
    TIM4_Int_Init();
编译代码,下载到板子上看到LED等以1s周期闪烁,定时器3和4,用同样的方法进行测试,ok。




Timer.zip

1.61 KB

使用特权

评论回复

相关帖子

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

本版积分规则

个人签名:永远忠于年轻时的梦想!

20

主题

376

帖子

1

粉丝