TM4C123G学习笔记(3)——NVIC:外部中断

本文详细介绍了STM32微控制器的GPIO配置及外部中断处理过程,包括使能时钟、配置GPIO引脚、设置中断触发类型、注册中断服务函数等关键步骤,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、相关配置函数

 

1.1使能外设

本次实验涉及GPIOB和GPIOF,其中GPIOB用于LED,GPIOF用于触发外部中断

void SysCtlPeripheralEnable(uint32_t ui32Peripheral)

  • 功能:使能外设时钟
  • 参数:uint32_t ui32Peripheral:需要使能的外设,在本文中需要使能的外设为GPIO(例如SYSCTL_PERIPH_GPIOF)
  • 说明:从使能操作开始到完成需要经过五个时钟周期,在此期间不可访问外设,否则会出现总线错误。

1.2配置GPIO

void GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins)

  • 功能:配置引脚为输出模式
  • 参数:
    1. uint32_t ui32Port :GPIO口的基地址
    2. uint8_t ui8Pins:引脚(例如GPIO_PIN_1)

void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)

  • 功能:写值到指定引脚.
  • 参数:
    1. uint32_t ui32Port:GPIO口的基地制作.
    2. uint8_t ui8Pins: 引脚,每一位对应不同的引脚,各个引脚对应的二进制位如下,值为1表示这一位对应的引脚用于输出
    3. uint8_t ui8Val: 每一个二进制位的值就是该二进制位对应引脚的输出值,1表示高电平,0表示低电平

1.3配置外部中断     

(1)void GPIOIntTypeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32IntType)

  1. 功能:设置指定引脚的中断触发类型.
  2. 参数:
    (1)ui32Port: GPIO口的基地址
    (2)ui8Pins: 每个比特位表示一个引脚
    (3)ui32IntType: 中断触发的类型

(2)void GPIOIntRegister(uint32_t ui32Port, void (*pfnIntHandler)(void))

  1. 功能:注册GPIO外部中断的中断服务函数
  2. 参数:
    (1)ui32Port :GPIO口的基地址
    (2)pfnIntHandler: 是指向中断服务函数入口地址的指针。中断服务函数可以自行定义

(3)void GPIOIntEnable(uint32_t ui32Port, uint32_t ui32IntFlags)

  1. 功能:使能指定GPIO中断源的中断。
  2. 参数:
    (1)ui32Port :GPIO口的基地址。
    (2)ui32IntFlags: 中断源中断屏蔽位

(4)void IntEnable(uint32_t ui32Interrupt)

  1. 功能:在中断控制器中使能一个中断
  2. 参数:
    (1)ui32Interrupt 指定的中断

(5)bool IntMasterEnable(void)

  1. 功能:使能处理器中断,即允许处理器响应某个中断.
  2. 参数:无

(7)void GPIOIntClear(uint32_t ui32Port, uint32_t ui32IntFlags)

  1. 功能:清除指定中断源的中断标志位
  2. 参数:
    (1)ui32Port :GPIO口的基地址
    (2)ui32IntFlags :被清除的中断源中断屏蔽位
  3. 注意:发生中断后,对应的中断标志位置1,进入中断服务函数,在服务函数中务必清除中断标志。配置中断后最好也调用一次该函数

(8)void IntPrioritySet(uint32_t ui32Interrupt,uint8_t ui8Priority)

  1. 功能:设置中断的优先级
  2. 参数:
    (1)ui32Interrupt 指定的中断
    (2)ui8Priority :中断优先级,最低为0xE0,最高为0x00

(9)uint32_t GPIOIntStatus(uint32_t ui32Port, bool bMasked)

  1. 功能:读取指定GPIO口的中断状态
  2. 参数:
    (1)ui32Port: GPIO口的基地址.
    (2)bMasked: 一个布尔变量,用于指定返回值屏蔽的中断状态或原始的中断状态
  3. 在中断服务函数中会用到

   

 

2、代码示例

#include "my_key.h"


void MY_KEY_Init(void)
{
		//使能外设时钟
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
	
		//配置GPIO
    
		//设置引脚方向
    GPIODirModeSet(GPIOB_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN);
		//配置指定的引脚:GPIO口,引脚,输出驱动能力,输出类型(上下拉,开漏)
    GPIOPadConfigSet(GPIOB_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
   
    
    GPIODirModeSet(GPIOF_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);   
    GPIOPadConfigSet(GPIOF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
		
		
		
		//配置GPIO外部中断
		
		//设置引脚中断触发类型:双边缘触发
		GPIOIntTypeSet(GPIOF_BASE, GPIO_PIN_4, GPIO_BOTH_EDGES);
		//注册GPIO外部中断的中断服务程序:KEY_Handler
    GPIOIntRegister(GPIOF_BASE, KEY_Handler); 
    //使能指定引脚的中断
    GPIOIntEnable(GPIOF_BASE, GPIO_PIN_4);
    //使能一个中断源的中断(中断控制器层面的使能)
    IntEnable(INT_GPIOF);
     //使能一个中断源的中断(处理器层面的使能)
    IntMasterEnable();
    //清除指定中断源的标志位
    GPIOIntClear(GPIOF_BASE, GPIO_PIN_4);
		//设置中断优先级:0xE0到0x00
		IntPrioritySet(INT_GPIOF, 0x07);
		//配置GPIO外部中断
		

}



void KEY_Handler(void)
{
    unsigned long IntStatus1;
		//get the masked interrupt status of GPIOF
    IntStatus1 = GPIOIntStatus(GPIOF_BASE, true);
		//clear the aforementioned status
    GPIOIntClear(GPIOF_BASE, IntStatus1);

    if (IntStatus1 & GPIO_PIN_4)//KEY1
    {
        if(KEY1==0)
        {
            if(Check_flag==1 && SystemTime>3000)
            {
                Check_flag=2;
            }
            LED_YELLOW;
						UARTprintf("yellow");
           
                
        }
        else
        {
            LED_RGBOFF;
					
        }
    }
}




完整代码可在此下载

https://download.youkuaiyun.com/download/SStegosaurus/12738499

### TM4C123G 微控制器中断优先级配置 对于TM4C123G微控制器而言,中断系统的管理依赖于集成嵌套向量中断控制器(NVIC)[^1]。此模块允许开发者设定不同外设触发的中断事件之间的相对重要性。 #### NVIC结构概述 NVIC支持多个可屏蔽中断源,并通过软件编程来设置这些中断源的优先级别。每个外部中断请求线都分配有一个8位的优先权寄存器用于指定该IRQ的具体优先等级。这使得当两个或更多个中断同时发生时能够按照预定义顺序处理它们成为可能。 #### 设置中断优先级的方法 为了调整特定中断类型的优先级,在程序中通常会调用如下形式的功能函数: ```c void IntPrioritySet(unsigned long ulInterrupt, unsigned char ucPriority); ``` 其中`ulInterrupt`参数指定了要修改哪个具体的硬件中断号;而`ucPriority`则决定了这个中断的新优先级数值——越低表示越高优先度。需要注意的是,实际应用过程中应当查阅官方手册确认所使用的具体型号对应的合法取值范围以及如何正确编码多层级别的组合方式。 此外,还可以利用库文件提供的宏定义简化操作过程,比如针对某些常见用途可以直接使用预先命名好的常量代替原始编号作为输入参数传递给上述API接口[^3]。 #### 实际案例展示 下面给出一段简单的代码片段用来说明怎样为定时器A溢出中断赋予较高的响应紧急程度: ```c #include "tm4c123gh6pm.h" // 假定已经完成了必要的初始化工作... // 将Timer0A的抢占优先级设为最高(假设系统采用四位分组模式) IntPrioritySet(INT_TIMER0A, 0x7 << 5); while (1){ // 主循环体... } ``` 在此例子中,选择了将定时器A中断安排在一个非常靠前的位置以便快速得到CPU的关注和服务。当然,根据项目需求的不同,其他种类的异步信号也可能被给予更高的重视并相应地调整各自的权重关系。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值