【灵动微电子MM32F5330测评】+06 定时器制作秒表
一:实验目的 利用定时器实现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 ++ ; }} /************************************************************************************************************************ @briefThis function handles TIM5* @NOTE none* @paramnone* @retval none*********************************************************************************************************************/void TIM5_IRQHandler(void){ if (RESET != TIM_GetITStatus(TIM5, TIM_IT_Update)) {// PLATFORM_LED_Toggle(LED3); TIM_ClearITPendingBit(TIM5, TIM_IT_Update); }} 测试图片如下:这种方式下是不是需要使用外部的电池进行不间断的供电啊 感觉中断函数的函数体里边不够简洁
定时器制作的秒表的误差取决于什么呢 如果只是秒表的话 应该不必太在意误差 如果不进行校准的话 累积误差会不会比较大呢
有没有必要对这个秒表进行时间校正呢
tpgf 发表于 2024-7-18 12:00
这种方式下是不是需要使用外部的电池进行不间断的供电啊
不需要啊那使用RTC弄得秒表 wowu 发表于 2024-7-18 21:41
如果不进行校准的话 累积误差会不会比较大呢
肯定会有误差的,,,只是简单的实现秒表的功能 renzheshengui 发表于 2024-7-18 22:13
有没有必要对这个秒表进行时间校正呢
可以加上,不过只能只能做成线性的 wowu 发表于 2024-7-18 21:41
如果不进行校准的话 累积误差会不会比较大呢
肯定会有误差的 感谢分享,辛苦了 感谢分享
页:
[1]