This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在将共阴极七段显示屏与 Tiva C 系列 TM4C123GXL Tiva Launch Pad 连接、以在显示屏上显示中断优先级编号。 按下开关 SW2 (GPIO PF_0)时、它将指示按下1和 SW1 (GPIO_PF_4)、它将指示每个按钮持续5秒。 当没有中断显示时、将指示0。 在本任务中、我使用 GPIO 端口 C 和 D 将七段显示器与 Launchpad 连接。 下面给出了引脚连接。
(PC4 = A、PC5 = B、PC6 = C、PC7 = D、PD0 = E、PD1 = F、PD=G)
我已经为此编写了一些代码行。 此代码将在微控制器上生成中断、但会执行尾更改任务。 我必须在此操作中分配优先级。 当我按下 SW1时、它将立即显示2当我按下 SW1时、显示屏将数字从2更改为1。 完成1后、它将继续显示2并完成5秒显示。
我必须分配此类优先级,但无法使用 IntPrioritySet 设置此优先级。 是否有其他方法可以在 GPIO 端口引脚上设置优先级?
谢谢你
我编写了该代码以更改尾端。
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
void switch_interrupt (void);
int main (空)
{
SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF))
{}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD))
{}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOC))
{}
GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
GPIOIntRegister (GPIO_PORTF_BASE、SWITCH_INTERRUPT);
HWREG (GPIO_PORTF_BASE + 0x520u)= 0x4C4F434BU;
HWREG (GPIO_PORTF_BASE + 0x524u)= 0xFFu;
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4));
GPIOPadConfigSet (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4)、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet (GPIO_PORTF_BASE、(GPIO_PIN_0 | GPIO_PIN_4)、GPIO_FALLING_EDGE);
IntEnable (INT_GPIOF);
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_PIN_0|GPIO_PIN_4);
IntMasterEnable();
while (1)
{
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7、0XF0);/0
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2、0x03);
SysCtlDelay (6666666);
}
}
void switch_interrupt ()
{
uint32_t interrupt_status;
INTERRUPT_STATUS = GPIOIntStatus (GPIO_PORTF_BASE、1U);
if (interrupt_status =GPIO_PIN_0)
{
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7、0x60);//1.
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2、0);
SysCtlDelay (6666666);
}
否则、如果(INTERRUPT_STATUS = GPIO_PIN_4)
{
GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7、0XB0);/2
GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2、0x05);
SysCtlDelay (6666666);
}
GPIOIntClear (GPIO_PORTF_BASE、INTERRUPT_STATUS);
}
每个 GPIO 端口只有一个中断请求。 由于两个开关都使用端口 F、因此不能使用 NVIC (嵌套矢量中断控制器)在它们之间进行优先级排序。 这需要由您的软件来完成。
虽然有不同的实现方式、但我会使用软件状态机。 我将使用 GPIO 端口 F 中断和系统计时器中断。 假设您设置了系统计时器、以每10ms 生成一次中断。 您可以定义三种状态(使用枚举是一个好主意)、STATE 0、STATE1和 STATE 2。 应在函数外部使用 volatile 关键字声明保存状态的变量、以便可以在主函数中或通过中断例程进行修改。 将状态变量初始化为"state0"。 在10ms 系统定时器中断例程中、如果处于状态0、则从7段显示中发送"0"。 当您获得 GPIO 端口 F 中断时、检查按下哪个开关。 如果处于状态0、如果按下 SW2、则更改为状态1、并设置类似"STATE1_COUNT = 500"的变量。 (同样、变量的声明与状态变量 volatile 类似、不在函数作用域中。) 现在、在系统定时器中断中、它将看到您处于 STATE1、它应该向显示屏输出"1"并递减"STATE1_COUNT"。 当"STATE1_COUNT"减至零时、应将状态变量改回"state0"。 (您现在已显示"1" 5秒(500 x 10ms)。
现在、在 GPIO 端口 F 中断例程中、如果您处于状态0或 STATE1、并且按下 SW1、请将状态变量更改为状态2并设置"state2_count = 500"。 在系统计时器中断中、它将看到您处于状态2、它应向显示屏输出"2"并递减"state2_count"。 当"state2_count"减至零时、它应检查 STATE1_COUNT 变量。 如果 STATE1_COUNT 不为零、则将状态更改为 STATE1。 如果 STATE1_COUNT 变量为零、则更改为 STATE 0。 这使得 SW1的优先级高于 SW2、并在5秒显示的剩余时间内将显示返回到"1"。
如果您处于状态2、并且收到 GPIO 端口 F 中断、则可以忽略它。 当显示"2"时、不允许 SW2将状态改回 STATE1。
您可以使用此方法进行所有类型的调整、例如在开关再次按下时延长时间、同时又处于该状态。