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.

[参考译文] CCS/TM4C123GH6PM:Tiva 库+ TM4C123GXL launchboard+带有重新定义的 timer.c 的 CCS 错误

Guru**** 2457760 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/647682/ccs-tm4c123gh6pm-tiva-library-tm4c123gxl-launchboard-ccs-error-with-redefined-timer-c

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

大家好。

很抱歉我的英语不好。

我尝试在 HD44780上使用 LCD、当我完成程序时、我无法进行编译。

我不知道是什么问题。 请提供帮助。 所有库都在工作。 并且没有包含错误。

#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/debug.h"
#include "driverlib/pwm.h"
#include "driverlib/pin_map.h"
#include "inc/hw_gpio.h"
#include "driverlib/rom.h"
#include "driverlib/timer.h"
#include "driverlib/timer.c"

   int Timer1 (int i);
   int LCDINIT (int *timer);
   void LCDWIRE (int RS、int RW、int D7、int d6、int D5、int D4);


int main (空)

   SysCtlClockSet (SYSCTL_SYSDIV_1_SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);//задали внешний кварц 16мгц и делитель 1.
   SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//задали делитель частоты для шим

   SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);//включили таймер。
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//включили порт PA
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//включили порт PB

   IntMasterDisable();//Запрещаем процессору реагировать на прерывания,чтобы он не уходил в подпрограмму прерывания。

   GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//настроили ножки порта PA2-7 на вывод
   GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4);

   TimerConfigure (Timer1_base、TIMER_CFG_PERIODICRACRACASE);//включаем таймер в режим полной ширины μ s
   TimerLoadSet (Timer1_base、timer_A、160);//задаем период таймера 10мкс
   IntEnable (INT_TIMER1A);//разрешили прерывания по таймеру 1。
   TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);//разрешаем прерывание по переполнению таймера 1 (А т μ к。используем бит таймер μ s)
   TimerEnable (Timer1_base、timer_A);//включаем таймер

   Timer1 (1);инициализировали програмный таймер μ s

   int 计时器;
   while (1)
   {
       定时器=定时器1 (2);
       LCDINIT (&timer);
       如果(LCDINIT=1)
       {
           LCDWIRE (1、0、0、1、0);
           SysCtlDelay (100);
           LCDWIRE (1、0、0、1、0);
       }


   }


   int Timer1 (int I)//таймер считает по 10мкс
   {
       static int long t;
       开关(I)
       {
       案例1:
       {
           T=0;
           中断;
       }
       案例2:
       {
       if (TimerIntStatus (Timer1_base、timer_TINA_TIMEOUT))//Проверяем флаг переполнения таймера
       {
           T+=1;
           TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);//сбрасываем флаг прерывания
           return (t);
       }
       }
       }
   }
   空 LCDWIRE (int RS、int RW、int D7、int d6、int D5、int D4)
   {
       if (rw==1)
            GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0x1);//rw=1
           其他
               GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0x0);//RW=0
       如果(RS==1)
            GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_2、0x1);//RS=1
           其他
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_2、0x0);//RS=0
       if (D7=1)
           GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、GPIO_PIN_7);//данные D7
           其他
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、0x0);//данные D7
       if (d6=1)
           GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、GPIO_PIN_6);//данные d6
           其他
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x0);//данные d6
       if (D5=1)
           GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_5、GPIO_PIN_5);//данные D5
           其他
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_5、0x0);//данные D5
       if (D4=1)
           GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_4、GPIO_PIN_4);//данные D4
           其他
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_4、0x0);//данные D4
       GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0x1);//E=1 строб
       SysCtlDelay (50);
       GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0x0);//E=1 строб
   }
   INT LCDINIT (int *定时器)
   {
       static int sw;

       开关(SW)
       {
       情况0:
       {
           if (*timer>4000)//задержка 40мс
           {
               SW=1;
               *timer=0;
           }
           中断;
       }
       判例1://инициализация таймера 情形1 -
       {
           LCDWIRE (0、0、0、1、1);
           SW=2;
           *timer=0;
           中断;
       }
       案例2:
       {
           if (*timer>410)//задержка 4.1мс
           {
               LCDWIRE (0、0、0、1、1);
               SW=3;
               *timer=0;
           }
           中断;
       }
       案例3:
       {
           if (*timer>=10)//задержка 100мкс
           {
               LCDWIRE (0、0、0、1、1);
               SW=4;
               *timer=0;
           }
           中断;
       }
       案例4:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、1、0);
               SW=5;
               *timer=0;
          }
          中断;
       }
       情况5:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、1、0);
               SW=6;
               *timer=0;
          }
          中断;
       }
       案例6:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、1、0、0);
               SW=7;
               *timer=0;
          }
          中断;
       }
       案例7:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、0、0);
               SW=8;
               *timer=0;
          }
          中断;
       }
       案例8:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、1、0、0);
               SW=9;
               *timer=0;
          }
          中断;
       }
       案例9:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、0、0);
               SW=10;
               *timer=0;
          }
          中断;
       }
       案例10:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、0、0、1);
               SW=11;
               *timer=0;
          }
          中断;
       }
       案例11:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、0、0);
               SW=12;
               *timer=0;
          }
          中断;
       }
       情况12:
       {
           if (*timer>=1)//задержка 10мкс
          {
               LCDWIRE (0、0、0、1、1、0);
               SW=13;
               *timer=0;
          }
          中断;
       }
       案例13:
       {
           退货(1);
       }
   }
   }

感谢你的帮助。

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

    您好!

     您的意思是无法编译? 编译期间收到的错误消息是什么?

     我尝试编译您的代码、下面是我得到的结果。

    如果我单击"OK"、程序最终将为我编译。 我不确定我遇到的错误是否与您的错误相同。 您能否删除评论中的这些非英文字符并重试?

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

    你好!!

    我尝试删除所有注释。 无更改。

    这里是我的错误。

    我不知道为什么链接有问题、因为最后一个带有计时器和 PWM 的项目可以正常工作。

    我认为 driverlib/timer.c 有问题,但不知道有什么解决方案。

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

    [引用用户="Alexander Zharichev"]#include "driverlib/timer.h"
    #include "driverlib/timer.c"

    虽然这可能是正确的、但不太可能。

    您通常不会在自己的源代码中包含库的源代码。 我只见过那些写得不好的库(和很多年前)和某种"C"编译器*所做的事情。

    Robert

    *通过突破语言提高效率

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

    海报 Robert 很好地识别了.c 文件的"不正确"包含-从不好!   (甚至不在 Z 世界白天...)

    除此之外、您提供的 LCD 代码就在附近-如果不是-(原谅)"我见过的最差的!"    

    对 "设置 GPIO 引脚"有一种非常"混合"的理解、似乎"对执行"完整端口写入!"    这将极大地简化和减少代码的批量。

    下面是关键详细信息: "设置 GPIO 引脚:"

    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0x1);// RW=1 这将失败!
               其他
                   GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0x0);//RW=0
           如果(RS==1)
                GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_2、0x1);// RS=1 这将失败!
               其他
                   GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_2、0x0);//RS=0

     不能通过使用"正常"0x1!"来设置任何 GPIO 引脚(但对于 GPIO_PIN_0)    我在这里只展示了2个相关示例-但它会 在您的代码中发生。   在每种情况下(以上)、RS 和 RW 都将保持为"0!"

    然而、几行之后、您(或代码编写器)会神奇地"理解并纠正" 这个"设置一个单独的 GPIO 引脚"任务。    (这是如何实现的?)

    GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、GPIO_PIN_7);//данные D7  这将设置位7
               其他
                   GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、0x0);//данные D7
           if (d6=1)
               GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、GPIO_PIN_6);//данные d6  这将设置位6
               其他
                   GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x0);//данные d6

    值得注意的是、您采用的是" 4位 LCD 代码/操作"、这对于初学者甚至专家来说都是不推荐的、这证明它容易受到噪声突发的影响、这可能会"关闭半字节序列"、从而(仅限于)产生乱码的 LCD 屏幕。   这是以4个 GPIO 为代价支付的巨大价格-太大-我/其他人会说!

    使用 MCU 的计时器-仅创建几个延迟-看起来是"超时"、如果此类延迟(太短)出错、LCD 将无法运行!   Kiss 指导您按照 HD44780的要求使用简单得多的"SysCtlDelay()"函数-对其进行唯一设置。    (论坛搜索将显示我已将规范的这一方面放在"此处"-为其他人的方便...)

    此类屏幕的初始化非常重要-所提供的代码"不太可能满足 HD44780的要求"-而任何/所有"将会"的"帮助者"则"将大脑"(实际上是13步"切换")...