公司网站制作应该注意些什么,wordpress文章链接设置,网站如何转做app,在网站和网页的区别一、初识定时器TIM 定时器就是计数器#xff0c;定时器的作用就是设置一个时间#xff0c;然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能#xff0c;还可以实现捕获脉冲宽度#xff0c;计算PWM占空比#xff0c;输出PWM波形定时器的作用就是设置一个时间然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能还可以实现捕获脉冲宽度计算PWM占空比输出PWM波形编码器计数等。
STM32共11个定时器2个高级控制定时器TIM1和TIM84个通用定时器TIM2~TIM5两个基本定时器TIM6和TIM7两个看门狗定时器和一个系统滴答定时器Systick. 高级定时器TIM1和TIM8的时钟由APB1产生其它六个通用定时器的时钟由APB2产生。它们的最大频率都可以配置成系统时钟的频率。
定时器种类位数计数模式捕获/比较通道应用场景通用定时器 TIM2~TIM516向上向下双向4定时计数PWM,输入捕获输出比较高级定时器 TIM1和TIM816向上向下双向4在通用的基础上多了刹车信号输入死区时间互补输出等工业电机功能基本定时器 TIM6和TIM716向上向下双向4定时计数 二、基本定时器
(1)计数功能原理 在上一期文章提到时钟树提供稳定频率的方波信号APB1上的时钟线连接了基本定时器和通用寄存器APB2上的时钟线连接了高级定时器。 对于实现计数功能只需要一个寄存器就可以满足寄存器只需要读到时钟信号的上升沿数值就加1。假如72MHZ的时钟信号作为输入当该寄存器数值累加到7.2*10^7就代表时间过去了1秒。但是寄存器通常只有16bit最多能计数 65536个数。因此在该寄存器前面还要加一个类似的计数器当计数满足条件时才往后续电路发送高电平预分频器就可以充当这个角色其本质也是一个16bit的计数器。当只需要将其设置为n-1就可以进行n分频从0开始计数一直计数到n-1才会向后续电路发送高电平。预分频器最多可以进行65536分频。因此一个由预分频器和一个计数器组合成的定时器最多可以计数65536^2次。m个定时器串联就可以计数65536^2*m次。 (2) 自动重装载寄存器 自动重装载寄存器它的作用就是实时监控计数器的值是否与自己的值相同。当计数器的值与自己的值相同时便将计数器重置为0并触发定时器更新中断。 (3)影子寄存器 所谓的影子寄存器就是某个寄存器的拷贝。在上图中工作在一线的预分频器和自动重装载寄存器其实都是自己的影子寄存器。当定时器正在工作时如果重新设置预分频器值或者重新这是自动重装载寄存器的值那么只有当计数器和自动重装载寄存器的值一样时才会将新值更新到自身影子寄存器中。也就是给定时器设置的新参数值要等下个计数周期才生效。 自动重装载寄存器可以根据程序员选择是否开启影子寄存器。如果不开启那么将自动重装载寄存器数值调小时可能会错过计数器的值使计数器一路上到65536才会归0。 三、定时程序
(1)准备工作
为了发送数据进行模拟,需打开USART2用于设置模式为“异步”在NVIC Settings中打开中断打上√在DMA Settings,打开DMA传输功能添加传输通道。 为提高计数精度将外部时钟源设置为晶振在时钟设置界面中的HCLK的频率设置为72MHZ自动调整其它器件的时钟频率。 对于我使用的STM32F108T6芯片只有4个定时器即1个高级3个通用寄存器。虽然没有基本定时器但是这些定时器都包含了基本定时器功能。只需要对定时器的时钟源选择 Internal Clock 内部时钟源就算打开了定时器。因为本次模拟的时钟频率是72MHZ设置预分频器7200自动重装载寄存器为10000那么完成一个周期的计数就是1s也就是1s触发一次定时器更新中断。同第一步类似TIM也可以开启中断和DMA通道。保存并生成代码。 (2)实现定时任务和获取计数器数值
以下示例代码为开启TIM中断和USART2中断实现,以及开启了自动重装载寄存器的影子寄存器
1.开启定时器 HAL_TIM_Base_Start(htim); //用阻塞的方式开始定时器 HAL_TIM_Base_Start_IT(htim); //用中断(非阻塞)的方式开始定时器 HAL_TIM_Base_Start_DMA(htim); //用DMA(非阻塞)的方式开始定时器 2.中断回调函数 在路径 ~/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c中 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 当计数器数值和自动重装载寄存器值一样时调用 3.读写定时器中寄存器的宏定义操作 __HAL_TIM_GET_ANTORELOAD //获取自动重装载寄存器数值 __HAL_TIM_SET_ANTORELOAD //设置自动重装载寄存器数值 __HAL_TIM_GET_COUNTER //获取计数器数值 __HAL_TIM_SET_COUNTER //设置计数器数值 __HAL_TIM_SET_PRESCALER //设置预分频器数值 4.示例代码
/* USER CODE BEGIN Includes */
#include string.h
#include stdio.h
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim4;UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM4_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char message2[]☺☹;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim htim4){HAL_UART_Transmit_IT(huart2, (uint8_t*)message2,strlen(message2));}
}
/* USER CODE END 0 *//*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();//TIM4的初始化MX_TIM4_Init();/* USER CODE BEGIN 2 *///用中断的方式开启定时器HAL_TIM_Base_Start_IT(htim4);int counter 0;char message[20];/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){counter __HAL_TIM_GET_COUNTER(htim4);sprintf(message,counter:%d,counter);//每隔100ms发送 counter计数器数值//HAL_UART_Transmit_IT(huart2, (uint8_t*)message,strlen(message));//延迟100msHAL_Delay(100-1);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}