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:当代码在 Keil μ μVision 上运行时、LED 每0.5秒闪烁一次、但它在 CCS 上运行、LED 每1秒闪烁一次

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601586/ccs-tm4c123gh6pm-when-code-run-on-keil-vision-led-blink-every-0-5-sec-but-it-run-on-ccs-led-blink-every-1-sec

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

我仍然不熟悉 CCS v7。  

我正在从 Keil μ μVision 迁移。 我正在测试我在 Keil 上编写的代码。 该代码应使 TM4C 板载 LED 每0.5秒闪烁一次 但是、当我使用 CCS 运行该代码时、TM4C 会每1秒闪烁一次  

我的优化设置为--opt_levl:Off、Speed:5

我不知道该设置是否有任何关系。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们如何从这一信息片段中获得任何想法? 实际上、从这个描述中我没有理由期望任何特定行为。

    我是否可以建议显示该代码?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*每隔0.5秒闪烁一次板载 LED 的代码*/ 


    #include "pll.h" #define GPIO_PORTF2 (*(volatile unsigned long *) 0x40025010) )#define GPIO_PORTF_DIR_R (*(volatile unsigned long *) 0x40025400) #define GPIO_PORTF_AFSEL_R (*(volatile unsigned long *) 0x40025420) #define GPIO_PORTF_DEN_R (*(volatile unsigned long *) 0x4002551C) #define GPIO_PORTF_AMSEL_R (*(volatile unsigned long *) 0x40025528) #define GPIO_PORTF_PCTL_R (*(volatile unsigned long *) 0x4002552C) #define SYSCTL_RCGC2_R (*(volatile unsigned long *) 0x400FE108) #define SYSCTL_RCGC2_GPIOF 0x00000020 //端口 F 时钟门控控制 //实验6中的 Delay100ms 函数 void Delay100ms (unsigned long time){ unsigned long I; while (time > 0){ I = 1333333;//该数字表示100ms while (i > 0){ i = i - 1; } 时间=时间- 1;//每100ms 递减 一次} int main (void){volatile unsigned long delay; pll_Init(); sysctl_RCGC2_R |= sysctl_RCGC2_GPIOF;//激活端口 F delay = SYSCtl_RCGC2_R; //允许时钟稳定 GPIO_PORTF_DIR_R 的时间|= 0x04;//使 PF2输出(PF2内置 LED) GPIO_PORTF_AFSEL_R &=~0x04;//常规端口功能 GPIO_PORTF_DEN_R |= 0x04;//在 PF2上启用数字 I/O //将 PF4配置为 GPIO GPIO_PORTF_PCTL_R =(GPIO_PORTF_PCTL_R&0xFFF0FFFF)+0x00000000; GPIO_PORTF_AMSEL_R = 0; //禁用 PF 上的模拟功能 while (1){ GPIO_PORTF2 = 0x04; //打开 LED1 (蓝色) Delay100ms (5); 在80MHz 时、//延迟~0.5秒 GPIO_PORTF2 = 0x00; //关闭 LED1 (蓝色) Delay100ms (5); //在80 MHz 时延迟~0.5秒 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PLL_Init()是一个将时钟设置为80MHz 的 void 函数
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 Keil 上使用了该代码、LED 亮起0.5秒、熄灭0.5秒;
    但是、当该代码在 CCS 上运行时、LED 指示灯亮起1.0秒、熄灭1.0秒
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Tom Lia"]

    //实验6中的 Delay100ms 函数
    
    void Delay100ms (unsigned long time){
    
    unsigned long i;
    
    while (time > 0){
    
    I = 1333333;//该数字表示100ms
    
    while (i > 0){
    
    i = i - 1;
    
    }
    
    时间=时间- 1;//每100ms 递减
    
    一次}
    
    
    

    [/报价]

    好的、这取决于编译器。 它至少取决于编译器、编译器版本、优化级别、时钟频率和缓存行为。 编译器可以很自由地在任何优先级完全消除此函数、而真正优秀的编译器可以做到这一点。

    "正确"处理此问题的方法是以下方法之一

    1. 基于内核的延迟功能
    2. 硬件定时器
    3. 具有硬件输出的 H/W 计时器
    4. 以 ASM 编写的固定延迟函数
    5. 使用易失性的 C 固定延迟函数。

    #1是任何类型的 RTK/RTOS 的首选、甚至是某些非 RTOS 设置的首选。 #2工作正常、但不会扩展到大量计时器。 #3最适合非常严格的计时。 4号酒店真的是最后的选择,应该避免。

    实际上、4号和5号需要大量的理由才能使用。 它们可用于快速且脏污的物品(即证明您是否具有时序依赖性)、否则、您几乎肯定应该使用前三项中的一项。 前三个通常仅取决于时钟。 1通常基于与2相同的原则。 优点是工作已经完成。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Robert。 您能为#3提供任何参考吗? 我可以在用户指南中找到它吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、在计时器部分。 此外、在 TivaWare 手册的计时器部分中、您将需要在任何情况下查看该手册。

    Robert