670|5

250

帖子

2

资源

版主

STM32定时器(自动重装)经验分享 [复制链接]

本帖最后由 annysky2012 于 2021-2-5 14:19 编辑

有网友在论坛发帖求教,定时器明明初始化时设置的定时值是1us,而自己设置定时值(1S)以后,而实际为4s。

网友帖子(http://bbs.eeworld.com.cn/thread-1156521-1-1.html)在这里。

经过自己对STM32的中文手册的查看,以及使用自己开发板运行后,现象依旧如此,开始也是百思不得其解。通过查看资料得知,原来网友把自动重装值设置的有问题。

 

现定义几个参数值:

//arr:自动重装值。

// psc:时钟预分频数 

//定时器溢出间计算方法  :Tout=((arr+1)*(psc+1))/Ft us.

//Ft=定时器工作频率单位 :Mhz

 

根据定时器的溢出时间计算方法,自动重装值和分频系数在设置时必须减一。而自动重装值又不能为0(这是不允许的)。所以在配置的时候,我们可以这样:

  • TIM_TimeBaseStructure.TIM_Period = 2-1; //2 u second
  • TIM_TimeBaseStructure.TIM_Prescaler = 24-1;//PrescalerValue

所以,Tout=((arr+1)*(psc+1))/Ft=(TIM_Period +1)*(TIM_Prescaler+1)/24000000 = 2*24/24000000=2us。

 

也就是每进一次中断时2us,在设置计数次数时要注意。

以下为回环函数:

/* USER CODE BEGIN 4 */
//定时时间2us
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static uint32_t TimerCount = 0;
    if(htim->Instance==TIM7)
    {
        TimerCount++;
        if(TimerCount>250)//0.5mS
        {
            TimerCount=0;
            HAL_GPIO_TogglePin(LD1_GPIO_Port,LD1_Pin); 
        }
    }
}
/* USER CODE END 4 */

定时器初始化:

/**
  * @brief TIM7 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM7_Init(void)
{

  /* USER CODE BEGIN TIM7_Init 0 */

  /* USER CODE END TIM7_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM7_Init 1 */

  /* USER CODE END TIM7_Init 1 */
  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 108-1;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 2-1;
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM7_Init 2 */
    HAL_TIM_Base_Start_IT(&htim7); 
  
  /* USER CODE END TIM7_Init 2 */

}

底层函数:

/**
* @brief TIM_Base MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM7)
  {
  /* USER CODE BEGIN TIM7_MspInit 0 */

  /* USER CODE END TIM7_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM7_CLK_ENABLE();
    /* TIM7 interrupt Init */
    HAL_NVIC_SetPriority(TIM7_IRQn, 4, 0);
    HAL_NVIC_EnableIRQ(TIM7_IRQn);
  /* USER CODE BEGIN TIM7_MspInit 1 */

  /* USER CODE END TIM7_MspInit 1 */
  }

}

中断函数:

/**
  * @brief This function handles TIM7 global interrupt.
  */
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */

  /* USER CODE END TIM7_IRQn 1 */
}

运行结果:

IMG20210205135741.jpg

此帖出自stm32/stm8论坛

赞赏

1

查看全部赞赏

个人签名

没有什么不可以,我就是我,不一样的烟火! 


回复

1万

帖子

133

资源

管理员

赞@!!!!!感谢楼主分享~楼主太有心了

点评

持续努力~~~~~  详情 回复 发表于 2021-2-5 14:43
个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复

250

帖子

2

资源

版主

okhxyyo 发表于 2021-2-5 14:42 赞@!!!!!感谢楼主分享~楼主太有心了

持续努力~~~~~

点评

谢谢分享  详情 回复 发表于 2021-2-6 08:59
个人签名

没有什么不可以,我就是我,不一样的烟火! 


回复

1万

帖子

15

资源

版主

谢谢分享

个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复

17

帖子

0

资源

一粒金砂(中级)

谢谢分享,学习了


回复

3327

帖子

1

资源

五彩晶圆(初级)

谢谢分享

个人签名人已离开,无事别找,找也找不到。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表