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即可,编译后向量表对应位置就会存储你要的函数入口地址。
额外检查点
- 确认
SERCOM0_I2C_Initialize()函数中已经开启了SERCOM0的I2C相关中断使能位(比如TX、NACK、ERROR这些中断标志的使能开关),且NVIC_Initialize()中已经使能了SERCOM0的中断通道、配置了合法的中断优先级。 - 你当前
main.c里的I2C写调用存在数组越界问题:你定义的reg数组长度为1,但SERCOM0_I2C_Write的第三个参数传了2,会访问非法内存,将第三个参数改为1即可。
内容的提问来源于stack exchange,提问作者user1397215
相关产品推荐
相关产品推荐

