STM32定时器定时时长计算公式
T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK
其中TIMxCLK为时钟频率,TIM_Period(arr)自动重装载值,TIM_Prescaler(PSC)为时钟预分频系数。
如:
TIM_Period=7200-1
TIM_Prescaler=100-1
对于stm32f103c8t6时钟频率为72MHZ
T=10000us=10ms=0.01s
【若开启了定时器中断 0.01s进入回调函数一次】
cubeMX创建工程:
生成工程即可
在main.c中添加
MX_GPIO_Init();
MX_TIM2_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);//启动定时器中断
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
回调函数
在main.c文件中添加定时器回调函数
static uint16_t index_10ms = 0;
uint16_t index_led = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim2.Instance)
{
index_10ms++;
if(index_10ms%100==0)
index_led=1;
if(index_10ms%100!=0)
index_led=2;
}
}
当 index_led=1时满足1s定时
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if( index_led==1)
{ HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
总结:回调函数时间很短,不能在回调函数中写延时