hujjj 发表于 2019-6-26 11:43:01

定时器如何使用?

    准备使用激光测距模块,需要进行微秒计数,我用定时器4,设定时间为1um,每次中断时对变量进行加1操作,测试时是在主循环中先将变量清零,然后启动定时器4,稍后停止定时器4,再显示变量值。代码是用CubeMX生成的,程序编译通过,也可以运行,但变量值不会变化,可能是定时器4没有正常启动,也许是配置不正确造成的。相关的代码如下,麻烦大家帮我看看是什么问题,在此先谢谢各位!

1、tim.c文件
#include "tim.h"

extern uint16_t distance;

TIM_HandleTypeDef htim4;


void MX_TIM4_Init(void)//static
{

    TIM_SlaveConfigTypeDef sSlaveConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};


    htim4.Instance = TIM4;
    htim4.Init.Prescaler = (72-1);                                             //预分频值
    htim4.Init.CounterMode = TIM_COUNTERMODE_UP;       //向上计数
    htim4.Init.Period = (1000-1);                                             //重载值
    htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;   //不分频
    htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
    {
      Error_Handler();
    }
    sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
    sSlaveConfig.InputTrigger = TIM_TS_ITR0;
    if (HAL_TIM_SlaveConfigSynchronization(&htim4, &sSlaveConfig) != HAL_OK)
    {
      Error_Handler();
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;               //主输出触发器
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;//
    if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
    {
      Error_Handler();
    }

    //开启定时器时钟
    _HAL_TIM_Base_MspInit(&htim4);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

    if(tim_baseHandle->Instance==TIM4)
    {
      /* TIM4 clock enable */
      __HAL_RCC_TIM4_CLK_ENABLE();

      /* TIM4 interrupt Init */
      HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(TIM4_IRQn);
      /* USER CODE BEGIN TIM4_MspInit 1 */

      /* USER CODE END TIM4_MspInit 1 */
    }
}

2、tim.h文件
#ifndef __tim_H
#define __tim_H
#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

extern TIM_HandleTypeDef htim4;

void MX_TIM4_Init(void);


#ifdef __cplusplus
}
#endif
#endif /*__ tim_H */

3、stm321xx_it.c文件(部分)
void TIM4_IRQHandler(void)
{
    /* USER CODE BEGIN TIM4_IRQn 0 */

    /* USER CODE END TIM4_IRQn 0 */
    HAL_TIM_IRQHandler(&htim4);
    /* USER CODE BEGIN TIM4_IRQn 1 */
    distance++;
    /* USER CODE END TIM4_IRQn 1 */
}


4、main.c文件中对定时器的操作
int main(void)
{
    uint8_t i;

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();
    MX_RTC_Init();
    MX_TIM4_Init();
    MX_ADC1_Init();
    MX_I2C1_Init();
    MX_SPI1_Init();
    MX_USART1_UART_Init();

    LCD_init();
    display_main();
    led_green_off();

    while (1)
    {
      distance = 0;                              //清零计数值
      HAL_TIM_Base_Start(&htim4);//开启定时器

      if(keyf>0){
            LCD_write_value(10,1,3,0,1,keyf);
            LCD_write_value(10,2,3,0,1,keys);
      }
      if(ms>999){
            ms = 0;
            led_green_flashing();
            led_red_flashing();

      }

      HAL_TIM_Base_Stop(&htim4);    //关闭定时器
      LCD_write_value(10,3,5,0,1,distance);//显示定时器中断次数(计时)

    }
}



五哥1 发表于 2019-6-27 01:13:22

建议楼主从网上找个US的延时函数

hujjj 发表于 2019-6-27 09:21:00

五哥1 发表于 2019-6-27 01:13
建议楼主从网上找个US的延时函数

找了多个都是标准库函数的,而我这个用CudeMX生成的是用HAL库,我尚未入门,所以就不知所措了。

五哥1 发表于 2019-6-27 14:09:48

hujjj 发表于 2019-6-27 09:21
找了多个都是标准库函数的,而我这个用CudeMX生成的是用HAL库,我尚未入门,所以就不知所措了。 ...

CUBEMX生成的是HAL_DELAY();是MS的,用标准库也可以呀,不会改的话,上网看看正点原子的HAL库程序,直接复制过来用就好了。

hujjj 发表于 2019-6-27 17:43:38

谢谢!我再看看视频资料,加深点印象。

bl2019 发表于 2019-6-28 16:53:35

http://www.pianshen.com/article/8126419614/

hujjj 发表于 2019-7-9 14:24:40

bl2019 发表于 2019-6-28 16:53
http://www.pianshen.com/article/8126419614/

谢谢您提供参考资料的链接,现在已经基本上解决了。

hujjj 发表于 2019-7-9 14:25:06

本帖最后由 hujjj 于 2019-7-9 14:26 编辑

网速慢,重复提交了。
页: [1]
查看完整版本: 定时器如何使用?