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:我的代码为什么会获得 FaultIsr()

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/945692/compiler-ek-tm4c123gxl-why-does-my-code-get-a-faultisr

器件型号:EK-TM4C123GXL

工具/软件:TI C/C++编译器

下面的代码将点亮红色 LED 并等待10秒。 当我在 code composer 上运行此函数时,它会打开红色 LED 并进入 FaultIsr()中的无限循环;

//定时 C/asm 混合示例
// Jason Losh

//---------------
//硬件目标
///-------------------------------------------------------

//目标平台:EK-TM4C123GXL 评估板
//目标统一通信: TM4C123GH6PM
//系统时钟:40MHz

//硬件配置:
//红色 LED:
// PF1驱动一个为红色 LED 供电的 NPN 晶体管

/../../-----------
//器件包括、定义和汇编器指令
//-----------------

#include 
#include 
#include "tm4c123ghp6.h"

//位带别名
#define RED_LED (*(volatile uint32_t *)(0x42000000 +(0x400253FC-0x40000000)*32 + 1*4))//

端口 F 掩码
#define RED_LED_MASK 2

//-----------
//子例程
///-------------------------------------------------------

//初始化硬件
void initHw()
{
//将 HW 配置为与16MHz XTAL 配合使用,启用 PLL,sysdivider 5,创建40MHz 的系统时钟
SYSCTL_RCC_R = SYSCTL_RCC_XTAL_16MHz | SYSCTL_RCC_OSCSRC_MAIN | SYSCTL_RCC_USESYSDIV |(4 << SYSCTL_RCC_SYSDIV_S);

//将 GPIO 端口设置为使用 APB (由于默认配置不需要,为了清晰起见)
SYSCTL_GPIOHBCTL_R = 0;

//启用时钟
SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R5;
_delay_cycles (3);

//配置 LED 引脚
GPIO_PORTF_DIR_R |= RED_LED_MASK;//使位成为输出
GPIO_PORTF_DR2R_= RED_LED_MASK;//将驱动强度设置为2mA (由于默认配置不需要-为了清晰起见)
GPIO_PORTF_DEN_R |= RED_LED_MASK;//启用 LED
}

//近似忙等待(以微秒为单位),给定40MHz 系统时钟
空 wait10Second ()
{
//2以上时钟


_asm (".const");
_asm ("time .field 99999999999999");//10000微秒、即10秒
_asm ("prep: LDR R0、时间");//2个时钟用于此频率
_asm ("loop: ");
_asm (" Sub R0、#1");//N times
_asm (" CBZ R0、完成");//(n-1)+ 3
_asm (" b loop");//(n-1)*2
_asm ("完成: BX lr ");

//2以下时钟
}//------------------


//主要
///--------------------------------------------------------------------------------------------------

int main (void)
{
//初始化硬件
inithw();

//每秒切换红色 LED
while (true)
{
RED_LED ^= 1;
wait10Second ();
}
}

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

    第60行实际上太大了、因此我修改了代码以增加时间复杂性并更改了 N。如下所示:

    void wait10Seconds ()
    {
    //2以上时钟
    
    
    _asm (".const");
    _asm ("time .field 4444444444");
    _asm ("prep: LDR R1、时间");//此频率的时钟
    _asm ("loop: SUB R1、#1");//N 次
    _asm (" CBZ R1、DONE ");//(n-1)+ 3
    _asm (" NOP");
    _asm (" NOP");
    _asm (" NOP");
    _asm (" NOP");
    _asm (" NOP");
    _asm (" b loop");//(n-1)*2
    _asm ("完成: ");
    
    //2以下时钟
    }