本次实验使用的NUCLEO-G071RB开发板由
https://www.stmcu.com.cn/index.p ... /261/layout/product提供,更多相关资讯请进入查询。本次实验是利用NUCLEO-G071RB开发板的TIM6模块产生定时中断用以控制LD4的亮灭。并通过逻辑分析仪测试中断溢出时间,借此检验内部时钟精度。
一、实验资源
1、NUCLEO-G071RB开发板;
2、Keil v5.25.2.0;
3、STM32CubeMX v5.0.1;
4、逻辑分析仪;
二、实验过程
1、资源简介。定时器在微控制器中是一项非常关键也是非常重要的资源在STM32G071RBT6的定时器资源异常丰富,从下面的图中可以看到这些定时器。这其中包括了:
1个高级定时器:TIM1;
6个通用定时器:TIM2、TIM3、TIM14、TIM15、TIM16、TIM17;
2个基本定时器:TIM6、TIM7;
2个低功耗定时器:LPTIM1、LPTIM2;
2个看门狗定时器:WWDG、IWDG;
1个系统定时器:SysTick;
以上共计6个类别14个定时器,每个类别所具有的定时器数量不同功能有差异,应用范围也不尽相同,但是最基本的功能还是定时。基本定时器TIM6及TIM7在应用中相对比较简单,本次实验就是利用基本定时器中的TIM6产生定时中断控制LD4进行翻转。下面截图是官方手册中的描述:
这是一个独立的带有预分频器的16位可自动重装载向上计数器,可用于计时及DAC驱动,计数溢出后触发中断及DMA请求。
2、程序实现。下面的截图就是利用STM32CubeMX进行工程配置的状况,时钟直接选用HSI内部时钟16MHz,其它均按默认值,在工程中再行修改:
下面分别是TIM6初始化函数、中断服务函数以及中断回调函数。函数内的注释可能有误,请朋友们指教。
- /* TIM6 init function */
- void MX_TIM6_Init(void)
- {
- TIM_MasterConfigTypeDef sMasterConfig = {0};
- /*
- 内部时钟16MHz,经Prescaler = (1600-1)分频:16MHz/1600=10KHz
- TIM3计数频率CK_CN=10KHz
- TIM3最小计时间= (1+1)*1/10KHz=0.0002s
- TIM3最大计时间=(65535+1)*1/10KHz=6.5536s
- 自动重装载值Period = 4999,
- TIM3计数溢出时间=(4999+1)*1/10KHz=0.5s=500ms
- */
- htim6.Instance = TIM6;
- htim6.Init.Prescaler = (1600-1);
- htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim6.Init.Period = 4999;
- htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
- if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
- {
- Error_Handler();
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
- {
- Error_Handler();
- }
- /*此处添加了TIM6更新中断并使能TIM6*/
- if (HAL_TIM_Base_Start_IT(&htim6)!= HAL_OK)
- {
- Error_Handler();
- }
- }
复制代码
- void TIM6_DAC_LPTIM1_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM6_DAC_LPTIM1_IRQn 0 */
- /* USER CODE END TIM6_DAC_LPTIM1_IRQn 0 */
- HAL_TIM_IRQHandler(&htim6);
- /* USER CODE BEGIN TIM6_DAC_LPTIM1_IRQn 1 */
- /* USER CODE END TIM6_DAC_LPTIM1_IRQn 1 */
- }
复制代码
- /* USER CODE BEGIN 1 */
- /*TIM6中断回调函数*/
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);//中断产生LD4翻转
- }
- /* USER CODE END 1 */
复制代码
三、实验结果
LD4呈亮、灭闪烁状态,将逻辑分析仪接入后测试图如下:程序中设计TIM6溢出中断时间为500ms,经逻辑分析仪实测实际时间为498ms。内部时钟精度还是很不错的。
四、实验总结
通过此次基本定时器TIM6的中断溢出实验加深了对定时器概念的理解,有一定的收获。对于内部时钟的精度虽说主观上感觉不错,但因为没有相关规范的实验环境及相应的设备,无法做出定量的测试,只是通过这个简单的实验做个一般性测试罢了。欢迎朋友们共同交流。
附:TIM6工程文件
TIM6.rar
(5.24 MB, 下载次数: 12)
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处