匿名
未登录
登录
丢石头百科
搜索
查看“STM32CubeMX系列教程3:基本定时器”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
STM32CubeMX系列教程3:基本定时器
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
这一章我们在前一章GPIO的工程修改。复制GPIO的工程,修改文件夹名。点击[[File:STM32CubeMX系列教程3:基本定时器-1.png]]打开STM32cubeMX的工程文件重新配置。开启定时器TIM3,选择内部时钟。 定时器就相当于单片机的闹钟,下面我们以基本定时器为例简单介绍一下定时器。 [[File:STM32CubeMX系列教程3:基本定时器-2.png]] 从上图我们可以看到,基本定时器主要由下面三个寄存器组成。 * 计数器寄存器 (TIMx_CNT) * 预分频器寄存器 (TIMx_PSC) * 自动重载寄存器 (TIMx_ARR) 计数器寄存器 (TIMx_CNT)存储的是当前的计数值。预分频器 (TIMx_PSC)为多少个SK_PSC脉冲计数一次,如图192 预分频器的值为1(预分频寄存器默认为0,为不分频),则为两个脉冲计数一次。即为二分频。如果要10000分频,则预分频器的值为1000-1。 [[File:STM32CubeMX系列教程3:基本定时器-3.png]] 自动重装寄存器 (TIMx_ARR)存储的是计数器的溢出值,例如图194中计数器递增计数到36计数器溢出,触发一次事件。而实际上为37个脉冲触发一次溢出事件(从0开始计数)。 [[File:STM32CubeMX系列教程3:基本定时器-4.png]] 要确定定时的时间我们必须先确定CK_PSC的频率,TIM3配置中选择内部时钟作为时钟源,查看数据手册或者查看代码可以知道TIM3是挂接到APB1时钟线上。 [[File:STM32CubeMX系列教程3:基本定时器-5.png]] [[File:STM32CubeMX系列教程3:基本定时器-6.png]] 内部时钟设置为不分频(CKD),则CK_PSC的时钟频率等于APB1的时钟频率108MHz,即108000 000Hz。若要定时时间为1s,则即可设置10800分频(预分频器寄存器 (TIMx_PSC)的值为10800-1),定时器的时钟CK_CNT的频率为10000Hz.则自动重载寄存器 (TIMx_ARR)设置为10000-1即定时为1s.TRGO为触发输出,可以触发内部ADC/DAC,这里我们没有用到这个功能,参数为默认设置。 [[File:STM32CubeMX系列教程3:基本定时器-7.png]] 定时器有如下三种计数模式 * 递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。 * 递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。 * 中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。 在NVIC Settings框勾选开启定时器中断。优先级为默认。或者在NVIC配置中使能TIM3中断。 [[File:STM32CubeMX系列教程3:基本定时器-7.png]] [[File:STM32CubeMX系列教程3:基本定时器-8.png]] 生成报告,以及生成代码,编译程序。 打开main.c文件。把main()函数里while循环上一章的代码删掉,while循环里面为空。在main.c文件后面USER CODE BEGIN 4 和 USER CODE END 4 中间添加中断回调函数。定时器中断处理函数中翻转一次LED1~LED4的电平。 <syntaxhighlight lang="c"> /* 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 */ </syntaxhighlight> 在main.c文件中while(1)循环前面添加如果代码启动基本定时器中断模式计数。 <syntaxhighlight lang="c"> /* USER CODE BEGIN 2 */ /*##-1- Start the TIM Base generation in interrupt mode ####################*/ HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END 2 */ </syntaxhighlight> 重新编译程序,编译通过后下载到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系列教程3:基本定时器
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志