Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Tiva C中按下开关时LED闪烁_C_Arm_Embedded_Microcontroller - Fatal编程技术网

在Tiva C中按下开关时LED闪烁

在Tiva C中按下开关时LED闪烁,c,arm,embedded,microcontroller,C,Arm,Embedded,Microcontroller,我试图使PF0和PF4指示灯在按下开关时闪烁。但它根本不会打开任何LED 有人告诉我需要使用两个端口,我不明白为什么,因为这只能用一个端口来完成——在本例中是端口D——但有人建议我也使用端口K(?。 该板是一个Tiva C #包括 #包括 #包括“inc/hw_memmap.h” #包括“driverlib/debug.h” #包括“driverlib/gpio.h” #包括“driverlib/sysctl.h” #包括 uint32_t SW1、SW2// 内部主(空){ 而(1){ SYS

我试图使PF0和PF4指示灯在按下开关时闪烁。但它根本不会打开任何LED

有人告诉我需要使用两个端口,我不明白为什么,因为这只能用一个端口来完成——在本例中是端口D——但有人建议我也使用端口K(?。
该板是一个Tiva C

#包括
#包括
#包括“inc/hw_memmap.h”
#包括“driverlib/debug.h”
#包括“driverlib/gpio.h”
#包括“driverlib/sysctl.h”
#包括
uint32_t SW1、SW2//
内部主(空){
而(1){
SYSCTL\u RCGCGPIO\u R=0X1100;//启用端口D
GPIO\u PORTD\u DIR\u R=0X03;//启用GPIO引脚PN0,
GPIO_端口d_DEN_R=0X03;
GPIO_PORTK_AHB_DIR_R=0;
GPIO\u PORTK\u AHB\u DEN\u R=0X03;
GPIO\U PORTK\U AHB\U PUR\U R=0X01;
SW1=GPIO\u PORTD\u DATA\u R&0x10;//将PF4读入SW1
SW2=GPIO\u PORTD\u DATA\u R&0x01;//将PF0读入SW2
如果(!SW1&&!SW2){//同时按下
GPIO端口数据=0x04;
}否则,如果按下(!SW1){//SW1
GPIO端口数据=0x02;
}否则,如果按下(!SW2){//SW2
GPIO端口数据=0x08;
}否则{//
GPIO端口数据=0x00;
}
}
}
  • 您仅启用了D0和D1,但似乎正在使用D0、D1、D2、D3和D4
  • 您已将D0和D1设置为输出,但似乎正在使用D1、D2、D3作为输出
  • 您已将D0设置为输出,但尝试将其作为输入读取
  • 如果您不使用PORTK,那么它的配置是完全不相关的
  • RCGCGPIO为您根本不使用的端口N和端口J启用时钟
我对该部件不熟悉,仅简要阅读了数据表,但如果输入/输出代码本身正确,则端口时钟、方向和数字启用配置应如下所示

SYSCTL_RCGCGPIO_R = 0x0008; // Enable port D clock
GPIO_PORTD_DIR_R = 0x0E;    // D4, D0 input, D1 to D3 output.
GPIO_PORTD_DEN_R = 0x1F;    // Enable D0 to D4  
这些初始化设置只需执行一次-在循环之前,而不是在循环内部


经过思考:

大概是复制粘贴的代码中的注释表明,该板可能是一个。在这种情况下,LED被称为D1、D2、D3、D4(D表示二极管,而不是端口D),但分别位于GPIOs PN1、PN0、PF4和PF0上,开关位于PJ0和PJ1上

在这种情况下,也许以下方面会更成功:

int main(void) 
{
    SYSCTL_RCGCGPIO_R |= (1<<5 | 1<<8 | 1<<12); // Enable port F, J and N clocks
    GPIO_PORTN_DIR_R |= 0x03;   // PN1 = LED0, PN0 = LED1 (Outputs)
    GPIO_PORTN_DEN_R |= 0x03;   // Enable PN0 and PN1  
    GPIO_PORTF_DIR_R |= 0x11;   // PF4 = LED3, PF0 = LED4 (Outputs)
    GPIO_PORTF_DEN_R |= 0x11;   // Enable PF0 and PF4  

    GPIO_PORTJ_DIR_R &= ~0x03;   // PJ0 = SW1, PJ1 = SW2 (Inputs)
    GPIO_PORTJ_DEN_R &= ~0x03;   // Enable PJ0 and PJ4  

    for(;;)
    {
        uint32_t SW1 = GPIO_PORTJ_DATA_R & 0x01;  // read PJ0 into SW1
        uint32_t SW2 = GPIO_PORTJ_DATA_R & 0x02;  // read PJ1 into SW2

        if (!SW1 && !SW2)  // both pressed
        {
            GPIO_PORTF_DATA_R = 0x01;  // LED4
        } 
        else if (!SW1)     // SW1 pressed
        { 
            GPIO_PORTF_DATA_R = 0x10;  // LED3
        } 
        else if (!SW2)     // SW2 pressed
        {
            GPIO_PORTN_DATA_R = 0x01;  // LED2
        } 
        else               // neither 
        { 
            GPIO_PORTN_DATA_R = 0x02;  // LED1
        }
    }
}
int main(无效)
{

SYSCTL_RCGCGPIO|u R|=(1在
main()
中没有循环。函数结束时会发生什么?在设备通电时,您是否按住开关?您告诉了我们MCU,但没有告诉我们电路板。共享电路板示意图的链接,以便我们可以看到LED和开关是如何连接到MCU的。不是“PF4”平均端口F引脚4?为什么要使用端口D?PF4是您在问题中所述的LED,还是您在代码中所述的交换机?请不要只添加随机代码:无需不断重新初始化车载设备。您在哪里“闪烁LED”?在我看来像是代码。I/O初始化与所使用的I/O没有任何关系。@riccs_0x:您没有领会WV的意思。您发布的代码应该是您正在运行的代码,它显示了问题。原始的“假代码”与实际代码具有过渡性相似性的代码是无用的-它会完全显示您描述的症状-即,什么都没有发生,因此有理由假设这是您的问题,并且有人可能会合理地发布一个这样的答案-浪费他们的时间,花更长的时间让您获得答案。您能告诉我吗请问,如何知道启用端口和dir和den函数的值,我总是去基本地址并在末尾添加偏移量,但似乎没有这样做way@riccs_0x:这本身可能值得提出一个新问题,但对于嵌入式系统开发来说,这是非常基本的。您所说的“[…]是什么意思也不清楚基本地址并在末尾添加偏移量”。例如,对于DIR,值0x0E是二进制00001110-将位1、2和3设置为1(输出)。所需信息来自数据表。@riccs\u 0x:鉴于您的问题模棱两可,我开始后悔试图回答这个问题。正如您所看到的,我不得不做出太多的猜测和假设(以及太多的工作)。通过清楚地描述你正在使用的硬件来解决你的问题,我可以整理这个答案。我很抱歉你后悔这个答案,但对我来说,它比我的课有用得多,因为老师什么都不解释,我也不得不做很多猜测,我知道。但这是非常好的信息,我认为不仅仅是对我。
int main(void) 
{
    SYSCTL_RCGCGPIO_R = 0x0008; // Enable port D
    GPIO_PORTD_DIR_R = 0x0E;    // D4, D0 input, D1 to D3 output.
    GPIO_PORTD_DEN_R = 0x1F;    // Enable D0 to D4  

    for(;;)
    {
        uint32_t SW1 = GPIO_PORTD_DATA_R & 0x10;  // read PD4 into SW1
        uint32_t SW2 = GPIO_PORTD_DATA_R & 0x01;  // read PD0 into SW2

        if (!SW1 && !SW2)  // both pressed
        {
            GPIO_PORTD_DATA_R = 0x04;
        } 
        else if (!SW1)     // SW1 pressed
        { 
            GPIO_PORTD_DATA_R = 0x02;
        } 
        else if (!SW2)     // SW2 pressed
        {
            GPIO_PORTD_DATA_R = 0x08;
        } 
        else               // neither 
        { 
            GPIO_PORTD_DATA_R = 0x00;
        }
    }
}
int main(void) 
{
    SYSCTL_RCGCGPIO_R |= (1<<5 | 1<<8 | 1<<12); // Enable port F, J and N clocks
    GPIO_PORTN_DIR_R |= 0x03;   // PN1 = LED0, PN0 = LED1 (Outputs)
    GPIO_PORTN_DEN_R |= 0x03;   // Enable PN0 and PN1  
    GPIO_PORTF_DIR_R |= 0x11;   // PF4 = LED3, PF0 = LED4 (Outputs)
    GPIO_PORTF_DEN_R |= 0x11;   // Enable PF0 and PF4  

    GPIO_PORTJ_DIR_R &= ~0x03;   // PJ0 = SW1, PJ1 = SW2 (Inputs)
    GPIO_PORTJ_DEN_R &= ~0x03;   // Enable PJ0 and PJ4  

    for(;;)
    {
        uint32_t SW1 = GPIO_PORTJ_DATA_R & 0x01;  // read PJ0 into SW1
        uint32_t SW2 = GPIO_PORTJ_DATA_R & 0x02;  // read PJ1 into SW2

        if (!SW1 && !SW2)  // both pressed
        {
            GPIO_PORTF_DATA_R = 0x01;  // LED4
        } 
        else if (!SW1)     // SW1 pressed
        { 
            GPIO_PORTF_DATA_R = 0x10;  // LED3
        } 
        else if (!SW2)     // SW2 pressed
        {
            GPIO_PORTN_DATA_R = 0x01;  // LED2
        } 
        else               // neither 
        { 
            GPIO_PORTN_DATA_R = 0x02;  // LED1
        }
    }
}