arm_cm4.c关于kinetis的修改

针对Kinetis微控制器的特性,需要在arm_cm4.c文件中调整中断设置。原始代码NVIC |= 1<<(irq%32) 改为 NVIC = 1<<(irq%32),以确保在处理连续中断时不会清除先前的配置。
/***********************************************************************/
/*
 * Initialize the NVIC to enable the specified IRQ.
 * 
 * NOTE: The function only initializes the NVIC to enable a single IRQ. 
 * Interrupts will also need to be enabled in the ARM core. This can be 
 * done using the EnableInterrupts macro.
 *
 * Parameters:
 * irq    irq number to be enabled (the irq number NOT the vector number)
 */

void enable_irq (int irq)
{
    int div;
    
    /* Make sure that the IRQ is an allowable number. Right now up to 91 is 
     * used.
     */
    if (irq > 91)
        printf("\nERR! Invalid IRQ value passed to enable irq function!\n");
    
    /* Determine which of the NVICISERs corresponds to the irq */
    div = irq/32;
    
    switch (div)
    {
    	case 0x0:
              NVICICPR0 = 1 << (irq%32);
              NVICISER0 = 1 << (irq%32);
              break;
    	case 0x1:
              NVICICPR1 = 1 << (irq%32);
Rebuild started: Project: fy_ecu_a009_10f_1key_3led *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\Keil\Leil5\ARM\ARMCC\Bin' Rebuild target 'N32G43x' assembling startup_n32g43x.s... compiling misc.c... compiling n32g43x_pwr.c... compiling system_n32g43x.c... compiling n32g43x_lpuart.c... compiling n32g43x_gpio.c... compiling n32g43x_adc.c... compiling n32g43x_flash.c... compiling n32g43x_usart.c... compiling n32g43x_rcc.c... compiling n32g43x_exti.c... compiling n32g43x_tim.c... compiling util.c... compiling n32g43x_wwdg.c... compiling main.c... compiling n32g43x_it.c... compiling sys_var.c... compiling bsp.c... compiling app.c... ..\src\app.c(1): error: #169: expected a declaration ..\src\app.c(1): error: #10: "#" not expected here ..\firmware\CMSIS\core\core_cm4.h(1688): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1705): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1724): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1743): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1762): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1777): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1794): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1816): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) ..\firmware\CMSIS\core\core_cm4.h(1838): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1913): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) ..\firmware\CMSIS\core\core_cm4.h(1928): error: #20: identifier "IRQn_Type" is undefined __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(2030): error: #20: identifier "SysTick_IRQn" is undefined NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ ..\src\app.c: 0 warnings, 14 errors compiling key.c... ".\Objects\fy_ecu_a009_10f_1key_3led.axf" - 14 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:05翻译
10-14
<think>我们正在处理一个Keil MDK编译错误日志。用户提供了编译输出,其中显示了多个错误。错误主要集中在`core_cm4.h`文件中,涉及到`IRQn_Type`未定义,以及`app.c`文件中的两个错误。 错误分析: 1. `app.c`的第1行有两个错误:`expected a declaration`和`"#" not expected here`。这表明在`app.c`的第一行可能有语法错误,可能是错误的预处理指令或者非法的字符。 2. 在`core_cm4.h`中,多个函数声明中使用了`IRQn_Type`,但编译器提示`IRQn_Type`未定义。这通常是因为在包含`core_cm4.h`之前没有定义该类型。`IRQn_Type`通常是由设备特定的头文件(例如`n32g43x.h`)定义的,该头文件应该包含在`core_cm4.h`之前。 3. 同样在`core_cm4.h`中,使用了`SysTick_IRQn`,这个枚举值也应该是设备头文件定义的,所以同样未定义。 可能的原因和解决方案: 1. 检查`app.c`的第一行,确保没有语法错误。比如,第一行是否是一个完整的声明?或者是否有拼写错误的预处理指令?常见的错误可能是`#include`写错,或者在不该出现`#`的地方出现了。 2. 检查头文件包含顺序。根据ARM CMSIS标准,通常需要先包含设备相关的头文件(如`n32g43x.h`),然后才包含`core_cm4.h`。因为`core_cm4.h`会依赖设备头文件中的中断号定义(如`IRQn_Type`)。在项目中的某个源文件(很可能是`app.c`)中,可能没有正确包含设备头文件,或者包含顺序不对。 3. 检查项目中是否正确定义了芯片型号,以及设备头文件是否正确。 具体到错误日志,我们看到`app.c`的第一行就有错误,所以首先要解决这个错误。然后解决`IRQn_Type`未定义的问题。 步骤: 1. 打开`app.c`,查看第一行是什么内容。根据错误信息,第一行可能是一个非法的预处理指令(比如缺少指令名)或者有语法错误。 例如,第一行如果只有`#`而没有指令,或者有中文字符等,都会导致这个错误。 2. 确保在包含`core_cm4.h`之前已经包含了设备特定的头文件(例如`#include "n32g43x.h"`)。在Keil中,通常会在`system_n32g43x.c`中包含设备头文件,但其他文件也应该包含设备头文件。 针对`core_cm4.h`中的错误,我们可以查看`core_cm4.h`的开头部分,通常会有如下条件编译指令: #ifdef __cplusplus extern "C" { #endif ... #if !defined (__Vendor_SysTickConfig) || (__Vendor_SysTickConfig == 0) ... #endif 但是,如果没有定义`IRQn_Type`,说明设备头文件没有被正确包含。 因此,建议在`app.c`中,确保第一行是合法的,并且在文件开头包含设备头文件。 例如,`app.c`的开头应该是: #include "n32g43x.h" // 或者其他必要的头文件 注意:设备头文件`n32g43x.h`应该定义了`IRQn_Type`和`SysTick_IRQn`等。 如果问题仍然存在,检查设备头文件是否包含在项目路径中,以及编译器的包含路径设置是否正确。 由于用户要求翻译错误日志,我们将错误信息翻译成中文: 翻译: 重新构建开始:项目: fy_ecu_a009_10f_1key_3led *** 使用编译器 'V5.06 update 7 (build 960)',文件夹: 'D:\Keil\Leil5\ARM\ARMCC\Bin' 重新构建目标 'N32G43x' 正在汇编 startup_n32g43x.s... 正在编译 misc.c... 正在编译 n32g43x_pwr.c... 正在编译 system_n32g43x.c... 正在编译 n32g43x_lpuart.c... 正在编译 n32g43x_gpio.c... 正在编译 n32g43x_adc.c... 正在编译 n32g43x_flash.c... 正在编译 n32g43x_usart.c... 正在编译 n32g43x_rcc.c... 正在编译 n32g43x_exti.c... 正在编译 n32g43x_tim.c... 正在编译 util.c... 正在编译 n32g43x_wwdg.c... 正在编译 main.c... 正在编译 n32g43x_it.c... 正在编译 sys_var.c... 正在编译 bsp.c... 正在编译 app.c... ..\src\app.c(1): 错误: #169: 期望一个声明 ..\src\app.c(1): 错误: #10: 此处不应出现"#" ..\firmware\CMSIS\core\core_cm4.h(1688): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1705): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1724): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1743): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1762): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1777): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1794): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1816): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) ..\firmware\CMSIS\core\core_cm4.h(1838): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(1913): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) ..\firmware\CMSIS\core\core_cm4.h(1928): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) ..\firmware\CMSIS\core\core_cm4.h(2030): 错误: #20: 未定义标识符 "SysTick_IRQn" NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ ..\src\app.c: 0 警告, 14 错误 正在编译 key.c... ".\Objects\fy_ecu_a009_10f_1key_3led.axf" - 14 错误(s), 0 警告(s). 目标未创建。 构建时间: 00:00:05 解决方案步骤: 1. 打开`app.c`,检查第一行。如果是错误的(例如只有`#`或者错误的指令),修正它。确保第一行是合法的C代码(比如`#include`指令或者注释)。 2. 在`app.c`文件的开头,确保包含了`n32g43x.h`头文件。如果没有,添加:`#include "n32g43x.h"`。 3. 检查整个项目中,确保在包含`core_cm4.h`之前,`n32g43x.h`已经被包含。因为`core_cm4.h`依赖于`n32g43x.h`中定义的类型和中断号。 4. 如果`app.c`中已经包含了`n32g43x.h`,检查该头文件是否正确定义了`IRQn_Type`(通常是一个枚举类型,包含芯片的所有中断号)。 5. 检查Keil项目设置中的包含路径(Include Paths),确保`n32g43x.h`所在目录被添加到包含路径中。 由于用户没有提供`app.c`的内容,我们只能根据常见情况给出建议。 另外,注意错误日志中`system_n32g43x.c`被成功编译,所以很可能其他文件包含了设备头文件,但`app.c`没有包含。因此,在`app.c`中添加设备头文件包含。 如果问题仍然存在,请提供`app.c`的前几行代码以便进一步分析。 相关问题: §§相关问题§§: 1. 在Keil MDK中如何设置头文件包含路径? 2. 如何解决Keil编译中出现的"expected a declaration"错误? 3. 在CMSIS中,为什么需要在包含core_cm4.h之前包含设备头文件? 4. 如何在Keil项目中正确配置芯片型号? </think>### 编译错误分析与解决方案 #### 错误分析 1. **`app.c` 文件问题**: - `error: #169: expected a declaration`:文件首行存在无效声明(如多余的 `#` 或语法错误)。 - `error: #10: "#" not expected here`:首行出现非法 `#` 符号(如不完整的预处理指令)。 2. **`core_cm4.h` 文件问题**: - 所有 `error: #20: identifier "IRQn_Type" is undefined`:编译器未识别 `IRQn_Type` 类型。 - 根本原因:未正确包含设备头文件(如 `n32g43x.h`),该文件定义了芯片相关的中断类型(`IRQn_Type`)和常量(`SysTick_IRQn`)。 #### 解决方案 ##### 步骤 1:修复 `app.c` 检查并修正 `app.c` 的第 1 行,确保: - 无多余的 `#` 符号。 - 首行是完整的声明(如 `#include` 或注释)。 **示例修正**: ```c #include "n32g43x.h" // 确保包含设备头文件 // 其他代码... ``` ##### 步骤 2:包含设备头文件 在 `app.c` 和 `n32g43x_it.c` 中显式包含设备头文件: ```c #include "n32g43x.h" // 定义 IRQn_Type 和 SysTick_IRQn ``` ##### 步骤 3:检查头文件依赖 确保 `core_cm4.h` **之前**已包含设备头文件: ```c // 正确顺序示例: #include "n32g43x.h" // 先包含设备头文件 #include "core_cm4.h" // 再包含 CMSIS 核心文件 ``` ##### 步骤 4:验证 Keil 项目配置 1. **添加头文件路径**: - 打开 Keil → `Options for Target` → `C/C++` → `Include Paths`。 - 添加设备头文件路径(如 `..\firmware\N32G43x\Include`)。 2. **确认芯片型号**: - `Options for Target` → `Device` → 选择正确的芯片型号(如 `N32G43x`)。 --- #### 完整编译日志翻译: ``` 重新构建开始:项目: fy_ecu_a009_10f_1key_3led *** 使用编译器 'V5.06 update 7 (build 960)',文件夹: 'D:\Keil\Leil5\ARM\ARMCC\Bin' 重新构建目标 'N32G43x' 汇编 startup_n32g43x.s... 编译 misc.c... 编译 n32g43x_pwr.c... 编译 system_n32g43x.c... 编译 n32g43x_lpuart.c... 编译 n32g43x_gpio.c... 编译 n32g43x_adc.c... 编译 n32g43x_flash.c... 编译 n32g43x_usart.c... 编译 n32g43x_rcc.c... 编译 n32g43x_exti.c... 编译 n32g43x_tim.c... 编译 util.c... 编译 n32g43x_wwdg.c... 编译 main.c... 编译 n32g43x_it.c... 编译 sys_var.c... 编译 bsp.c... 编译 app.c... ..\src\app.c(1): 错误: #169: 缺少声明 ..\src\app.c(1): 错误: #10: 此处不应出现 "#" ..\firmware\CMSIS\core\core_cm4.h(1688): 错误: #20: 未定义标识符 "IRQn_Type" __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) ...(类似错误重复)... ..\firmware\CMSIS\core\core_cm4.h(2030): 错误: #20: 未定义标识符 "SysTick_IRQn" NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); ..\src\app.c: 0 警告, 14 错误 编译 key.c... ".\Objects\fy_ecu_a009_10f_1key_3led.axf" - 14 错误(s), 0 警告(s)。 目标未创建。 构建时间: 00:00:05 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值