硬汉嵌入式论坛

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

[HAL] 将HAL库从1.3升级到1.9以后,SysTick中断就不产生了

[复制链接]

12

主题

26

回帖

62

积分

初级会员

积分
62
发表于 2021-10-16 11:46:35 | 显示全部楼层 |阅读模式
调试好的一段程序,分为Bootloader(0x8000000)和应用两部分(0x8020000),原来都是用的1.3的HAL库,Bootloader升级时,内部FLASH写入会出错,换成了1.9版本,升级正常。
现在把应用部分也换成了1.9的库,发现SysTick中断不产生了。如果把这段代码烧在0x8000000地址上,就正常运行。不知道什么原因,请大家指教。
主要代码如下:
int main()
{
          MPU_Config();
        Cache_Enable();                 
        HAL_Init();       
        Stm32_Clock_Init(160,5,2,4);
       
        delay_init(400);
        uart_init(115200);
        LED_Init();
}
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
        HAL_StatusTypeDef ret=HAL_OK;
        RCC_ClkInitTypeDef RCC_ClkInitStruct;
        RCC_OscInitTypeDef RCC_OscInitStruct;

        MODIFY_REG(PWR->CR3,PWR_CR3_SCUEN, 0);
        __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

        while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}

        RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;
        RCC_OscInitStruct.HSEState=RCC_HSE_ON;
        RCC_OscInitStruct.HSIState=RCC_HSI_OFF;
        RCC_OscInitStruct.CSIState=RCC_CSI_OFF;
        RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
        RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;

        RCC_OscInitStruct.PLL.PLLN=plln;
        RCC_OscInitStruct.PLL.PLLM=pllm;
        RCC_OscInitStruct.PLL.PLLP=pllp;
        RCC_OscInitStruct.PLL.PLLQ=pllq;
               

        RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
        RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
        ret=HAL_RCC_OscConfig(&RCC_OscInitStruct);
        if(ret!=HAL_OK) while(1);

        RCC_ClkInitStruct.ClockType=(RCC_CLOCKTYPE_SYSCLK|\
                                RCC_CLOCKTYPE_HCLK |\
                                RCC_CLOCKTYPE_D1PCLK1 |\
                                RCC_CLOCKTYPE_PCLK1 |\
                                RCC_CLOCKTYPE_PCLK2 |\
                                RCC_CLOCKTYPE_D3PCLK1);

        RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;
        RCC_ClkInitStruct.SYSCLKDivider=RCC_SYSCLK_DIV1;
        RCC_ClkInitStruct.AHBCLKDivider=RCC_HCLK_DIV2;
        RCC_ClkInitStruct.APB1CLKDivider=RCC_APB1_DIV2;
        RCC_ClkInitStruct.APB2CLKDivider=RCC_APB2_DIV2;
        RCC_ClkInitStruct.APB3CLKDivider=RCC_APB3_DIV2;  
        RCC_ClkInitStruct.APB4CLKDivider=RCC_APB4_DIV4;
        ret=HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
        if(ret!=HAL_OK) while(1);

        __HAL_RCC_CSI_ENABLE() ;
       
        // SysTick config
        __HAL_RCC_SYSCFG_CLK_ENABLE() ;  
       
       
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK       
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);       
        HAL_InitTick(1);
        HAL_SetTickFreq(HAL_TICK_FREQ_100HZ); // 10ms
       
        HAL_EnableCompensationCell();
}



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-10-16 14:31:51 | 显示全部楼层
1、仅看你发的代码,这里有误,这两个局部变量一定要初始为0,防止未初始化的成员有骚操作。

RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;

2、然后主频400MHz的话,Flash延迟要是4, FLASH_LATENCY_2配置为2太快了。

3、下面的代码多余,因为函数HAL_RCC_ClockConfig会配置滴答定时器的。
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK      
        HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);      
        HAL_InitTick(1);
        HAL_SetTickFreq(HAL_TICK_FREQ_100HZ); // 10ms
================
简单修正后,可以调试查看下,BOOT+APP也是可以方便调试的,看看有中断使能标志没,看看是不是全局中断还关闭着呢
回复

使用道具 举报

12

主题

26

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2021-10-16 16:44:53 | 显示全部楼层
还是老大厉害,把FLASH_LATENCY_2改成 4 就好了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 18:57 , Processed in 0.203429 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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