
stm32f1xx_hal_i2c.c 中 __enable_irq 和 disable_irq 函数出现了报错:
error: call to undeclared function '__enable_irq'; ISO C99 and later do not support implicit of function declarations
在 core_cm3.h -> cmsis_compiler.h -> cmsis_armclang.h (ARM Compiler 6) 或 cmsis_armcc.h (AC5) 中对这两个方法没有定义,只有一段注释:

__enable_irq 和 disable_irq 控制的是PRIMASK寄存器值。
是一种 intrinsic 函数,编译器会自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于Keil的 arm_compat.h 中。
/*
* Arm Compiler 6 (armclang)
*/
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#include "cmsis_armclang.h"
在其中,这个头文件 arm_compat.h 本该是不存在的:
#include <arm_compat.h>
在.\Drivers\CMSIS\Include 中多了一个arm_compat.h文件,这会导致覆盖编译器的头文件,所以会出现一系列错误。
出现这种错误的原因,大概率是因为vscode的代码提示默认会报错 cannot open source file "arm_compat.h" , AI编码尝试去处理这个错误,会自作聪明地加上一个arm_compat.h。
如果要修复这个报错,将Keil的 ARM CMSIS-DSP 库的头文件加入.vscode/c_cpp_properties.json:
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/Core/Inc",
"${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc",
"${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy",
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include",
"${workspaceFolder}/Drivers/CMSIS/Include",
"${workspaceFolder}/Drivers/ThridParty",
"D:\\software\\Keli\\Core\\ARM\\ARMCLANG\\include"
],
HAL_RCC_OscConfig 跳到 Error_Handler
SYSTICK 的时钟固定为HCLK 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。
CTRL: SysTick控制和状态寄存器 LOAD: SysTick重装载值寄存器 VAL: SysTick当前值寄存器 CALIB:SysTick校准值寄存器
SysTick->CTRL COUNTFLAG CLKSOURCE TICKINT ENABLE
SysTick-> LOAD RELOAD
SysTick-> VAL CURRENT