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.

[参考译文] EK-TM4C123GXL:在下降沿的 SW4 (GPIO 引脚 PF4)上设置中断

Guru**** 2030840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1323690/ek-tm4c123gxl-setting-up-interrupt-on-sw4-gpio-pin-pf4-on-falling-edge

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123GH6PM

我正在尝试在 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)您代码的逻辑。