赞
踩
目录
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
72MHz计72个数,那就是1MHz也是1us的时间;如果计数72000个数,那就是1KHz也就是1ms的时间。
时基单元:计数器、预分频器、自动重装寄存器。
STM32具有16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。同时支持级联,也就是一个定时器的输出,当作另一个定时器的输入。 这样最大的定时时间就是59.65s*65536*65536。
不同的外设功能不同,在操作不同的系统时,一定要查看是不是有这个外设。
预分频数写0->不分频,输出频率=输入频率=72MHz
预分频数写1->2分频,输出频率=输入频率/2=36MHz
预分频数写2->3分频,输出=输入/3
以此类推【实际的值和预分频数的值相差1】
16位的预分频器,最大值可以是65535,也就是65536分频。
预分频器就是对输入的基准频率提前进行一个分频的操作。
分频后进行计数器计数。-------->对预分频后的计数时钟进行计数。
基本计数器的原理就是,预分频器先进行预分频,然后经过计数器进行计数,计数器可以从0~65536计数,然后清零。自增道道目标值【目标值存储在自动重装寄存器】时,产生中断,完成定时功能,并然后清零计数器,开始下一轮。
主从触发模式(STM32的一大功能)
内部硬件在不受程序控制下实现自动运行。可以在某些情况下极大的减轻CPU负担。
当我们使用DAC的时候,可能会使用DAC输出一段波形,则需要每隔一段时间触发一次DAC让它输出下一个电压点。
一般思路:设置一个定时器,每隔一段时间在中断程序中调用代码出发一次DAC转换,然后DAC输出。但是这个方法会导致主程序频繁处于被中断状态,影响其他中断。
通过把更新时间通过主模式映射到TRGO上,然后TRGO就会直接去触发DAC,而不通过中断,整个程序不需要软件的参与,实现硬件的自动化。
通用定时器
不做描述
配置的流程图
1、RCC开启时钟(基本每个代码都是第一步)
开启时钟后,定时器的基准时钟和整个外设的工作时钟都会同时打开
2、选择时基单元的时钟源
如果是定时中断,要选择内部时钟源
3、配置时基单元
包括预分频器,自动重装器、计数模式等等,配置在一个结构体内。
4、配置输出中断控制
允许更新中断输出到NVIC
5、配置NVIC
在NVIC中打开定时器中断的通道,并配置一个优先级
6、允许控制
在整个模块配置好之后,使能一下计数器,保证计数器运行,当计数器更新世,触发中断。注意要写一个定时器的中断函数,让中断函数每隔一段时间运行一次。
内置Timer函数的一些常用函数
TIM_DeInit 恢复缺省配置
【时基单元】
TIM_TimeBaseInit (选择某个定时器,包含配置时基单元参数结构体)时基单元初始化
TIM_TimerBaseStructInit把结构体变量赋一个默认值
【运行控制】
TIM_Cmd (选择定时器,使能/失能)运行控制
【输出控制】
TIM_ITConfig 使能终端输出控制【终端控制】
【时钟源选择】
TIM_InteClockConfig,选择内部时钟
TIM_ITRxExternalClockConfig,选择ITRx其他定时器时钟
TIM_TIxExternalClockConfig 选择TIx捕获通道的时钟
TIM_ETRClockMode1Config 选择ETR通过外部时钟模式1输入的时钟
TIM_ETRClockMode2Config 选择ETR通过外部时钟模式2输入的时钟
TIM_ETRConfig 单独用来配置ETR引脚的预分频器、极性、滤波器这些参数
更人性化的函数
TIM_PrescalerConfig单独用来写预分频值
TIM_CounterModeConfig 用来写计数器的
TIM_ARRPreloadConfig 自动重装器预装功能配置
TIM_SetCounter 给计数器写入一个值
TIM_SetAutoreload 给自动重装器写入一个值
比如在main.c声明了某个变量,需要在使用但未声明的文件上extern+类型+变量,这样就可以是实现在其他文件对main文件的变量进行操作。
在模块化声明的.h文件中,每次都是这个道理,但是在声明函数前我们一般省略不写。
对于定时中断而言,中断服务函数就是为了别的文件服务的,所以中断函数可以放在使用它的地方
如果你的外部输入信号功率很小,内部的上拉电阻可能影响到这个输入信号。使用浮空输入可以防止外部输入的电平。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。