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

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



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

  3. #define TIM3_PSC    7200
  4. #define TIM3_ARR    5000    //500ms

  5. #define TIM4_PSC    7200
  6. #define TIM4_ARR    5000    //500ms



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

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

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

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

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

  24.     TIM_Cmd(TIM2, ENABLE); //TIM2使能
  25. }
定时器中断函数如下:
  1. /*******************************************************************************
  2. * Function Name  : TIM2_IRQHandler
  3. * Description    : TIM2_IRQHandler.
  4. * Input          : None
  5. * Return         : None
  6. *******************************************************************************/
  7. void TIM2_IRQHandler(void)
  8. {
  9.     static u8 i=0;
  10.     if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
  11.     {
  12.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    //清除TIM3的中断挂起位。
  13. //        printf("Enter interrupt\n");
  14.         GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
  15.     }
  16. }


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




Timer.zip

1.61 KB, 下载次数: 2

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

39

主题

539

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:永远忠于年轻时的梦想!

39

主题

539

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部