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.
您好
我遇到了一些中断问题。
使用以下代码、不会触发我的中断函数。
(按钮被拉至高电平、按下时应变为0、这通过示波器进行确认)
如果我更改所有内容以进行轮询(在 while 循环中读取引脚)、我可以看到正确的值。
我怀疑我的代码有问题。
("print"函数是在我们的代码中有效使用多次且运行正常的函数)
void setup_rst() { GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_INT_PIN_5); GPIOIntClear(GPIO_PORTC_BASE, GPIO_INT_PIN_5); GPIOIntRegisterPin(GPIO_PORTC_BASE, GPIO_INT_PIN_5, rst_btn_pressed); GPIOIntTypeSet(GPIO_PORTC_BASE, GPIO_INT_PIN_5, GPIO_FALLING_EDGE); GPIOIntEnable(GPIO_PORTC_BASE, GPIO_PIN_5); } void rst_btn_pressed() { print((uint8_t *) "rst pressed\r\n"); }
您好!
我想您遗漏了 IntEnable (INT_GPIOC)和 GPIOPadConfigSet ()。 你需要在 NVIC 级别为 PortC 启用中断,这是我在 setup_rst()中看不到的。 缺少 GPIOPadConfigSet()语句时也是如此。 请参阅以下示例代码、以使用 PP0和 PP1生成中断。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
while (! SysCtlPeripheralReady (SYSCTL_Periph_GPIOP)
{
}
GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1);
GPIOPadConfigSet (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_Strength_4mA、GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_FALLING_EDGE);
GPIOIntRegisterPin (GPIO_PORTP_BASE、GPIO_PIN_0、UserButton1ISR);
GPIOIntRegisterPin (GPIO_PORTP_BASE、GPIO_PIN_1、UserButton2ISR);
GPIOIntEnable (GPIO_PORTP_BASE、GPIO_INT_PIN_0 | GPIO_INT_PIN_1);
IntEnable (INT_GPIOP0);
IntEnable (INT_GPIOP1);
IntMasterEnable();
您好,Charles
添加 IntEnable(INT_GPIOC),
控制器后、只要按下按钮、控制器就会崩溃。
该外设之前启用过。
真的需要 padconfig 吗?
您好!
你可以在 rst_btn_pressed 的开头放置一个断点吗? 如果处理器在 ISR 中暂停、则可以确认您之前的问题是由于 未在 NVIC 级别启用中断所致。 至于崩溃、我认为它可能与 printf 语句有关。 通常、printf 需要大量堆栈和堆。 我们通常不建议使用 printf,而是使用 UARTPrintf()。 如果你真的想使用 printf、增加堆和堆栈。 您需要 使 GPIOPadConfigSet 启用内部上拉、除非您有外部上拉电阻就位。 有时、您的外部电路可能在 MCU 之后已经初始化。 发生这种情况时、GPIO 输入是悬空的、您不需要错误触发。 通常、我将具有 GPIOPadConfigSet。
#define APP_BASE 0x00000000
#define RAM_BASE 0x20000000
/*系统内存映射*/
内存
{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
FLASH (RX): origin = APP_BASE , length = 0x00040000
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000、length = 0x00008000
}
/*内存中的段分配*/
部分
{
.intvecs:> app_base
.text :>闪存
.const :>闪存
cinit :>闪存
请输入您的密码:> FLASH
init_array:> FLASH
.vtable:> RAM_BASE
.data :> SRAM
bss :> SRAM
.sysmem:> SRAM
.stack:> SRAM
}
__STACK_TOP =_STACK + 2048 ;
您好,Charles
谢谢你的解释:)
有一个到3V3的外部上拉(10K)、所以应该没问题。
在函数开始处设置断点不会触发。
我遵循了您的意见、并删除了打印声明。
现在应该设置 int ,这样我就可以用断点看到它:)
我找到了解决方案。
GPIOIntRegisterPin()
不会执行它应该执行的操作。
我 GPIOIntRegister()
现在使用更常规的结构来注册中断。