【问题标题】:Not working Read a switch and write it to the LED on board EK-TM4C123GXL?不工作 读取开关并将其写入 EK-TM4C123GXL 板上的 LED?
【发布时间】:2021-12-30 00:41:19
【问题描述】:

TI Tiva Arm 板 EK-TM4C123GXL 无法运行以下程序。需要帮助调试, 其教科书程序,书籍链接:http://www.microdigitaled.com/ARM/TI_ARM_books.htm

/*  p2_7.c: Read a switch and write it to the LED */

/*  This program reads SW1 of Tiva LaunchPad and writes the inverse of the value to the green LED. SW1 is low when pressed (Normally High). LED is on when high. */


#include "TM4C123GH6PM.h"

int main(void)
{
    unsigned int value;
    SYSCTL->RCGCGPIO |= 0x20;   /* enable clock to GPIOF */
    GPIOF->DIR = 0x08;          /* set PORTF3 pin as output (LED) pin */
                                /* and PORTF4 as input, SW1 is on PORTF4 */
    GPIOF->DEN = 0x18;          /* set PORTF pins 4-3 as digital pins */
    GPIOF->PUR = 0x10;          /* enable pull up for pin 4 */

    while(1)
    {   
        value = GPIOF->DATA;    /* read data from PORTF */
        value = ~value;         /* switch is low active; LED is high active */
        value = value >> 1;     /* shift it right to display on green LED */
        GPIOF->DATA = value;    /* put it on the green LED */
    }
}

【问题讨论】:

  • IDE 版本:µVision V5.36.0.0 工具版本号: 工具链:MDK-Lite 版本:5.36.0.0 C 编译器:ArmClang.exe V6.16 汇编器:Armasm.exe V6.16 链接器/定位器:ArmLink.exe V6.16 库管理器:ArmAr.exe V6.16 十六进制转换器:FromElf.exe V6.16 CPU DLL:SARMCM3.DLL V5.36.0.0 对话框 DLL:TCM.DLL V1.53.0.0 目标DLL:lmidk-agdi.dll 对话框 DLL:TCM.DLL V1.53.0.0
  • 不要在 cmets 中添加与问题相关的信息 - 编辑问题。这是您声明特定程序无法运行的第二个问题。以前不是这样,我怀疑这里是真的。你怎么知道它没有运行?几乎可以肯定它正在运行,但没有达到您的预期。您是否在调试器中单步执行了代码?
  • 你的TM4C123GH6PM.h 头文件是从哪里来的?例如,结构成员 GPIOA_Type::DATA 应使用 __IO 限定符声明(或在最新的 CMSIS 标头 __IOM 中)。反过来,这些宏应该在core_cm4.h 中定义为volatile。这应该确保代码有效 - 我承认被这个代码难住了。你声明valuevolatile 有效吗?不过应该没必要。请注意,在任何情况下,优化这样的琐碎代码几乎没有用处,并且在使用符号调试器时,优化的代码很少有意义。
  • 那个头文件,来自 Keil 运行时环境设置
  • 您有付费许可证还是演示版?这可能是 Keil/ARM 技术支持的问题:keil.com/support/contact.asp 请注意,Keil 是 ARM 的子公司,因此您将获得最好的专业知识。

标签: c embedded texas-instruments


【解决方案1】:

【讨论】:

  • 它也适用于相同的编译器版本 v6,通过将优化标志设置为 -o0
  • 硬件寄存器很可能没有声明为 volatile,因此编译器正在优化 I/O。
  • 这也是您对最后一个问题的解决方案 - 它仍然是一个非常糟糕的解决方案。基于 LLVM 的 ARM v6 编译器优于 ARMCC v5。编译器不是你的问题。
  • @stark :这是有道理的,但假设使用标准 CMSIS 标头(并且符号名称和成员名称表明),所有成员都应使用 __IOM__IM 声明或__OM 限定符,在core_m4.h 中定义为volatile。也没有解释为什么 ARMCC v5 工作 - 它是相同的标题。
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 2013-05-29
  • 2018-08-09
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多