You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAM L10设备不使用Harmony v3时I2C中断处理函数映射异常问题

问题解决方法

原理说明

Cortex-M架构MCU的中断触发后,硬件会自动从**向量表(也就是你提到的exception_table)**中读取对应中断号的处理函数入口地址,再跳转到该地址执行。这个向量表默认存储在Flash的起始地址区域,由MCU启动文件预先定义,未被重定义的中断入口默认指向空的死循环函数,这就是你中断触发后没有执行对应处理逻辑的原因。

两种实现中断映射的方案

方案1:直接重写默认中断入口(推荐,操作最简单)

SAM L10的SERCOM0外设中断默认入口函数名为SERCOM0_Handler,你只需要在任意源码文件(比如init.c或main.c)中添加如下代码,将默认入口和PLIB提供的处理函数关联即可:

void SERCOM0_Handler(void)
{
    // 调用PLIB实现的I2C中断处理逻辑
    SERCOM0_I2C_InterruptHandler();
}

编译时你自定义的SERCOM0_Handler会覆盖启动文件里的弱定义默认函数,自动更新到向量表中。

方案2:直接修改向量表

如果要手动操作exception_table,找到你工程使用的启动文件(通常为汇编格式的startup_saml10xxx.s,或者C语言实现的向量表定义文件),找到SERCOM0中断对应的向量表条目,将条目值改为你的处理函数名SERCOM0_I2C_InterruptHandler即可,编译后向量表对应位置就会存储你要的函数入口地址。

额外检查点

  1. 确认SERCOM0_I2C_Initialize()函数中已经开启了SERCOM0的I2C相关中断使能位(比如TX、NACK、ERROR这些中断标志的使能开关),且NVIC_Initialize()中已经使能了SERCOM0的中断通道、配置了合法的中断优先级。
  2. 你当前main.c里的I2C写调用存在数组越界问题:你定义的reg数组长度为1,但SERCOM0_I2C_Write的第三个参数传了2,会访问非法内存,将第三个参数改为1即可。

内容的提问来源于stack exchange,提问作者user1397215

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:54:05