精华内容
下载资源
问答
  • 下面我们看看 GPIO 跟中断线的映射关系图: 标 GPIO 和中断线的映射关系图题 中断初始化步骤 1、使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 2、初始化GPIO GPIO_InitTypeDef GPIO_Init...

    我所使用的开发板是原子的迷你版,一般情况是购用的。

    买回来以后不知道在干嘛,反正是一直在吃土。

    今天拿出来学习一下。

     这个是板子的原理图,咱们主要关注WK_UP这里,WK_UP通过一个按键连接到PA0,按键按下后会将PA0上拉到VCC。

    STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 15~0。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO 跟中断线的映射关系图:

     

    标 GPIO 和中断线的映射关系图题

     

    中断初始化步骤

    1、使能GPIO时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

     2、初始化GPIO

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(KEY2_PORT, &GPIO_InitStruct);

    3、建立管脚与中断的联系

    EXTI_InitTypeDef EXTI_InitStruct;
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger =  EXTI_Trigger_Falling;//下降沿中断,EXTI_Trigger_Rising上升沿中断
    EXTI_Init(&EXTI_InitStruct);

    EXTI_Trigger_Rising:上升沿中断,按键按下后立刻产生中断。

    EXTI_Trigger_Falling:下降沿的中断,按键按下再放开的时候产生中断。

    我测试的时候用上升沿的话,有时候会产生两次中断。下降沿不会,没细研究。

    4、中断初始化

    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//赋值内容可以在startup_stm32f10x_hd.s中看到
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    5、中断函数(EXTI0_IRQHandler)

    void EXTI0_IRQHandler(){
    	if (EXTI_GetITStatus(EXTI_Line0) != RESET){
    		delay_ms(10);
    		LED0_ON();
    		LED1_ON();//开启LED指示灯,如果没设置LED,可以printf啥的。
    		EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标记。
    	}
    }

    完整内容

    key.h

    #ifndef _KEY_
    #define _KEY_
    
    #include "stm32f10x_gpio.h"
    #include "led.h"
    #include "usart.h"
    #include "delay.h"
    
    #define KEY0_PORT GPIOC
    #define KEY0_Pin GPIO_Pin_5
    
    #define KEY1_PORT GPIOA
    #define KEY1_Pin GPIO_Pin_15
    
    #define KEY2_PORT GPIOA
    #define KEY2_Pin GPIO_Pin_0
    
    #define KEY0_State GPIO_ReadInputDataBit(KEY0_PORT,KEY0_Pin)
    #define KEY1_State GPIO_ReadInputDataBit(KEY1_PORT,KEY1_Pin)
    
    void KEY_GPIO_Init(void);
    
    
    #endif

    key.c

    #include "key.h"
    
    void KEY_GPIO_Init(){
    	GPIO_InitTypeDef GPIO_InitStruct;
    	EXTI_InitTypeDef EXTI_InitStruct;
    	NVIC_InitTypeDef NVIC_InitStruct;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA,ENABLE);
    	
    	//KEY0
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    	GPIO_InitStruct.GPIO_Pin = KEY0_Pin;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(KEY0_PORT, &GPIO_InitStruct);
    	
    	//KEY1
    	GPIO_InitStruct.GPIO_Pin = KEY1_Pin;
    	GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
    	
    	//KEY2
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    	GPIO_InitStruct.GPIO_Pin = KEY2_Pin;
    	GPIO_Init(KEY2_PORT, &GPIO_InitStruct);
    	
    	//KYE2中断
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    	
    	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    	EXTI_Init(&EXTI_InitStruct);
    	
    	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    	NVIC_Init(&NVIC_InitStruct);
    	
    	
    }
    
    void EXTI0_IRQHandler(){
    	if (EXTI_GetITStatus(EXTI_Line0) != RESET){
    		delay_ms(10);
    		printf("Get Exti\r\n");
    		LED0_ON();
    		LED1_ON();
    		EXTI_ClearITPendingBit(EXTI_Line0);
    	}
    }
    
    
    

    在main函数中调用KEY_GPIO_Init()即可。

    展开全文
  • 单片机外部中断详解及程序

    千次阅读 2021-04-23 11:34:03
    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来...

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
    实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。
    #include <iom16.h>
    unsigned int t=500; //定义一个全局变量t,并设定初始值为500次
    //=延时子函数,在8MHz晶振时约1ms===
    void delay_ms(unsigned int k)
    {
    unsigned int i,j;
    for(i=0;i<k;i++)
    {
    for(j=0;j<1140;j++)
    ;
    }
    }
    //主函数======================
    void main( void )
    {
    DDRB = 0xFF; //设置端口B为输出方向
    PORTB = 0xFF; //设置端口B的输出为全高电平
    DDRD = 0x00; //设置端口D为输入方向
    PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态
    MCUCR = 0x0A; //设定INT0、INT1为下降沿触发
    GICR = 0xC0; //使能INT0、INT1中断
    SREG = 0x80; //使能总中断
    while(1)
    {
    PORTB = 0x55; //让接在端口B上的LED显示01010101
    delay_ms(t); //延时t个ms
    PORTB = 0xAA; //让接在端口B上的LED显示01010101
    delay_ms(t); //延时t个ms
    }
    }
    //中断函数(外部0)==============
    #pragma vector = INT0_vect
    __interrupt void INT0_Server(void)
    {
    t = 100; //设定t的值为100次
    }
    //中断函数(外部1)==============
    #pragma vector = INT1_vect
    __interrupt void INT1_Server(void)
    {
    t = 500; //设定t的值为500次
    }
    把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。下面就来分析一下键盘中断的程序原理。
    在分析程序之前,先来了解一下什么叫“外部中断”。前面已讲述过,在没有打扰的情况下,单片机的程序在封闭状态下自主运行,但如果在某一时刻需要响应一个外部事件(比如有按键被按下),这时就需要用外部中断。具体来讲,外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获到这个变化,单片机内部自主执行的程序就被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原程序。这个引脚上的电平变化,就申请了一个外部中断事件,而这个能申请外部中断的引脚就是外部中断的触发引脚。在上面的例子中,可以看到两个按键S1、S2被接到了ATMega16的PD3和PD2引脚,而这两个引脚正是该单片机的两个外部中断(INT1和INT0)的触发引脚(第二功能)。当按键没有按下时,这两个引脚都为高电平(执行过PORTD=0xFF),当按键被按下时,引脚电平跳变为低电平,这时若单片机设置成允许中断申请,就会触发外部中断事件,从而转去执行中断服务程序。明白了这个过程之后,接下来就可以分析程序了。
    程序执行后,主程序就一直在不停的运行while(1)内的这个死循环,让LED以t=500ms的初始值来交替闪烁,直到有外部中断来打断它。假设某一时刻按键S2被按下,这时由于引脚PD2上的电平突然被拉低,申请了一个外部中断0(INT0),这时的程序就转去执行外部中断0的中断服务程序(即__interrupt void INT0_Server(void)函数)。这时全局变量t的值被该函数重新赋值为100(即延时为100ms),完成后又回到主函数中的while(1)内去继续执行,因此LED闪烁的速度就变快了。
    观察程序可看出,如果没有中断去调用中断服务子程序,在主程序中是没有语句去调动它的。也就是说如果没有外部中断,中断服务子程序(即__interrupt void INT0_Server(void)函数)是永远不会被执行的。这也说明,中断服务子程序是一类特殊的子程序,它不能被主程序调用,只能被中断申请调用。因此,中断服务子程序有它固定的格式和写法。在不同的编译系统中的写法不完全一样,下面给出IAR下的中断服务子程序的格式。
    #pragma vector = INT0_vect
    __interrupt void INT0_Server(void)
    {
    中断服务程序代码
    }
    以上是固定格式,除斜体部分外,其余部分不可更改。斜体部分中的INT0_vect表示中断的向量号,不同的中断名称不一样(原型在头文件iom16.h中)。斜体部分中的INT0_Server是中断函数的名称,是由开发者自己定义的。虽然可以自定义,但名称还是要取得“见名知义”,这样一看就知道是什么中断服务了。

    展开全文
  • 64 内核中断初始化中断分类Linux 系统中, 中断分为:硬中断: 由外部设备或者执行异常产生的需要快速处理的中断如缺页中断定时器硬件中断根据内部产生还是外部产生, 分为:异常: 异常是内部产生的中断, 不可屏蔽外部...

    Linux x86_64 内核中断初始化

    中断分类

    Linux 系统中, 中断分为:

    硬中断: 由外部设备或者执行异常产生的需要快速处理的中断如缺页中断定时器硬件中断

    根据内部产生还是外部产生, 分为:

    异常: 异常是内部产生的中断, 不可屏蔽

    外部中断: 外部中断是由外部设备产生的, 可以屏蔽

    软中断:

    软中断是 Linux 系统中断处理的底半处理部分, 是 Linux 模拟的中断为了加快硬件中断的处理, 防止数据的丢失, Linux 对中断处理分为顶半处理和底半处理两部分, 顶半处理程序快速处理硬件事件, 把不是那么紧急的逻辑放到底半处理程序中, 可以简单的认为硬终端处理程序为顶半处理程序, 软中断处理程序为底半处理程序软中断一般在硬中断处理程序执行后才会执行但是当硬中断嵌套的时候, 软中断会在所有的硬中断处理完毕后才会处理, 当软中断太多, 会放到 ksoftirqd 线程中处理

    内核初始化 - 中断

    intel 处理器有 256 个硬中断号其中前 32 个中断号为异常使用, 在内核初始化的时候进行初始化内核初始化的代码流程如下:

    可以看到首先初始化异常处理, 再初始化部分外部中断, 再初始化一部分软中断处理asmlinkagevoid__init start_kernel(void)

    {

    lock_kernel();

    ...

    // 初始化调度模块

    sched_init();

    ...

    sort_main_extable();

    // 初始化异常处理

    trap_init();

    ...

    // 初始化外部中断

    init_IRQ();

    ...

    // 初始化定时器模块, 同时, 会注册定时器的软中断处理函数

    init_timers();

    // 初始化软中断)

    softirq_init();

    time_init();

    ...

    // 初始化

    acpi_early_init();

    }

    异常中断初始化

    异常中断在内核中称为 trap, 异常中断初始化代码为// 门初始化初始化中断向量表系统有固定的 256 个硬件中断向量

    void__init trap_init(void)

    {

    set_intr_gate(0,÷_error);

    set_intr_gate_ist(1,&debug,DEBUG_STACK);

    set_intr_gate_ist(2,&nmi,NMI_STACK);

    set_intr_gate(3,&int3);

    set_system_gate(4,&overflow);/* int4-5 can be called from all */

    set_system_gate(5,&bounds);

    set_intr_gate(6,&invalid_op);

    set_intr_gate(7,&device_not_available);

    set_intr_gate_ist(8,&double_fault,DOUBLEFAULT_STACK);

    set_intr_gate(9,&coprocessor_segment_overrun);

    set_intr_gate(10,&invalid_TSS);

    set_intr_gate(11,&segment_not_present);

    set_intr_gate_ist(12,&stack_segment,STACKFAULT_STACK);

    set_intr_gate(13,&general_protection);

    set_intr_gate(14,&page_fault);

    set_intr_gate(15,&spurious_interrupt_bug);

    set_intr_gate(16,&coprocessor_error);

    set_intr_gate(17,&alignment_check);

    #ifdefCONFIG_X86_MCE

    set_intr_gate_ist(18,&machine_check,MCE_STACK);

    #endif

    set_intr_gate(19,&simd_coprocessor_error);

    #ifdefCONFIG_IA32_EMULATION

    set_system_gate(IA32_SYSCALL_VECTOR,ia32_syscall);

    #endif

    set_intr_gate(KDB_VECTOR,call_debug);

    /*

    * Should be a barrier for any external CPU state.

    */

    cpu_init();

    }

    总结如下:中断向量号异常事件Linux 的处理程序0除法错误Divide_error

    1调试异常Debug

    2NMI 中断Nmi

    3单字节,int 3Int3

    4溢出Overflow

    5边界监测中断Bounds

    6无效操作码Invalid_op

    7设备不可用Device_not_available

    8双重故障Double_fault

    9协处理器段溢出Coprocessor_segment_overrun

    10无效 TSSIncalid_tss

    11缺段中断Segment_not_present

    12堆栈异常Stack_segment

    13一般保护异常General_protection

    14页异常Page_fault

    15Spurious_interrupt_bug

    16协处理器出错Coprocessor_error

    17对齐检查中断Alignment_check

    0x80系统调用ia32_syscall

    0xf9内核调试call_debug

    上述中断处理函数都是汇编语言编写一部分汇编直接处理完毕, 一部分通过调用 C 函数帮助处理

    汇编代码在

    linux/arch/x86_64/entry.S

    中, 大部分都是调用 C 函数

    do_中断处理函数名

    处理

    整理如下:中断向量号异常事件Linux 汇编调用 c 函数处理结果0除法错误Divide_errordo_divide_error发送 SIGFPE 信号

    1调试异常Debugdo_debug发送 SIGTRAP 信号

    2NMI 中断Nmido_nmi

    3单字节,int 3Int3do_int3发送 SIGTRAP 信号

    4溢出Overflowdo_overflow发送 SIGSEGV 信号

    5边界监测中断Boundsdo_bounds发送 SIGSEGV 信号

    6无效操作码Invalid_opdo_invalid_op发送 SIGILL 信号

    7设备不可用Device_not_availablemath_state_restore发送 SIGSEGV 信号

    8双重故障Double_faultdo_double_fault

    9协处理器段溢出Coprocessor_segment_overrundo_coprocessor_segment_overrun发送 SIGFPE 信号

    10无效 TSSInvalid_tssdo_invalid_TSS发送 SIGSEGV 信号

    11缺段中断Segment_not_presentdo_segment_not_present发送 SIGBUS 信号

    12堆栈异常Stack_segmentdo_stack_segment

    13一般保护异常General_protectiondo_general_protection

    14页异常Page_faultdo_page_fault处理缺页中断

    15Spurious_interrupt_bugdo_spurious_interrupt_bug

    16协处理器出错Coprocessor_errordo_coprocessor_error发送 SIGFPE 信号

    17对齐检查中断Alignment_checkdo_alignment_check发送 SIGBUS 信号

    0x80系统调用ia32_syscall

    0xf9内核调试call_debugdo_call_debug

    外部中断初始化

    中断控制器硬件 APIC 分为两种: 本地 APIC 和全局 APIC 本地 APIC 集成在 CPU 内部, 每个 CPU 都有一个, 用于处理本地中断请求, CPU 可以通过 APIC 向其他 CPU 发送中断, 现在主要用于 CPU 之间的通信 (IPI) 全局 APIC 主要是连接外部设备, 用于外部设备的中断在内核中断初始化的时候, 会初始化三个与 IPI 相关中断void__init init_IRQ(void)

    {

    inti;

    /**

    * 该函数主要是初始化硬件

    * 1. 初始化本地 APIC 控制芯片

    * 2. 初始化 8259A 芯片

    /

    init_ISA_irqs();

    /*

    * 清空 32 以后的中断向量表(除了系统调用和内核调试用的中断号)

    */

    for(i=0;i

    intvector=FIRST_EXTERNAL_VECTOR+i;

    if(i>=NR_IRQS)

    break;

    if(vector!=IA32_SYSCALL_VECTOR&&vector!=KDB_VECTOR){

    set_intr_gate(vector,interrupt[i]);

    }

    }

    // 多处理器通信中断

    #ifdefCONFIG_SMP

    set_intr_gate(FIRST_DEVICE_VECTOR,interrupt[0]);

    set_intr_gate(RESCHEDULE_VECTOR,reschedule_interrupt);

    set_intr_gate(INVALIDATE_TLB_VECTOR,invalidate_interrupt);

    set_intr_gate(CALL_FUNCTION_VECTOR,call_function_interrupt);

    #endif

    // 本地 APIC 中断

    #ifdefCONFIG_X86_LOCAL_APIC

    /* self generated IPI for local APIC timer */

    set_intr_gate(LOCAL_TIMER_VECTOR,apic_timer_interrupt);

    set_intr_gate(SPURIOUS_APIC_VECTOR,spurious_interrupt);

    set_intr_gate(ERROR_APIC_VECTOR,error_interrupt);

    #endif

    setup_timer();

    if(!acpi_ioapic)

    setup_irq(2,&irq2);

    }

    总结如下:中断向量号中断名异常事件中断处理函数调用 c 函数处理结果0xfcRESCHEDULE_VECTOR处理器间中断, 用于 cpu 之间同学,其他 cpu 要求重新调度reschedule_interruptsmp_reschedule_interrupt将线程调度标志置为需要重新调度。之后内核检查标志的时候会重新调度线程

    0xfdINVALIDATE_TLB_VECTOR处理器间中断, 用于 cpu 之间通信,其他 cpu 要求 TLB 缓存失效invalidate_interruptsmp_invalidate_interruptcpu 刷新 TLB

    0xfaCALL_FUNCTION_VECTOR处理器间中断, 用于 cpu 之间通信,让另外的 cpu 调用某个函数call_function_interruptsmp_call_function_interrupt函数数据通过 call_data_struct 传送,cpu 会调用该函数

    0xefLOCAL_TIMER_VECTORAPIC 定期器中断apic_timer_interruptsmp_apic_timer_interrupt触发定时器的软中断

    0xffSPURIOUS_APIC_VECTOR伪中断spurious_interruptsmp_spurious_interrupt忽略

    0xfeERROR_APIC_VECTORAPIC 错误error_interruptsmp_error_interrupt打印错误

    0xfa 中断说明:

    当 cpu 需要另一个 cpu 执行某个函数时, 只需要初始化structcall_data_struct{

    void(*func)(void*info);

    void*info;

    atomic_tstarted;

    atomic_tfinished;

    intwait;

    };

    的结构体, 然后发出一个 0xfa 中断即可

    软中断初始化

    软中断初始化分为两部分:

    初始化定时器时, 会打开 TIMER_SOFTIRQ 的软中断, 并设置中断处理函数为 run_timer_softirq

    softirq_init 函数执行, 会打开 TASKLET_SOFTIRQ 和 HI_SOFTIRQ, 处理函数分别为 tasklet_action 和 tasklet_hi_action

    软中断的线程处理机制就不说了

    来源: https://www.cnblogs.com/stonehat/p/8681639.html

    展开全文
  • 5.外部中断初始化,包括中断线,中断触发方式,中断模式和使能 6.配置中断抢占优先级和子优先级,配置之前在主函数比较靠前的位置先设置分组 7.编写中断服务函数,包括中断标志位的判断以及解挂操作 void MY_EXTI_...

    1.使能GPIO
    取决于外部中断线要映射到哪个GPIO
    2.初始化GPIO
    3.使能系统配置时钟SYSCFG
    4.配置中断线,映射到相应GPIO端口
    5.外部中断初始化,包括中断线,中断触发方式,中断模式和使能
    6.配置中断抢占优先级和子优先级,配置之前在主函数比较靠前的位置先设置分组
    7.编写中断服务函数,包括中断标志位的判断以及解挂操作

    void MY_EXTI_INIT()
    {	
    	GPIO_InitTypeDef GPIO_InitStruct;
    	EXTI_InitTypeDef EXTI_InitStruct;
    	NVIC_InitTypeDef NVIC_InitStruct;
    	
    	//1.使能GPIOA
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    	
    	//2.初始化IO口输入
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
    	GPIO_Init(GPIOA,&GPIO_InitStruct);
    	
    	//3.使能SYSCFG
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
    	
    	//4.配置中断线,映射到IO口
    	 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
    	
    	//5.配置中断触发方式及使能
    	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    	EXTI_Init(&EXTI_InitStruct);
    	
    	//6.配置中断优先级
    	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    	NVIC_Init(&NVIC_InitStruct);	
    }
    //7.编写中断服务函数
    void EXTI0_IRQHandler(void)
    {
    	//中断服务函数
    	//获取状态
    	 if(EXTI_GetFlagStatus(EXTI_Line0)==1)
    	 {	
    		delay_ms(10);
    		if(WK==1)
    			LED0 = ~LED0;
    	 }
    	 //解挂
    	 EXTI_ClearITPendingBit(EXTI_Line0);
    }
    
    展开全文
  • 中断描述符对于每一条中断线都由一个irq_desc结构来描述。//在include/linux/irq.h中struct irq_desc { unsigned intirq;//中断号 struct timer_rand_state *timer_rand_state; unsigned int*kstat_irqs; #ifdef ...
  • /*********************************************************************************************函数名:外部中断INT初始化函数调用:INT_init();参数:无返回值:无结果:启动外部中断INT1、INT0中断,设置中断...
  • 原标题:Linux中断机制:硬件处理,初始化中断处理来源: CSDN | phenix_lord的专栏硬件处理最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。不同的外部设备、不同的体系结构、不同的OS其中断...
  • AVR128 外部中断 C程序

    2021-05-20 13:53:41
    原标题:AVR128 外部中断 C程序/*AT 128 功能: INT0、INT1*//*GCC编译器*/#include#include#include#define SET_1(a,b) a|=(1<...#define uchar unsigned char#define uint unsigned int/*中断初始化,IN...
  • 外部中断 以下是假期对51单片机课程内容做的一些小结 中断的基本概念 中断: CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理...
  • } /*********外部中断 0 服务*********/ -可编辑修改- 。 void extInterrupt0(void) interrupt 0 { unsigned char counter; EA=0; for(counter=0; counter; counter++) { P0=0; delay(100); P0=0xff; delay(100); }...
  • 原标题:STC89C52单片机外部中断0实验/////////////////////////////////////////////////////////////////////////实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来显示系统进入了外部中断0实验板型号:BS...
  • 1.GIC中断控制器介绍 ARM处理器中最常用的中断控制器是GIC(Global Interrupt Controller)。GIC支持3中中断类型。 (1)SGI(Software Generated Interrupt):软件产生的中断,通常用于多核之间的通信。一个CPU可...
  • Linux中断子系统的初始化注:以2.6.39内核源码讲解Linux整个中断处理体系其实可以分为两个部分,一部分是系统完成的部分,另一部分是驱动工程师需要完成的部分(也就是我们用requst_irq注册的处理函数),本次我们主要...
  • F28335的中断源可分为片内外设中断源,如PWM、CAP、QEP、定时器等、片外中断源,外部中断输入引脚XINT1,XINT2引人的外部中断源等。 1、dsp28335三级中断机制 由于外设中断源有58个,而中断线只有12根,这就需要F...
  • byproteus还有很多问题,这篇只是笔记ORG0000HAJMPMAINORG0003HAJMPINTTERRUPT0ORG0013HAJMPINTTERRUPT...初始化外部中断SETB EASETB EX0SETB EX1CLRIT0CLR IT1LOOP:LCALLFIND ;流水灯方式1MOVP0,R3LCALLDELAYCJNE...
  • 本章主要记录外部中断函数的学习情况,实验过程首先完成按键扫描实验,使用外部中断完成了按键中断实验。 需要说明的是,外部按键扫描即使用的是GPIO读取功能,HAL_GPIO_ReadPin()函数,该函数在[00_]有说明。GPIO...
  • 51的 外部中断 与 定时器(内部中断) 有一个共同特点,那就是与主程序是并行工作的,就是主程序在运行的时候,中断也在等待触发条件,当中断被触发的时候会暂停主程序转而执行中断服务程序,只有中断服务程序执行完后...
  • 13 . 外部中断实验

    2021-05-13 10:50:46
    外部中断实验 介绍了STM32F10x 的中断,就来学习下外部中断。要实现的功能与按键实验一样,即通过按键控制LED,只不过这里采用外部中断方式进行控制。 1. 外部中断介绍 EXTI 简介 STM32F10x 外部中断/事件控制器...
  • 《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记一.ARM中断体系当一个“异常”发生时,或者说当收到一个中断触发信号时,ARM9将会自动完成如下一些工作:(1)在异常工作模式的连接寄存器R14中...
  • // -----------------------函数声明,变量定义----------------- ----------- #include #define KEY P1 ... 2外部中断0 unsigned char COUNT_TI; //定时中断计数unsigned char key_code; //键值// -------------...
  • Linux内核中断初始化

    2021-05-10 23:48:10
    interrupt数组是存放在rodata段中的,该段内存在完成初始化idt之后,还有什么用处呢?是否回收呢?interrupt数组定义在.init.rodata段,entry_32.S: .section.init.rodata,"a"ENTRY(interrupt).text.init段中的数据...
  • 文章目录exit.c exit.c #include "exti.h" ...//外部中断初始化函数 void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(R
  • STM32——第三章外部中断外部中断简介2 相关库函数2.1 配置中断线映射关系的函数GPIO_EXTILineConfig2.2 中断线上中断的初始化函数 EXTI_Init2.3 NVIC 函数设置中断优先级2.4 中断服务函数3 使用IO口外部中断的...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼* 名称:外部中断* 日期:2013-9-10* 晶振:11.0592MHZ******************************************************************/#include //包含头文件,对IO进行定义,可以...
  • 51单片机外部中断

    2021-01-16 19:27:24
    计算机执行某程序时,发生了紧急事件或有特殊请求,CPU暂停某程序的执行,转而去处理上述事件或请求,处理完毕后再重新执行某程序的过程叫做中断。 数据的输入/输出传送方式 1.无条件传送方式: 一方对另一方来说...
  • } } void int3_0() interrupt 0{ //外部中断0服务程序 b=b+1; //中断次数加一 TR1=1; //启动计数器1 switch(b){ case 1:TR1=1;break; case 2:TR1=0;b=0;TR0=1;break; } } void int1_0() interrupt 2{ //外部中断1...
  • STM32外部中断

    2021-05-22 21:58:11
    外部中断概述 外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续...
  • arch/arm/plat-s3c64xx/irq-eint.c文件实现了S3C64XX系列的外部中断初始化,这是一个内核模块,入口点是s3c64xx_init_irq_eint,声明如下:arch_initcall(s3c64xx_init_irq_eint);参考源码可以确定编译时会将其替换...
  • 找了介绍ARM的外部中断处理过程的很多资料,但是大部分文章介绍的都不太清楚,现在自己总结如下:我认为,ARM外部中断处理过程应该从静态核动态两个方面来解释:静态方面,需要系统做如下准备工作:1.初始化各中断...
  • STM32外部中断实验

    2021-09-29 17:28:21
    STM32 的每个 IO 都可以作为外部中断 的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,317
精华内容 31,726
关键字:

外部中断初始化程序