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

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.csdn.net/download/SStegosaurus/12738499

TM4C123G是TI公司的一款Cortex-M4内核的微控制器,其中断控制器模块是NVIC(Nested Vectored Interrupt Controller)。在TM4C123G中,通过设置NVIC的寄存器来配置中断。 以下是配置中断的大致步骤: 1. 确定要配置的中断号。在TM4C123G中,每个中断都有一个唯一的中断号。 2. 使能中断。在NVIC中,所有中断都可以通过一个总使能位(PRIMASK)来控制。要使能某个中断,需要将该中断对应的位设置为1。 3. 配置中断优先级。在NVIC中,每个中断都有一个优先级,优先级高的中断会先被处理。可以通过设置中断优先级寄存器(NVIC_PRIx)来配置中断的优先级。 4. 配置中断处理函数。在中断发生时,NVIC会自动跳转到中断处理函数。需要编写相应的中断处理函数来处理中断。 下面是一个简单的示例代码,用于配置GPIO Port A的中断: ```c // 定义中断处理函数 void GPIOA_Handler(void) { // TODO: 处理中断 } int main(void) { // 使能GPIO Port A的时钟 SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R0; // 配置PA0为输入模式 GPIO_PORTA_DIR_R &= ~(1 << 0); // 使能PA0上拉电阻 GPIO_PORTA_PUR_R |= (1 << 0); // 配置PA0的中断触发方式为下降沿触发 GPIO_PORTA_IS_R &= ~(1 << 0); GPIO_PORTA_IBE_R &= ~(1 << 0); GPIO_PORTA_IEV_R &= ~(1 << 0); GPIO_PORTA_IEV_R |= (1 << 0); // 使能PA0的中断 NVIC_EN0_R |= NVIC_EN0_INT0; // 配置PA0的中断优先级为最高优先级 NVIC_PRI0_R |= NVIC_PRI0_INT0_M; // 设置中断处理函数 NVIC_SetVector(GPIOA_IRQn, (uint32_t)GPIOA_Handler); while(1) { // TODO: 主循环 } return 0; } ``` 需要注意的是,以上代码仅为示例代码,实际使用时还需要根据具体的需求进行修改。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值