WSWSWSWS 发表于 2024-4-7 14:45:42

STM32F429IGT6的TIM6作为systick问题

各位大佬们,你们好,我在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;
}


eric2013 发表于 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 Clock100MHz)
      D2 APB1 Prescaler         = 2 (APB1 Clock100MHz)
      D2 APB2 Prescaler         = 2 (APB2 Clock100MHz)
      D3 APB4 Prescaler         = 2 (APB4 Clock100MHz)

      因为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();
        }
}
页: [1]
查看完整版本: STM32F429IGT6的TIM6作为systick问题