大家好、我花了很多时间来处理下面的代码、我一生都不能弄清楚奇怪的行为。 最初、此代码是我一直在处理的较大项目的一部分、但后来为了确定发生的情况、将代码剥离为基本内容(您在下面看到的内容)、问题仍然存在。
正如您在下面看到的、我已经将引脚 B0-Thru B7配置为通用数字输出、并将引脚 D0-Thru D3配置为通用数字输入。 D0至 D3引脚设置为触发中断。 我将这些连接到试验板上的一些典型按钮、以便在按下按钮时触发中断。
现在、所发生的情况是、每次写入 GPIO_PORTB_DATA_R 时都会莫名触发中断。 如果我注释掉对 GPIO_PORTB_DATA_R 的写入操作、则仅当我按试验板上的按钮时才会触发端口 D 中断(正如它应该的那样)。
此外、如果我更改 main 中的 while 环路、将单个值写入 GPIO_PORTB_DATA_R、它将触发一次中断(写入该初始值时)、然后再也不会 agin 以用于后续写入(始终具有相同的值)。 因此、它似乎仅在更新端口 B 数据中的值时触发端口 D 中断。
我不知道为什么会发生这种情况。 我已经按照数据表(第10.3节)中的 GPIO 配置步骤进行了操作、正如您将在 InitPortB 和 InitPortD 函数中的注释中看到的那样。
任何人可能有的想法都非常受欢迎、因为我对为什么会发生这种情况几乎没有任何想法。
#include
#include "inc/tm4c123ghp6.h"
void InitPortB()
{
//步骤1:启用端口 D 的时钟
SYSCTL_RCGCGPIO_R |= 0x02;
//步骤2:设置方向(输出)
GPIO_PORTB_DIR_= 0xFF;
//步骤3:将引脚配置为 GPIOAFSEL -跳过、因为默认情况下引脚为 GPIO
//步骤4:跳过,我不关心驱动强度
//步骤5:跳过,不使用上拉、下拉或开漏功能
//步骤6:将配置为数字
GPIO_PORTB_DEN_R |= 0xFF;
//步骤7:跳过、不使用这些引脚的中断
//步骤8:解锁端口/引脚以允许写入
GPIO_PORTB_LOCK_R = 0x4C4F434B;
GPIO_PORTB_CR_R = 0xFF;
}
空 InitPortD()
{
//步骤1:启用端口 D 的时钟
SYSCTL_RCGCGPIO_R |= 0x08;
//步骤2:设置方向(输入)
GPIO_PORTD_DIR_R &=~0x0F;
//步骤3:将引脚配置为 GPIOAFSEL -跳过、因为默认情况下引脚为 GPIO
//步骤4:跳过,我不关心驱动强度
//步骤5:跳过,不使用上拉、下拉或开漏功能
//步骤6:将配置为数字
GPIO_PORTD_DEN_R |= 0x0F;
//步骤7a:在配置中断时禁用中断
GPIO_PORTD_IM_R &=~0x0F;
//步骤7b:配置 GPIOIS 寄存器中的 IS 域和 GPIOIBE 寄存器中的 IBE 域
GPIO_PORTD_Y_R &=~0x0F;//为边沿检测配置中断
GPIO_PORTD_IBE_R &=~0x0F;//中断生成由 GPIOIEV 控制
GPIO_PORTD_IEV_R |= 0x0F;//检测上升沿上的中断
//步骤7c:清除 GPIORIS 寄存器
GPIO_PORTD_RIS_R &=~0x0F;
//步骤7d:通过设置 GPIOIM 寄存器中的 IME 字段来取消屏蔽端口
GPIO_PORTD_IM_R |= 0x0F;
//步骤8:跳过、不写入引脚、因此不关心锁定
//启用端口 D 中断
NVIC_EN0_R |=(1<<3);
}
void PortDInterruptHandler()
{
GPIO_PORTD_ICR_R |= 0xFF;//清除中断
}
int main (void)
{
InitPortB();
InitPortD();
uint32_t 计数器= 0;
while (1)
{
if (计数器% 2 = 0)
{
GPIO_PORTB_DATA_R = 99;
}
其他
{
GPIO_PORTB_DATA_R = 0;
}
++计数器;
}
}