LM3S1138 入门4,中断优先级

发布者:advancement3最新更新时间:2016-11-01 来源: eefocus关键字:LM3S1138  中断优先级 手机看文章 扫描二维码
随时随地手机看文章
这个程序写的很有意思,注意设定的优先级是(0~7)<<5,数值越小优先级越高。具体的主程序的意思是:

针对中断优先级,我们设计了一个简单的例程:两路按键KEY1、KEY2输入采用不同的优先级中断,分别在各自的中断服务函数里控制指示灯LED1、LED2。

  其中,KEY1控制LED1、KEY2控制LED2。连接按键、指示灯的I/O均为低电平有效。
  在程序里,把KEY1中断设置为较高的优先级1、KEY2中断设置为较低的优先级2。KEY1、KEY2各自对应一个中断服务函数。在中断服务函数里做2件事情:清除中断状态、点亮对应的指示灯,然后进入一个死循环而不退出中断。

  在程序运行后,如果先按KEY1点亮LED1,再按KEY2时LED2不亮,原因是KEY1优先级比KEY2优先级高,KEY2中断无法打断KEY1中断。相反,如果先按KEY2点亮LED2,再按KEY1时也能点亮LED1,这说明较高级的KEY1中断能够打断较低级的KEY2中断。按/RST可以复位重来。

程序:

//  包含必要的头文件
#include  "LED.H"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


//  将较长的标识符定义成较短的形式
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput


//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG
#define  KEY_PORT               GPIO_PORTG_BASE
#define  KEY_PIN                GPIO_PIN_5


//  防止JTAG失效
void  JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                               //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN);                          //  设置KEY所在管脚为输入

    if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )            //  如果复位时按下KEY,则进入
    {
        for (;;);                                               //  死循环,以等待JTAG连接
    }

    SysCtlPeriDisable(KEY_PERIPH);                              //  禁止KEY所在的GPIO端口
}


//  GPIOD中断初始化
void  GPIOD_IntInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOD);                      //  使能GPIOD端口
    GPIOPinTypeIn(GPIO_PORTD_BASE , GPIO_PIN_1);                //  设置PD1管脚为输入

    GPIOIntTypeSet(GPIO_PORTD_BASE ,                            //  设置PD1的中断类型
                   GPIO_PIN_1 ,
                   GPIO_LOW_LEVEL);

    IntPrioritySet(INT_GPIOD , 1 << 5);                         //  设置GPIOD中断优先级为1

    GPIOPinIntEnable(GPIO_PORTD_BASE , GPIO_PIN_1);             //  使能PD1管脚中断
    IntEnable(INT_GPIOD);                                       //  使能GPIOD端口中断
}


//  GPIOG中断初始化
void  GPIOG_IntInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOG);                      //  使能GPIOG端口
    GPIOPinTypeIn(GPIO_PORTG_BASE , GPIO_PIN_5);                //  设置PG5管脚为输入

    GPIOIntTypeSet(GPIO_PORTG_BASE ,                            //  设置PG5的中断类型
                   GPIO_PIN_5 ,
                   GPIO_LOW_LEVEL);

    IntPrioritySet(INT_GPIOG , 2 << 5);                         //  设置GPIOG中断优先级为2

    GPIOPinIntEnable(GPIO_PORTG_BASE , GPIO_PIN_5);             //  使能PG5管脚中断
    IntEnable(INT_GPIOG);                                       //  使能GPIOG端口中断
}


//  系统初始化
void  SystemInit(void)
{
    SysCtlLDOSet(SYSCTL_LDO_2_50V);                             //  设置LDO输出电压

    SysCtlClockSet(SYSCTL_USE_OSC |                             //  系统时钟设置,采用主振荡器
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ |
                   SYSCTL_SYSDIV_1);

/*
    SysCtlLDOSet(SYSCTL_LDO_2_75V);                             //  配置PLL前须将LDO电压设置为2.75V

    SysCtlClockSet(SYSCTL_USE_PLL |                             //  系统时钟设置,采用PLL
                   SYSCTL_OSC_MAIN |                            //  主振荡器
                   SYSCTL_XTAL_6MHZ |                           //  外接6MHz晶振
                   SYSCTL_SYSDIV_10);                           //  分频结果为20MHz
*/

    LED_Init(LED1 | LED2);                                      //  初始化LED1和LED2

    GPIOD_IntInit();                                            //  GPIOD中断初始化
    GPIOG_IntInit();                                            //  GPIOG中断初始化

    IntMasterEnable();                                          //  使能处理器中断
}


int  main(void)
{
    JTAG_Wait();                                                //  防止JTAG失效,重要!
    SystemInit();                                               //  系统初始化

    for (;;)                                                    //  死循环,等待按键中断的产生
    {
    }
}


//  GPIOD的中断服务函数
void  GPIO_Port_D_ISR(void)
{
    unsigned long  ulStatus;

    ulStatus  =  GPIOPinIntStatus(GPIO_PORTD_BASE , true);      //  读取中断状态
    GPIOPinIntClear(GPIO_PORTD_BASE , ulStatus);                //  清除中断状态,重要

    if ( ulStatus & GPIO_PIN_1 )                                //  如果PD1的中断状态有效
    {
        LED_On(LED1);                                           //  点亮LED1

        for (;;)                                                //  死循环,不退出中断服务函数
        {
        }
    }
}


//  GPIOG的中断服务函数
void  GPIO_Port_G_ISR(void)
{
    unsigned long  ulStatus;

    ulStatus  =  GPIOPinIntStatus(GPIO_PORTG_BASE , true);      //  读取中断状态
    GPIOPinIntClear(GPIO_PORTG_BASE , ulStatus);                //  清除中断状态,重要

    if ( ulStatus & GPIO_PIN_5 )                                //  如果PG5的中断状态有效
    {
        LED_On(LED2);                                           //  点亮LED2

        for (;;)                                                //  死循环,不退出中断服务函数
        {
        }
    }
}

关键字:LM3S1138  中断优先级 引用地址:LM3S1138 入门4,中断优先级

上一篇:LM3S1138入门5,LDO控制电压
下一篇:LM3S1138入门3,中断

推荐阅读最新更新时间:2024-03-16 15:18

STM32 中断优先级原理
CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。 在 MDK 内,与 NVIC 相关的寄存器,MDK 为其定义了如下的结构体:   typedef struct   {   vu32 ISER ;
[单片机]
STM32 <font color='red'>中断优先级</font>原理
stm32f10x中断优先级
一直没有搞清楚stm32里面的中断分组是什么原理,今天看了一篇文章,一下就弄明白了,了解每一个细节是必要的,有对STM32更深的了解。 STM32中断优先级彻底讲解 一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级 的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断 STM32(Cortex-M3)中有两个优先级的概念 抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级
[单片机]
STM32 中断优先级以及全局允许和禁止
请问例程上为什么要把串口中断优先级设置在NVIC中断分组2 NVIC: M3内核允许8bit做优先级分组设置,而STM32只有4bit可以设置。 AIRCR寄存器的4个位的分组方式如下: 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占式优先级 例:定义为第二组,抢占式优先级2bit,响应式优先级2bit,2bit共可有4种状态,也就是总共能设置4*4=16个中断优先级。 定义为第三组
[单片机]
Cortex-M3处理器中断和FreeRTOS中断优先级配置
很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。 1写在前面 写本文之前,先写点相关的扩展内容。 STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。 可以参看我之前分享文章:从Cortex-M到Cortex-A认识ARM处理器,了解一下关于ARM处理器的种类。 本文主要结合Cortex-M3下面STM32F1系列处理器为例来讲述中断控制相关内容。而Cortex-M其它系列,或者说STM32其它系列关于中断的内容类似。 Cortex-M3只是STM32F1的一个内核。反过
[单片机]
Cortex-M3处理器中断和FreeRTOS<font color='red'>中断优先级</font>配置
STM32的中断优先级设定
在STM32的手册里没有提到关于设置中断优先级的情况,只列给出了中断向量表。根据该向量表可以创建一个中断编号的枚举数据,方便设置优先级及使能等的使用。 先说一下如何设置优先级。 优先级的设置在Cortex-CM3中:异常 - 优先级定义 中有描述;针对优先级的寄存器描述需要查看Cortex-M3编程手册。 可在此处下载手册:http://download.csdn.net/detail/gao_xyz/9780686 1、优先级组的设置 在权威指南 优先级定义中有描述,其优先级由:抢占优先级 和 子优先级组成。 此处需注意:抢占优先级,顾名思义,可以抢占CPU的,当有更高的抢占优先级时,可打断低抢占优先级的
[单片机]
STM32的<font color='red'>中断优先级</font>设定
7、STM32的外部中断EXTI及NVIC中断优先级介绍(内附代码)
一、什么是中断? 打断当前的操作,执行中断需要做的事情。 中断的作用:中断机制不仅赋予了系统处理意外情况的能力,就可以“同时”完成多个任务,提高了并发“处理”能力。 和线程的区别:线程是同时执行多个任务,中断是停下来去执行其他的(注意优先级),执行完了再回来执行, 定时器才相当于线程,定一个时间,每到这个时间执行一次 二、中断概述 STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。 STM32F40xx/STM32F41xx总共有92个中断 STM32F42xx/STM32F43xx则总共有96个中断 STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中
[单片机]
7、STM32的外部中断EXTI及NVIC<font color='red'>中断优先级</font>介绍(内附代码)
MCS-51系统中断优先级的软扩展
摘要:鉴于MCS-51系统只提供“二级中断嵌套”,提出扩展51系统中断优先级的纯软件方法。其利用51系统内建的中断允许寄存器IE和中断优先级寄存器IP,通过屏蔽字机制来实现;以C51的形式,给出这种扩展方法的函数库实现,为该方法的使用赋予友好、简洁的用户接口。 关键词:MCS-51单片机 中断优先级 软扩展 C51 引言 众所周知,MCS-51系统只提供“二级中断嵌套”,而大多数嵌入式系统希望有多于两级的优先级别。因为一般来说,系统都有掉电中断,且应置为最高优先级,这样所有其它中断只能共用一个最低优先级,如此,往往不能满足实际的逻辑需求。为了使系统具有多于两级的中断优先级别,可以利用8259A之类的中断控制芯片实现中断优先
[单片机]
STM32F1笔记(四)NVIC中断优先级管理
STM32将中断分为5个组,组0~4。配置代码如下: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 在标准库里,分组的定义如下: /** @defgroup Preemption_Priority_Group * @{ */ #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*! 0 bits for pre-emption priority 4 bits for subpriority */ #define NVIC_PriorityGroup_1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
502 Bad Gateway

502 Bad Gateway


openresty
设计资源 培训 开发板 精华推荐

502 Bad Gateway

502 Bad Gateway


openresty
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
502 Bad Gateway

502 Bad Gateway


openresty