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:故障 ISR 问题

Guru**** 2455360 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/639023/compiler-ek-tm4c123gxl-fault-isr-problem

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123GH6PM

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

大家好、我正在尝试学习 Tiva、 我想将 QTI 传感器与我的 tm4c123gxl 相连接、我对 c 语言很有期待。  

首先、我想知道我的代码是否合理? 如果它执行了为什么它在 Faultisr 函数中进入无限循环。 下面是代码。

提前感谢您。

#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "inc/tm4c123gh6m.h"
#include


void PORTB_Init (void){
SYSCTL_RCGCGPIO_R|=0x01;//为端口 b 启用时钟
while (((SYSCTL_PRGPIO_R&0x01)=0){};//准备好??
GPIO_PORTB_CR_R |=0x20;//允许更改端口 B5 0010 0000
GPIO_PORTB_DEN_R |=0x20;//在 PB5上启用数字 I/O

int main (空)

易失性 uint32_t 数据;
while (1){

GPIO_PORTB_DIR_R |=0x20;//PB5输出
GPIO_PORTB_DATA_R |=0x20;//将 Pb5设为高电平
SysCtlDelay (1000000);
GPIO_PORTB_DIR_R &=~0x20;//PB5输入

SysCtlDelay (1000000);
GPIO_PORTB_DATA_R=数据;


SysCtlDelay (50);


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

    您的"在 C 语言中生锈"、然后拒绝供应商严格的 API 以支持要求更严格的"直接寄存器操作(DRM)"的组合对您来说"不是太好"。

    这是您的第一个帖子、因此您不知道该供应商"声称不愿意在 DRM 或 ASM (汇编)代码分析中参与海报"。   (这是时间,所需的努力大大增加,而效益却很少(非常少)。)   ((赦免)"头脑"中的大多数人都采用了超级高效(省时、省力) API)

    请注意、我们的"非供应商/临时帮助者"同样更喜欢在(专家)有效完成(非常)的"详细寄存器位描述"后、不花这么多时间/精力扫描、并且使用供应商的综合 API 有效封装。   API 是"经试用、真实、无目的证明"的-对于"个人 DRM 或 ASM 努力"(始终且永远可疑)、这种说法是"永远不会说"的-因此、"这有什么意义?"

    您编写的"QTI"传感器可能是"QEI"(四路编码器接口)。   (这种"失去焦点"通常是"深入/分散注意力地深入到 DRM/ASM 代码中"的结果。)   (不要问-我怎么知道...)

    由于您的代码很短-您是否可以设置"断点"并确定-然后报告-哪些代码行、"驱动到可怕的"故障 ISR"?   我自己(及其他人)对您的第一个"同时"形式并不感到兴奋。

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

    您好 Raza、欢迎来到 TM4C 微控制器论坛。

    首先 、让我说、当 CB1建议使用 TivaWare API 而不是直接写入寄存器时、我完全同意(非常感谢他的帮助)。 在这个论坛上、您会发现来自 CB1等长期志愿者的很好的建议。

    第二个建议是、请单击"插入代码、附加文件等..." 将代码插入您的帖子时。 然后使用 按钮来粘贴您的代码。 这样它就保留了格式、使读取更加容易。 它将如下所示:

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "inc/tm4c123gh6a.h"
    #include 
    
    
    void PORTB_Init (void){
    SYSCTL_RCGCGPIO_R|=0x01;//为端口 b 启用时钟
    while (((SYSCTL_PRGPIO_R&0x01)=0){};//准备好??
    GPIO_PORTB_CR_R |=0x20;//允许更改端口 B5 0010 0000
    GPIO_PORTB_DEN_R |=0x20;//在 PB5上启用数字 I/O
    
    }
    
    
    
    int main (void)
    {
    易失性 uint32_t 数据;
    while (1){
    
    GPIO_PORTB_DIR_R |=0x20;//PB5输出
    GPIO_PORTB_DATA_R |=0x20;//将 Pb5设为高电平
    SysCtlDelay (1000000);
    GPIO_PORTB_DIR_R &=~0x20;//PB5输入
    
    SysCtlDelay (1000000);
    GPIO_PORTB_DATA_R=数据;
    
    
    SysCtlDelay (50);
    
    }
    
    
    }
    

    最后、我注意到您编写了函数来初始化 GIO 端口 B、但从未调用过它。 因此、在 main 中、您尝试在不启用该外设时钟的情况下写入端口 B 寄存器。 这会导致数据中止、从而进入无限循环。

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

    [引用 user="Bob Crosby"]我注意到您编写了用于初始化 GIO 端口 B 的函数,但从未调用过它

    我的天啊,Bob——这是一个很不习惯的人!    注意-只有(和可悲的)我可以抛弃的防御是:"通过 DRM 分心"。   (DRM 提供-并且"持续"提供...)

    我注意到海报启用了 Port_B 的时钟-但(完全)错过了他的 main()“未能调用该初始化”这一事实。   (在这么好的(和赞赏的)词语之后进行强化...)

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

    Raza、

    如果您按照 CB1的建议使用 API、您的代码将如下所示:

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "inc/tm4c123gh6a.h"
    #include 
    
    
    void PORTB_Init (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))
    {
    }
    }
    
    
    
    int main (void)
    {
    易失性 uint32_t 数据;
    
    PORTB_Init();
    while (1)
    {
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);//PB5输出
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、GPIO_PIN_5);//将 Pb5设为高电平
    SysCtlDelay (1000000);
    GPIOPinTypeGPIOInput (GPIO_PORTB_BASE、GPIO_PIN_5);//PB5输入
    SysCtlDelay (1000000);
    数据= GPIOPinRead (GPIO_PORTB_BASE、GPIO_PIN_5);
    SysCtlDelay (50);
    }
    }
    

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

    同样、Bob 是"超越和超越"的人、他是最优秀的人。   (请注意、"不要使用 DRM "更常见-并将该帖子保留在此...)   此外、您(更多)使用初始"while"的正确格式。

    现在-请注意、海报的目的是"在输出和输入之间切换相同的引脚"。    和-根据外部信号的阻抗(作为海报的 MCU 的"输入"引入)-"可能会产生输出争用!"    必须确保在 MCU 尝试输出时、"外部信号"(如果阻抗足够低)不会到达!   (这可能会对 MCU 或外部器件造成损坏、有时甚至会对二者造成损坏!) (笑声) (笑声) (即烟雾++;)

    我是否可以建议海报-在此早期阶段-采用不同的引脚进行(两者)输出和输入测试。

    在(相对而言)海报针对 A 的罕见情况下、"单线"外部器件-根据定义-"低(因此造成损坏)阻抗"被防止...

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

    感谢您的全面回答、是的、我知道使用 API 的效率要高得多。 但是、我想了解从低级编程开始的硬件架构。 我知道这会分散注意力、因此错过了在 main 中调用函数的操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bob yes 成为此论坛的新员工、我必须学习附加文件。 我知道 API 的使用更高效、更简单、但我想了解低级编程、因此尝试使用 DRM、但错过了在 main 中调用的时钟初始化拟制。 我必须承认,这是非常愚蠢的。
    再次感谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您-但通常有人声称()通过"低级编程"是硬件架构"可以理解"。

    长期使用(取得一定成功)这些/类似的 MCU -它证明(始终)不清楚(也不令人信服)为什么以及如何-"如此深入的寄存器位审查"-提供(更多)对硬件的见解!   众所周知、这些 MCU 提供多个32位宽的寄存器-但(同样)对多个寄存器及其关键位的"过于苛刻"审查如何提供"对硬件架构的深入了解?"   您或其他人是否能这样做是值得怀疑的!   (我在这里从未见过任何人-甚至尝试!)

    另外请注意、使用 API -"速度、简化和增强"您对硬件的控制、这确实"增强"了理解。    使用 DRM -由于需要通过各种寄存器组合"详细信息"(其中没有定义/描述硬件-而是单独的"架构")、您和我都"错过了"初始化调用"。   Bob -从"DRM 拒绝"(我提供)中解放出来、证明能够更好地"吸收代码错误"。   同样、这种强迫"分心"(由 DRM 引起)的理解很少、而是导致许多人"来到这里寻求帮助"。

    没有任何东西会阻止用户检查 API 的源代码-该源代码不仅详细介绍了寄存器及其关键位、还提供了最佳的"寄存器使用顺序-和位设置-这可能会使用户更好地了解硬件关系...    并且在 DRM/ASM 中明显不存在!

    虽然(许多)像您所说的那样、"低层次促进硬件理解"-但这里没有任何理由支持这种说法!  通常的结果是"撞车/烧坏"、而不是"理解"、这在某种程度上与任何"高度理解!"的主张背道而驰!

    认真(研究过)地审阅 MCU 手册-从此处的文档以及许多论坛帖子和示例中都可以看到、"了解硬件架构..."的方法可能要好得多。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我将介绍您在了解硬件架构时建议的路线。 感谢您说服使用 API。 谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果"了解硬件架构"仍然非常重要- MCU 手册中的每个外设部分-对"块图解"信号元素和流程进行了相当广泛的研究-事实证明、"描述硬件"(门、触发器、计数器等)更好

    在理想情况下-您可以"单步执行"您的设备-在手册中打开临时页面-并在某种程度上可视化和/或实现硬件流和执行...