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)
- 功能:配置引脚为输出模式
- 参数:
- uint32_t ui32Port :GPIO口的基地址
- uint8_t ui8Pins:引脚(例如GPIO_PIN_1)
void GPIOPinWrite(uint32_t ui32Port, uint8_t ui8Pins, uint8_t ui8Val)
- 功能:写值到指定引脚.
- 参数:
- uint32_t ui32Port:GPIO口的基地制作.
- uint8_t ui8Pins: 引脚,每一位对应不同的引脚,各个引脚对应的二进制位如下,值为1表示这一位对应的引脚用于输出
- uint8_t ui8Val: 每一个二进制位的值就是该二进制位对应引脚的输出值,1表示高电平,0表示低电平
1.3配置外部中断
(1)void GPIOIntTypeSet(uint32_t ui32Port, uint8_t ui8Pins,uint32_t ui32IntType)
- 功能:设置指定引脚的中断触发类型.
- 参数:
(1)ui32Port: GPIO口的基地址
(2)ui8Pins: 每个比特位表示一个引脚
(3)ui32IntType: 中断触发的类型
(2)void GPIOIntRegister(uint32_t ui32Port, void (*pfnIntHandler)(void))
- 功能:注册GPIO外部中断的中断服务函数
- 参数:
(1)ui32Port :GPIO口的基地址
(2)pfnIntHandler: 是指向中断服务函数入口地址的指针。中断服务函数可以自行定义
(3)void GPIOIntEnable(uint32_t ui32Port, uint32_t ui32IntFlags)
- 功能:使能指定GPIO中断源的中断。
- 参数:
(1)ui32Port :GPIO口的基地址。
(2)ui32IntFlags: 中断源中断屏蔽位
(4)void IntEnable(uint32_t ui32Interrupt)
- 功能:在中断控制器中使能一个中断
- 参数:
(1)ui32Interrupt 指定的中断
(5)bool IntMasterEnable(void)
- 功能:使能处理器中断,即允许处理器响应某个中断.
- 参数:无
(7)void GPIOIntClear(uint32_t ui32Port, uint32_t ui32IntFlags)
- 功能:清除指定中断源的中断标志位
- 参数:
(1)ui32Port :GPIO口的基地址
(2)ui32IntFlags :被清除的中断源中断屏蔽位 - 注意:发生中断后,对应的中断标志位置1,进入中断服务函数,在服务函数中务必清除中断标志。配置中断后最好也调用一次该函数
(8)void IntPrioritySet(uint32_t ui32Interrupt,uint8_t ui8Priority)
- 功能:设置中断的优先级
- 参数:
(1)ui32Interrupt 指定的中断
(2)ui8Priority :中断优先级,最低为0xE0,最高为0x00
(9)uint32_t GPIOIntStatus(uint32_t ui32Port, bool bMasked)
- 功能:读取指定GPIO口的中断状态
- 参数:
(1)ui32Port: GPIO口的基地址.
(2)bMasked: 一个布尔变量,用于指定返回值屏蔽的中断状态或原始的中断状态 - 在中断服务函数中会用到
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