当前位置:首页 > 技术 > Cortex-M3 > 正文内容

STM32CubeMX系列教程3:基本定时器

Watrt8年前 (2017-12-16)Cortex-M321640
这一章我们在前一章GPIO的工程修改。复制GPIO的工程,修改文件夹名。点击打开STM32cubeMX的工程文件重新配置。开启定时器TIM3,选择内部时钟。

定时器就相当于单片机的闹钟,下面我们以基本定时器为例简单介绍一下定时器。

从上图我们可以看到,基本定时器主要由下面三个寄存器组成。
  • 计数器寄存器 (TIMx_CNT)

  • 预分频器寄存器 (TIMx_PSC)

  • 自动重载寄存器 (TIMx_ARR)

计数器寄存器 (TIMx_CNT)存储的是当前的计数值。预分频器 (TIMx_PSC)为多少个SK_PSC脉冲计数一次,如图192 预分频器的值为1(预分频寄存器默认为0,为不分频),则为两个脉冲计数一次。即为二分频。如果要10000分频,则预分频器的值为1000-1。


自动重装寄存器 (TIMx_ARR)存储的是计数器的溢出值,例如图194中计数器递增计数到36计数器溢出,触发一次事件。而实际上为37个脉冲触发一次溢出事件(从0开始计数)。

要确定定时的时间我们必须先确定CK_PSC的频率,TIM3配置中选择内部时钟作为时钟源,查看数据手册或者查看代码可以知道TIM3是挂接到APB1时钟线上。

内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。若要定时时间为1s,则即可设置10800分频(预分频器寄存器 (TIMx_PSC)的值为10800-1),定时器的时钟CK_CNT的频率为10000Hz.则自动重载寄存器 (TIMx_ARR)设置为10000-1即定时为1s.TRGO为触发输出,可以触发内部ADC/DAC,这里我们没有用到这个功能,参数为默认设置。

定时器有如下三种计数模式
递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

在NVIC Settings框勾选开启定时器中断。优先级为默认。或者在NVIC配置中使能TIM3中断。


生成报告,以及生成代码,编译程序。

打开main.c文件。把main()函数里while循环上一章的代码删掉,while循环里面为空。在main.c文件后面USER CODE BEGIN 4 和 USER CODE END 4 中间添加中断回调函数。定时器中断处理函数中翻转一次LED1~LED4的电平。

/* USER CODE BEGIN 4 */
/**
  * @brief  Period elapsed callback in non blocking mode
  * @param  htim: TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == htim3.Instance)
    {
        /* Toggle LED */
        BSP_LED_Toggle(LED1);
        BSP_LED_Toggle(LED2);
        BSP_LED_Toggle(LED3);
        BSP_LED_Toggle(LED4);
    }
}
/* USER CODE END 4 */


在main.c文件中while(1)循环前面添加如果代码启动基本定时器中断模式计数。

/* USER CODE BEGIN 2 */
     
  /*##-1- Start the TIM Base generation in interrupt mode ####################*/
  HAL_TIM_Base_Start_IT(&htim3);
     
/* USER CODE END 2 */


重新编译程序,编译通过后下载到Open746-C开发板。按复位可以看到LED1~LED4间隔1s闪烁一次。
    现在我们再次分析一下程序。工程中配置TIM3定时器选择内部时钟不分频作为时钟源,挂载到APB1时钟总线上(108MHz),设置为递增计数模式,预分频器设置为10800-1,即10800分频,最后定时器的频率为10000HZ。一个脉冲的时间为1/10000s。则若要定时1s,则自动重载寄存器设置为10000-1(如要定时0.2s,则自动重装寄存器设置为0.2/(1/10000)-1.即2000-1)。
    在main()函数中调用HAL_TIM_Base_Start_IT(&htim3)开启定时器,定时器从0开始计数,当计数到10000-1,即9999时,产出上溢出事件,计数器又从0开始继续计数。由于我们开启了定时器中断,所以发生上溢出事件时会触发定时器中断。程序会转跳到中断服务函数中运行。我们在中断服务函数中翻转LED的电平。下次定时器再次溢出触发中断继续翻转LED的电平。所以我们会看到LED不断闪烁。


打赏 支付宝打赏 微信打赏
分享给朋友:

相关文章

STM32CubeMX系列教程9:内部集成电路(I2C)

STM32CubeMX系列教程9:内部集成电路(I2C)

1.I2C总线简介        I2C(Inter-Integrated Circuit ,内部集成电路)总线是一种由飞利浦Philip公司开发的串行总线。是两条串行的总线,它由一根数据线(SDA)和一根 时钟线(SDL)组成。I2C总线上可以接多个I2C设备,每个器件都有一个唯一的地址识别。同一时间只能有一个主设备,其他为从设备。通常MCU作为主设备控制,外设作为从设备。2.I2C硬件电路    &nb...

STM32CubeMX系列教程13:实时时钟(RTC)

STM32CubeMX系列教程13:实时时钟(RTC)

1.RTC简介        实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。        两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12...

STM32CubeMX系列教程17:SDMMC

STM32CubeMX系列教程17:SDMMC

一、SDMMC简介    MMC:MMC就是MultiMediaCard的缩写,即多媒体卡    SD:SD卡为Secure Digital Memory Card, 即安全数码卡    SDIO:SD Input Output 带有输入输出接口,SDIO是在SD标准上定义了一种外设接口SD种类    SD卡:<=2GB    SDHC卡(SD High Capacity...

STM32CubeMX系列教程21:SDRAM

STM32CubeMX系列教程21:SDRAM

在看下面教程之前,如果你之前没有使用过SDRAM,建议先看以下文档,以对SDRAM的原理和控制有一定的了解。高手进阶,终极内存技术指南——完整.doc一、SDRAM简介SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存取存储器·同步是指存储器工作需要同步时钟,内部命令的发送与数据传输都以它为基准·动态是指存储阵列需要不断的刷新来保证数据不丢失·随机存取是指存储器的内容可以以任意顺序访问,而不管前一次访问的是哪一个位置开发板使用的SDRAM...

STM32CubeMX系列教程27:ETH

STM32CubeMX系列教程27:ETH

在看本教程之前建议先看ST官方关于ETH的培训视频。本章不打算详细讲解LwIP协议栈,本章只是介绍如何通过STM32CubeMX软件生成初始化程序,并移植官方固件库里面的示例程序。http://www.stmcu.com.cn/videos.html        本章程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,ETH选择RMII模式,使能LWIP。ETH 参数不作修改为默认设置。LWIP...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。