打印
[MM32软件]

【灵动微电子MM32F5330测评】+06 定时器制作秒表

[复制链接]
1031|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一:实验目的
        利用定时器实现1s计数,并在串口输出计数值。
这里我使用的是基通用定时器2.5完成的计数功能;
定时器介绍:TIMx 由一个 16 位可实时编程预分频器和一个 32 位计数方向可调的自动重装载计数器组成,可以为用户提供便捷的计数定时功能,计数器时钟由预分频器分频得到。通用定时器具有多种用途,如输入功能(测量输入信号的脉冲宽度、频率, PWM 输入等),输出功能( PWM 输出、单脉冲模式输出等)。
二:软件配置流程:
使能定时器时钟。
初始化定时器,配置ARR,PSC
开启定时器中断,配置NVIC
使能定时器。
编写中断服务函数。
软件代码:
void TIM2_5_Configure(void)
{
    NVIC_InitTypeDef        NVIC_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
    TIM_TimeBaseStruct.TIM_Prescaler         = (TIM_GetTIMxClock(TIM2) / 10000 - 1);
    TIM_TimeBaseStruct.TIM_CounterMode       = TIM_CounterMode_Up;
    TIM_TimeBaseStruct.TIM_Period            = (10000 - 1);
    TIM_TimeBaseStruct.TIM_ClockDivision     = TIM_CKD_Div1;
    TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    TIM_Cmd(TIM2, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStruct);
    TIM_TimeBaseStruct.TIM_Prescaler         = (TIM_GetTIMxClock(TIM5) / 10000 - 1);
    TIM_TimeBaseStruct.TIM_CounterMode       = TIM_CounterMode_Up;
    TIM_TimeBaseStruct.TIM_Period            = (5000 - 1);
    TIM_TimeBaseStruct.TIM_ClockDivision     = TIM_CKD_Div1;
    TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct);
    TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
    NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    TIM_Cmd(TIM5, ENABLE);
}
中断函数处理部分:
int temp1 = 0 ;
void TIM2_IRQHandler(void)
{
    if (RESET != TIM_GetITStatus(TIM2, TIM_IT_Update))
    {
        PLATFORM_LED_Toggle(LED2);
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                       
                        temp1 ++ ;
    }
}
/***********************************************************************************************************************
  * @brief  This function handles TIM5
  * @NOTE   none
  * @param  none
  * @retval none
  *********************************************************************************************************************/
void TIM5_IRQHandler(void)
{
    if (RESET != TIM_GetITStatus(TIM5, TIM_IT_Update))
    {
//        PLATFORM_LED_Toggle(LED3);
        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
    }
}
测试图片如下:

06_PRINT_Time.zip

734.92 KB

使用特权

评论回复
沙发
tpgf| | 2024-7-18 12:00 | 只看该作者
这种方式下是不是需要使用外部的电池进行不间断的供电啊

使用特权

评论回复
板凳
paotangsan| | 2024-7-18 12:40 | 只看该作者
感觉中断函数的函数体里边不够简洁

使用特权

评论回复
地板
wakayi| | 2024-7-18 13:21 | 只看该作者
定时器制作的秒表的误差取决于什么呢

使用特权

评论回复
5
xiaoqizi| | 2024-7-18 13:57 | 只看该作者
如果只是秒表的话 应该不必太在意误差

使用特权

评论回复
6
wowu| | 2024-7-18 21:41 | 只看该作者
如果不进行校准的话 累积误差会不会比较大呢

使用特权

评论回复
7
renzheshengui| | 2024-7-18 22:13 | 只看该作者
有没有必要对这个秒表进行时间校正呢

使用特权

评论回复
8
聪聪哥哥|  楼主 | 2024-7-19 15:39 | 只看该作者
tpgf 发表于 2024-7-18 12:00
这种方式下是不是需要使用外部的电池进行不间断的供电啊

不需要啊  那使用RTC  弄得秒表

使用特权

评论回复
9
聪聪哥哥|  楼主 | 2024-7-19 15:40 | 只看该作者
wowu 发表于 2024-7-18 21:41
如果不进行校准的话 累积误差会不会比较大呢

肯定会有误差的,,,只是简单的实现秒表的功能

使用特权

评论回复
10
聪聪哥哥|  楼主 | 2024-7-19 15:40 | 只看该作者
renzheshengui 发表于 2024-7-18 22:13
有没有必要对这个秒表进行时间校正呢

可以加上,不过只能只能做成线性的

使用特权

评论回复
11
聪聪哥哥|  楼主 | 2024-7-19 15:41 | 只看该作者
wowu 发表于 2024-7-18 21:41
如果不进行校准的话 累积误差会不会比较大呢

肯定会有误差的

使用特权

评论回复
12
shenxiaolin| | 2024-7-22 17:02 | 只看该作者
感谢分享,辛苦了

使用特权

评论回复
13
shenxiaolin| | 2024-7-29 21:09 | 只看该作者
感谢分享

使用特权

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

本版积分规则

37

主题

104

帖子

0

粉丝