STM32基本定时器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32基本定时器相关的知识,希望对你有一定的参考价值。
STM32基本定时器实现定时功能,但是却没有成功,所以想让大家帮我写一个列程用STM32基本定时器实现定时 关键我是想知道怎么配置,请不要用函数库,谢谢
我想问的是TIM6和TIM7基本定时器
工程中用函数库还是比较方便的,没见过谁做工程时,配置各种东西还直接去操作寄存器的。那不累死!
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/* ---------------------------------------------------------------
TIM2 Configuration: Output Compare Timing Mode:
TIM2CLK = 36 MHz, Prescaler = 36000, TIM2 counter clock = 1KHz
SET TTIM2 TIME 10mS
--------------------------------------------------------------- */
TIM_TimeBaseStructure.TIM_Period = 10; //计数值。 计时时间=计数值/TIM2 counter clock
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //与分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。
//TIM_CKD_DIV1 <->TDTS = Tck_tim TIM_CKD_DIV1=0x0000 //TIM_CKD_DIV1 <->TDTS = Tck_tim
//TIM_CKD_DIV2 <->TDTS = 2Tck_tim TIM_CKD_DIV2=0x0100 //TIM_CKD_DIV1 <->TDTS = Tck_tim
//TIM_CKD_DIV4 <->TDTS = 4Tck_tim TIM_CKD_DIV4=0x0200
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计算是从0计数到自动加载值,向下计算是从自动加载值计数到0
//中央对齐模式是从0计数到自动加载值(溢出),再从自动加载值计数到1(溢出)在从0开始计数。。。
//所以不管选用哪种模式,溢出的时间是不变的
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM2,ENABLE); //预装载使能
TIM_ITConfig(TIM2,TIM_FLAG_Update,ENABLE); //TIM更新中断源
TIM_Cmd(TIM2, ENABLE); //开TIM2定时器 参考技术A RCC->APB1ENR|=1<<1;//使能time3 时钟
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //使能触发中断
TIM3->ARR=arr; //自动重装值 10KHZ计数时钟 arr=1时为1ms
TIM3->PSC=psc; //分频器 psc=7200时得到10KHZ计数时钟
TIM3->CR1=0X01; //使能time3中断追问
怎么判断定时器溢出?我不是想要它产生中断,就是单纯的定时,谢谢
本回答被提问者采纳 参考技术B 学习中五stm32的定时器的几种用法
一、常用的定时功能
(1)基本、通用、高级定时器都有最基本的定时功能,定时功能用到的函数如下:
HAL_TIM_Base_Init 初始化定时,包括分频、 预装值等。
HAL_TIM_ConfigClockSource 选择定时器的时钟源
HAL_TIM_Base_Start_IT 开始定时器
HAL_TIM_PeriodElapsedCallback 超时后的回调函数
(2)Cubemx的配置,不管什么定时器,都是这个配置,注意开启中断,计算好最终的定时器时钟
(3)代码片段
1 void MX_TIM12_Init(void) 2 3 TIM_ClockConfigTypeDef sClockSourceConfig = 0; 4 5 htim12.Instance = TIM12; 6 htim12.Init.Prescaler = 199; 7 htim12.Init.CounterMode = TIM_COUNTERMODE_UP; 8 htim12.Init.Period = 999; 9 htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 10 htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 11 if (HAL_TIM_Base_Init(&htim12) != HAL_OK) 12 13 Error_Handler(); 14 15 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; 16 if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK) 17 18 Error_Handler(); 19 20 21 22 23 int main(void) 24 33 HAL_Init(); 34 35 /* USER CODE BEGIN Init */ 36 37 /* USER CODE END Init */ 38 39 /* Configure the system clock */ 40 SystemClock_Config(); 47 MX_GPIO_Init(); 48 MX_TIM12_Init(); 49 /* USER CODE BEGIN 2 */ 50 HAL_TIM_Base_Start_IT(&htim12); 51 /* USER CODE END 2 */ 52 53 /* Infinite loop */ 54 /* USER CODE BEGIN WHILE */ 55 while (1) 56 57 /* USER CODE END WHILE */ 58 HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_13); 59 HAL_Delay(1000); 60 /* USER CODE BEGIN 3 */ 61 62 /* USER CODE END 3 */ 63 64 65 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 66 67 if(htim->Instance == TIM12) 68 69 static uint16_t cnt = 0; 70 if(++cnt >= 1000) 71 72 cnt = 0; 73 HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_9); 74 75 76 77
二、使用通用定时器或者高级定时器来生产PWM波形
(1)使用通用定时器生成1路PWM
a.使用到的定时器API
HAL_TIM_PWM_Init
HAL_TIM_PWM_ConfigChannel
HAL_TIM_PWM_Start
__HAL_TIM_SET_COMPARE
b.Cubemx的配置
选择内部始终,Channel 1 为PWM生成。
根据配置信息,可知:
定义定时器预分频,定时器实际时钟频率为:200MHz/(GENERAL_TIMx_PRESCALER+1)
实际时钟频率为:20MHz
定义定时器周期,当定时器开始计数到GENERAL_TIMx_PERIOD值是更新定时器并生成对应事件和中断
定时器产生中断频率为:20MHz/(999+1)=20KHz,即50us定时周期
GENERAL_TIM_CH1_PULSE/GENERAL_TIM_PERIOD*100%
所以,以上配置生成的PWM的频率为20KHz,占空比为50%。
c. 代码实现
int main(void) HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); while (1) void MX_TIM2_Init(void) TIM_ClockConfigTypeDef sClockSourceConfig = 0; TIM_MasterConfigTypeDef sMasterConfig = 0; TIM_OC_InitTypeDef sConfigOC = 0; htim2.Instance = TIM2; htim2.Init.Prescaler = 9; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) Error_Handler(); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) Error_Handler(); if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) Error_Handler(); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) Error_Handler(); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) Error_Handler(); HAL_TIM_MspPostInit(&htim2);
以上是关于STM32基本定时器的主要内容,如果未能解决你的问题,请参考以下文章