映射 SAM L10 设备的中断处理程序

     2023-02-19     57

关键词:

【中文标题】映射 SAM L10 设备的中断处理程序【英文标题】:Map interrupt handlers for SAM L10 device 【发布时间】:2022-01-04 00:24:15 【问题描述】:

我一直试图在使用 SAM L10 MCU 的系统上设置 I2C。我已经能够在 MPLAB X 上将我的项目作为独立项目构建,而无需使用 MPLAB Harmony v3 代码配置器。我的问题是我似乎无法正确映射中断处理程序。

以下是我正在使用的参考资料: https://github.com/Microchip-MPLAB-Harmony/csp_apps_sam_l10_l11/tree/master/apps/sercom/i2c/master/i2c_eeprom 和 https://microchipdeveloper.com/32arm:samd21-code-gcc-nvic-example

在这两种情况下,似乎都有一个为中断处理程序分配函数指针的表,称为exception_table。我不知道将它合并到我的代码中的正确方法,事实上,我不明白这段代码实际上是如何执行的,因为它只是分配函数指针。

这是我的代码:

init.c

#include <xc.h>
#include "peripheral/clock/plib_clock.h"
#include "peripheral/nvic/plib_nvic.h"
#include "peripheral/sercom/plib_sercom0_i2c_master.h"

#pragma config NVMCTRL_NSULCK = 0x7
#pragma config BOD33_LEVEL = 0x6
#pragma config BOD33_DIS = CLEAR
#pragma config BOD33_ACTION = 0x1
#pragma config WDT_RUNSTDBY = CLEAR
#pragma config WDT_ENABLE = SET
#pragma config WDT_ALWAYSON = CLEAR
#pragma config WDT_PER = 0x9
#pragma config WDT_WINDOW = 0xB
#pragma config WDT_EWOFFSET = 0xB
#pragma config WDT_WEN = CLEAR
#pragma config BOD33_HYST = CLEAR


void port_init (void)

    /* Configure SERCOM0 I2C on PA22 and PA23, Peripheral function C */
    PORT_REGS->GROUP[0].PORT_PINCFG[22] = 0x1;
    PORT_REGS->GROUP[0].PORT_PINCFG[23] = 0x1;
    PORT_REGS->GROUP[0].PORT_PMUX[11] = 0x22;

    
    /* Configure PA25 as an output driven high */
    PORT_REGS->GROUP[0].PORT_DIR = 0x02000000;
    PORT_REGS->GROUP[0].PORT_OUT = 0x02000000;
    PORT_REGS->GROUP[0].PORT_PINCFG[27] = 0x0;


void sys_initialise (void)

    CLOCK_Initialize ();
    port_init ();
    
    
    SERCOM0_I2C_Initialize ();
    NVIC_Initialize ();   
  

main.c

#include <xc.h>
#include "init.h"
#include "peripheral/sercom/plib_sercom0_i2c_master.h"

void main (void)

    sys_initialise ();

    uint8_t reg[1];
    reg[0] = 0xD0;    

    SERCOM0_I2C_Write (0x76, &reg[0], 2);    

我使用 GPIO 进行调试。我认为设置 NVIC 就足够了,但它只启用中断本身,中断处理程序仍未映射。我可以看到它,因为从我的调试中,当我尝试通过 I2C 发送内容时,处理程序永远不会被调用。我还可以看到 I2C 可以正常工作以发送事务的第一部分,即直到 ACK 位的设备地址。从这一点开始,我可以在示波器上看到时钟保持低电平,但 SDA 又回到高电平。我相信这是因为来自https://github.com/Microchip-MPLAB-Harmony/csp_apps_sam_l10_l11/blob/master/apps/sercom/i2c/master/i2c_eeprom/firmware/src/config/sam_l10_xpro/peripheral/sercom/i2c_master/plib_sercom0_i2c_master.c 的中断处理程序SERCOM0_I2C_InterruptHandler 没有被调用,因为它负责发送其余数据。

【问题讨论】:

什么是NVIC_Initialize?你不应该在某处有类似NVIC_EnableIRQ 的东西吗?我不记得各种 SAM 的所有细节,但 NVIC 外设中有可能需要配置的寄存器。 嗨@Lundin,我错过了对NVIC_SetVector() 的调用,它将我提到的中断处理程序与向量表中的相应异常相关联。 【参考方案1】:

我在 xc32 编译器的用户指南中找到了答案,可以在这里访问:https://ww1.microchip.com/downloads/en/DeviceDoc/XC32_PICC_UG_DS50002895A.pdf

我错过了对 NVIC_SetVector() 的调用 - 第 14.3 节展示了如何将中断处理程序与异常相关联。

【讨论】:

《linux设备驱动程序》(十六)-中断处理

参考技术A设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。2.6内... 查看详情

linux中断补充

...系统结构中,CPU工作的模式有两种,一种是中断,由各种设备发起;一种是轮询,由CPU主动发起。中断IRQ:中断允许让设备(如键盘,串口卡,并口等设备)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运... 查看详情

处理字符设备中的中断

】处理字符设备中的中断【英文标题】:Handlinginterruptincharacterdevice【发布时间】:2017-01-2006:34:12【问题描述】:我正在尝试在内核中为用户界面正确注册中断。令人惊讶的是,我在内核中没有找到很多示例。中断处理程序staticir... 查看详情

输入输出系统

...一、概述1、输入输出系统的组成(1)I/O软件(2)I/O硬件2、I/O设备与主机的联系方式(1)I/O设备编址方式(2)设备选址(3)传送方式(4)联络方式(5)I/O设备与主机的连接方式3、I/O设备与主机信息传送的控制方式(1)程序查询方式(2)程序中断方式... 查看详情

没有任何事先设置的硬件中断如何触发软件处理程序[关闭]

...但遇到了一些困惑。据我了解,处理器具有一组用于外围设备的外部中断。这样,制造商可以提供一种通过他们自己的外围设备中断处理器的方法 查看详情

中断简介

...这个过程称为中断。2.中断信号线在数字逻辑层面,外部设备和处理器之间有一条专门的中断信号线,用于连接外设与 查看详情

gic驱动程序分析(代码片段)

...重要函数和结构体3.GIC初始化过程2.1内核支持多种GIC2.2在设备树里指定GIC2.3gic_of_init分析3.申请GIC中断3.1在设备树里指定中断3.2内核对设备树的处理4.GIC中断处理流程源码分析参考资料:linuxkernel的中断子系统之&#x 查看详情

中断和异常

...t跟异常exception机制。1.中断中断通常是CPU外部的输入输出设备(硬件)触发的,供外部设备通知CPU有事情需要处理,因此又叫做中断请求,中断请求的目的是希望CPU暂时停止当前正在执行的程序,转去让CPU去处理中断请求对应的... 查看详情

中断处理程序不能使用printf的本质

...之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中,整个标准输出设备是一个全局变量,由于有semTake操作。那么就会发生堵塞。vxworks属于硬实时操作系统。不能在规定的时间内完毕操作即会死机或复位。所以v... 查看详情

linux中断所有知识点(代码片段)

...路由中断状态机中断处理流程GIC驱动设备树初始化中断的映射数据结构中断控制器注册irq_domain外设的驱动创建硬中断和虚拟中断号的映射关系中断的注册中断的处理保护现场中断处理恢复现场总结中断下半部之workqueueworkqueue相... 查看详情

在 Linux 中处理 /dev/tty 设备上的用户中断(UART 中断)

】在Linux中处理/dev/tty设备上的用户中断(UART中断)【英文标题】:HandlingUser-Break(UARTBreak)ona/dev/ttydeviceinLinux【发布时间】:2009-06-1021:29:17【问题描述】:这里是一些代码示例,但问题是当使用“putty”通过串行线路发送“break”... 查看详情

通过按键玩中断

...CPU直接跳转到用户设置好的中断处理程序处---保护环境---设备的中断处理---恢复环境 查看详情

网卡工作原理

...、设备管理、网络等几部分。所有的系统操作最终都可以映射到对物理设备的操作。除去对CPU、内存以及其他少数几个物理实体的操作之外,系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种... 查看详情

avr_interrupt

...号,暂时停止(中断)当前程序的执行,转而执行为外部设备服务的型号(中断服务程序),并在执行完服务程序后自动返回原程序的过程。具有的优势实现实时处理实现分时操作,提高MCU的处理效率进行故障处理待机状态的唤... 查看详情

linux驱动开发-中断处理模型笔记5(代码片段)

...理模型1、概念解析a)I/O操作的不确定因素以及处理器和I/O设备之间速度不匹配,设备往往通过某种硬件信号异步唤起处理器的注意b)这些硬件信号就称为中断,每个设备都被分配了一个相关的标示符,别称为中断请求... 查看详情

什么是中断系统

...组成部分。实时控制、故�自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算... 查看详情

18设备处理内核i/o包

I/O包:内核要求设备完成的任务,需要调用驱动程序,传参给驱动;操作所需的参数数量大,需要I/O包统一管理;objnode_t结构:objnode_t结构包含了各个驱动程序功能函数的所有参数;创建和删除I/O包:内存管理组件分配释放objnod... 查看详情

中断实现的基本原理

...源。其实从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,... 查看详情