硬汉嵌入式论坛

 找回密码
 立即注册
查看: 234|回复: 1
收起左侧

STM32F429IGT6的TIM6作为systick问题

[复制链接]

5

主题

10

回帖

25

积分

新手上路

积分
25
发表于 2024-4-7 14:45:42 | 显示全部楼层 |阅读模式
各位大佬们,你们好,我在CubeMx和在CSDN中复制将TIM6作为systick时钟,但是在系统就一直卡住了,不会往下运行其他的,如图所示,请各位大佬帮我看看这个是什么问题。

代码如下:

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  RCC_ClkInitTypeDef    clkconfig;
  uint32_t              uwTimclock = 0;
  uint32_t              uwPrescalerValue = 0;
  uint32_t              pFLatency;
  
  /*Configure the TIM6 IRQ priority */
  HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0);
  
  /* Enable the TIM6 global Interrupt */
  HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
  
  /* Enable TIM6 clock */
  __HAL_RCC_TIM6_CLK_ENABLE();
  
  /* Get clock configuration */
  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  
  /* Compute TIM6 clock */
  uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
   
  /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
  
  /* Initialize TIM6 */
  htim6.Instance = TIM6;
  
  /* Initialize TIMx peripheral as follow:
  + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
  + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  + ClockDivision = 0
  + Counter direction = Up
  */
  htim6.Init.Period = (1000000 / 1000) - 1;
  htim6.Init.Prescaler = uwPrescalerValue;
  htim6.Init.ClockDivision = 0;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
  {
    /* Start the TIM time Base generation in interrupt mode */
    return HAL_TIM_Base_Start_IT(&htim6);                               //仿真时程序卡在了这一句,无法出来。
  }
  
  /* Return function status */
  return HAL_ERROR;
}


1.PNG
2.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2024-4-8 07:51:08 | 显示全部楼层
分享个我的,这个是i正常的。

TIM_HandleTypeDef   TimHandle = {0};
       
/*
*********************************************************************************************************
*        函 数 名: System_Init
*        功能说明: 为HAL库配置1ms的时间基准,此函数会被HAL_Init和HAL_RCC_ClockConfig调用
*        形    参:TickPriority  定时器优先级
*        返 回 值: 无
*********************************************************************************************************
*/
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{

        RCC_ClkInitTypeDef    clkconfig;
        uint32_t              uwTimclock, uwAPB1Prescaler = 0U;
        uint32_t              uwPrescalerValue = 0U;
        uint32_t              pFLatency;

       
        /* 复位定时器7 */
        TimHandle.Instance = TIM7;
        if(HAL_TIM_Base_DeInit(&TimHandle) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }
       
        /* 设置TIM7的中断优先级并使能 */
        HAL_NVIC_SetPriority(TIM7_IRQn, TickPriority ,0U);
        HAL_NVIC_EnableIRQ(TIM7_IRQn);

        /* 使能TIM7时钟 */
        __HAL_RCC_TIM7_CLK_ENABLE();

        /*-----------------------------------------------------------------------
        System Clock source       = PLL (HSE)
        SYSCLK(Hz)                = 400000000 (CPU Clock)
        HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)
        AHB Prescaler             = 2
        D1 APB3 Prescaler         = 2 (APB3 Clock  100MHz)
        D2 APB1 Prescaler         = 2 (APB1 Clock  100MHz)
        D2 APB2 Prescaler         = 2 (APB2 Clock  100MHz)
        D3 APB4 Prescaler         = 2 (APB4 Clock  100MHz)

        因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
        因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;
        APB4上面的TIMxCLK没有分频,所以就是100MHz;

        APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
        APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17

        APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
        ----------------------------------------------------------------------- */
        /* 获取时钟配置 */
        HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

        /* 获取APB1时钟 */
        uwAPB1Prescaler = clkconfig.APB1CLKDivider;

        /* 获得TIM7时钟 */
        if (uwAPB1Prescaler == RCC_HCLK_DIV1)
        {
                uwTimclock = HAL_RCC_GetPCLK1Freq();
        }
        else
        {
                uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
        }

        /* TIM7分频到1MHz */
        uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);

        /* TIM7CLK = uwTimclock / (Period + 1) / (Prescaler + 1) = 1KHz */
        TimHandle.Init.Period = (1000000U / 1000U) - 1U;
        TimHandle.Init.Prescaler = uwPrescalerValue;
        TimHandle.Init.ClockDivision = 0;
        TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
        if(HAL_TIM_Base_Init(&TimHandle) == HAL_OK)
        {
                /* 启动TIM7 */
                return HAL_TIM_Base_Start_IT(&TimHandle);
        }

        /* 返回错误 */
        return HAL_ERROR;
}

/*
*********************************************************************************************************
*        函 数 名: HAL_SuspendTick
*        功能说明: 关闭TIM7
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_SuspendTick(void)
{
        __HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE);
}

/*
*********************************************************************************************************
*        函 数 名: HAL_ResumeTick
*        功能说明: 使能TIM7
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_ResumeTick(void)
{
        __HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
}

/*
*********************************************************************************************************
*        函 数 名: TIM7_IRQHandler
*        功能说明: TIM7定时器中断服务程序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void TIM7_IRQHandler(void)
{
        if((TIM7->SR & TIM_FLAG_UPDATE) != RESET)
        {
                 TIM7->SR = ~ TIM_FLAG_UPDATE;
                 HAL_IncTick();
        }
}
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 02:49 , Processed in 0.174458 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表