[RISC-V MCU 创新应用比赛] 请教如何做一个精准的1MS定时器中断?

[复制链接]
 楼主| 勇敢的大白菜 发表于 2022-8-9 17:41 | 显示全部楼层 |阅读模式
  1. #include "time.h"
  2. #include "led.h"

  3. void TIM3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  4. void TIM3_Int_Init(u16 arr,u16 psc)
  5. {
  6.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7.     NVIC_InitTypeDef NVIC_InitStructure;

  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟

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

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

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

  21.     TIM_Cmd(TIM3, ENABLE); //TIM3使能
  22. }

  23. void TIM3_IRQHandler(void)
  24. {
  25.     static u8 i=0;

  26.     if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3中断是否发生。
  27.       {
  28.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIM3的中断挂起位。
  29.         printf("Enter interrupt\n");
  30.         GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
  31.       }
  32. }
我这个代码中的参数该怎么设置?
xdqfc 发表于 2022-8-10 11:16 | 显示全部楼层
本帖最后由 xdqfc 于 2022-8-10 11:18 编辑

arr是周期,psc是分频器,假如系统时钟是48M,分频器设定47,定时器计数时钟就是1M,假如设定arr是1000,没有错误的话,就是1ms定时。(分频器不知道是48还是47了,要看一下文档)。
LIzs6 发表于 2022-8-10 20:44 | 显示全部楼层
可按照下图计算公式进行计算
Snipaste_2022-08-10_20-43-50.jpg
skyred 发表于 2022-8-15 20:49 | 显示全部楼层
定时器
chenci2013 发表于 2022-8-20 12:22 | 显示全部楼层
谢谢楼主分享的资料。   
mmbs 发表于 2022-8-20 13:45 | 显示全部楼层
定时器还不精确吗   
ingramward 发表于 2022-8-20 20:29 | 显示全部楼层
ch32v103提供了这个代码的。  
phoenixwhite 发表于 2022-8-21 20:27 | 显示全部楼层
这个直接中断产生  
sdlls 发表于 2022-8-21 21:24 | 显示全部楼层
使用systick可以。   
cehuafan 发表于 2022-9-5 16:46 | 显示全部楼层
定好初值后要延迟一秒就定一个延时参数
louliana 发表于 2022-9-5 17:20 | 显示全部楼层
:配置一个1ms定时器,并设置为自动清零模式
jstgotodo 发表于 2022-9-8 09:02 | 显示全部楼层
这个bsp没有吗?               
suzhanhua 发表于 2022-9-8 10:01 | 显示全部楼层
如何编写代码?
xdqfc 发表于 2022-9-8 11:16 | 显示全部楼层

就是几个寄存器配置一下的事情,看一下文档就搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

481

帖子

2

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