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.
我正在尝试在 SW1上设置外部中断来对按钮按压次数进行计数(取决于计数器是否等于0或7)、递增计数器变量并打开 LED 组合、 但是按下按钮似乎没有任何效果-将计数器设置为1将打开绿色 LED、但不会再出现按下按钮多少次的情况
尽管我在参加我的课程时使用了不同的头文件、但我已经仔细检查了寄存器、应该与数据表中写入的内容匹配、所以有人知道我的代码可能有什么问题吗?
代码:
#包含
#include "tm4c123gh6p.h"
#if 0
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#包含
#include "clib.h"
#endif
INT 计数器= 0、状态= 0、MODE = 0;
void init_registers(){
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF;//从数据表中:"当置位时、表示 GPIO 端口 F 存在"
int Lowertising_time = SYSCTL_RCGC2_R;
SYSCTL_RCGCGPIO_R |= 0x20;//从数据表(当第5位设置为1时):"在运行模式下启用 GPIO 端口 F 并提供时钟"
GPIO_PORTF_DIR_R |= 0x0E;// LED 作为输出;E = 1110 ->第一位(红色)、第二位(蓝色)和第三位(绿色)
GPIO_PORTF_DEN_R |= 0x1E;// DEN =数字使能、此处启用 GPIO 引脚 PF1 - PF4
GPIO_PORTF_PUR_R |= 0x10;//为开关、PF4启用上拉电阻
//表10-4对中断寄存器有一个很好的概述
GPIO_PORTF_IS_R &=~(0x10);//启用开关的中断感应,PF4;默认情况下它检测边沿(上升/下降),但通过设置该位,它会检测电平(高/低)
GPIO_PORTF_IBE_R &=~(0x10);//默认情况下清除,仅包括在此处,说明如果没有为引脚清除该位,则忽略在下面配置寄存器的操作
//可以在上升/下降沿(高/低电平)产生中断
GPIO_PORTF_IEV_R &=~(0x10);//在下降沿/开关的低电平上中断(认为最初应该是上升电平、但这始终触发中断)
GPIO_PORTF_IM_R |= 0x10;//设置该位会允许中断"在组合中断信号上发送到中断控制器"(来自数据表)
GPIO_PORTF_ICR_R |= 0x10;//清除引脚 PF4上的任何先前中断
//查看数据表中的表2-9以了解中断表,您可以看到 PORTF 的中断号是30
NVIC_PRI7_R |=(3 << 21);//数据表中的 PDF 第151页;将中断优先级设置为3
NVIC_en0_R |=(1 << 30);//将00000...1 (共30位)向左移动30次、将第30位设置为启用 PORTF 中断
}
void delay_timer(){
}
void counter_check(){
如果(计数器=0){
GPIO_PORTF_DATA_R = 0x00;
}
否则为(COUNTER ==1){
GPIO_PORTF_DATA_R = 0x08;
}
否则、如果(counter == 2){
GPIO_PORTF_DATA_R = 0x04;
}
否则、如果(COUNTER =3){
GPIO_PORTF_DATA_R = 0x0C;
}
否则、如果(COUNTER =4){
GPIO_PORTF_DATA_R = 0x02;
}
否则、如果(COUNTER =5){
GPIO_PORTF_DATA_R = 0x0A;
}
否则、如果(COUNTER =6){
GPIO_PORTF_DATA_R = 0x06;
}
否则、如果(COUNTER =7){
GPIO_PORTF_DATA_R = 0x0E;
}
}
int main (void){
init_registers();
while (1){
if (mode ==1){
delay_timer();
}
counter_check();
}
返回0;
}
void GPIOF_Handler (void){
if (state ==0){
++计数器;
}
否则、如果(state ==1){
--计数器;
}
如果(计数器>= 7 &&状态=0){
状态= 1;
}
否则为(COUNTER ==0 && state == 1){
状态= 0;
}
GPIO_PORTF_ICR_R |= 0x10;
}
头文件: https://ufile.io/5dy40ac1 (认为在此处粘贴所需的空间过大)
1) 1)将计数器、状态和模式声明为"volatile"、因此编译器不会删除对它们的引用。
2) 2)在 ISR (GPIOF_Handler)中设置断点、以查看是否到达那里。 这将有助于区分(a)硬件设置和(b)您代码的逻辑。