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-TM4C1294XL:如何正确使用 UART5中断?

Guru**** 2481935 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/704313/ek-tm4c1294xl-how-to-use-uart5-interruptions-properly

器件型号:EK-TM4C1294XL

大家好、我正在尝试将 UART5接收中断与 tm4c1294xl launchpad 板一起使用、但由于 ISR 未被调用、我的代码是 bellow、因此我遇到了问题

#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"



#include "driverlib/uart.h"(nidrupt_unchemp32*)/uidt/uidt_unchemp32*(nvoid




/*启用外设*/
SysCtlPeripheralEnable (SYSCTL_Periph_UART5);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);

/*设置引脚*/
GPIOPinConfigure (GPIO_PC6_U5RX);
GPIOPinConfigure (GPIO_PC7_U5TX);
GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_6 | GPIO_PIN_7);

/*UART 配置*/
UARTConfigSetExpClk (UART5_BASE、SYSTEM_CLOCK、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

/*启用 UART 中断*/
IntEnable (INT_UART5);
UARTIntEnable (UART5_BASE、(UART_INT_RX | UART_INT_RT);
/*注册 UART ISR*/
IntRegister (INT_UART5、pfnHandler);

}

/*用于 uart5接收或接收超时中断的 ISR */
void UARTIntHandler (void)
{
uint32_t ui32Status;

//
//获取中断状态。
//
ui32Status = UARTIntStatus (UART5_BASE、TRUE);

//
//清除已发出的中断。
//
UARTIntClear (UART5_BASE、ui32Status);

//
//在接收 FIFO 中有字符时循环。
//
while (UARTCharsAvail (UART5_BASE))
{
//
//从 UART 读取下一个字符并将其写回 UART。
//
UARTCharPutNonBlocking (UART5_BASE、UARTCharGetNonBlocking (UART5_BASE));

//
//闪烁 LED 以显示字符传输正在发生。
//
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);

//
//延迟1毫秒。 每个 SysCtlDelay 大约为3个时钟。
//
SysCtlDelay (g_ui32SysClock /(1000 * 3));

//
//关闭 LED
//
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
}
}


int main (void){

/*将时钟设置为以120MHz 运行*/
G_ui32SysClock= SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
/*Start string*/
uint8_t * cThisChar ="正在启动...";

/*仅用于验证的板载 LED */
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);

/*启用处理器中断*/
IntMasterEnable();

/*串行配置*/
init_serial (g_ui32SysClock、UARTIntHandler);
/*发送初始字符串*/
while (* cThisChar!='\0'){
UARTCharPutNonBlocking (UART5_BASE、* cThisChar++);
}

while (1){
/*等待中断*/
}
/*无错误*/
返回0;
}

代码没有错误、但当我向电路板发送某个数据时、不会触发接收中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在代码中没有看到问题。 (但使用 main 中的函数 UARTCharPutNonBlocking ()进行观察。 如果字符串的长度超过 FIFO 深度的16个字符、则某些字符串将不会输出。 调用 UARTCharPUT()可以避免该问题。)

    您是否从传输的"正在启动..."字符中获得了这些字符? 您是否检查了硬件接口以确保接收字符到达 PC6引脚?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bob Crosby"]如果字符串长于 FIFO 的深度(16个字符),则不会输出某些字符串。

    Bob -这是"接收到的字符丢失"-超出初始16 (FIFO 大小)-在这里已多次报告。   我相信您的回答是第一 个"确认并确认"这种行为。  (好极了!)

    您会注意到'UARTCharPut ()'避免了这种限制-但它的'blocking'(所有{至少大多数}个其他)程序流-可能是不可接受的。    因此,“任何事情”都可以完成(也许是为了正确快速地“卸载 FIFO”),以便可以使用“非阻塞”功能,接收超过这16个字符的字符串?   (即不强制源发送器将其数据包限制在16字节或更少)  请注意、"其他" ARM MCU 已实现此目的。  (>16字符功能-不会阻止程序流-在接收和发送期间...)

    一如既往的好——谢谢你的时间和关注……

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

    [引用 user="Jamelly Ferreira"]/*注册 UART ISR*/ IntRegister (INT_UART5、pfnHandler);

    然后执行以下操作:

    [引用 user="Jamelly Ferreira"]/* uart5接收或接收超时中断 ISR */空 UARTIntHandler (void)

    请注意,突出显示中的2个“函数名称”... 不匹配!    这是明智的-和/或正确的吗?

    Fire/I 不使用"注册中断"-而是在项目的"启动文件"中指定并适当地放置中断。    然后"确保"-中断名称(完全相同)出现在我们的代码中。

    我还注意到、"没有提到"物理连接-这种连接将 UART5的 TX 引脚连接到 UART5的 RX 引脚。   减去那个连接- UART 5的 RX 中断(一旦正确命名/匹配)应该如何记录 UART5的 TX 传输?    (假设这是您的预期...)

    我还想指出的是、(我们使用的大多数) ARM MCU UART 要求其 UART RX 引脚"上拉"(通过简单的电阻器或线路驱动器 IC)、以便 UART 的 RX 接收器具有 "已知/有效逻辑电平"- 始终-不允许浮动!    (未提及您对 UART5 RX 引脚的处理。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Bob。 首先,感谢您提供有关 UARTCharPutNonBlocking 的建议,我通过使用阻止版本 UARTCharPut 解决了这一问题。 是的、我在 PC6引脚中收到字符、我使用示波器检查了字符、所有字符看起来都是正确的、但仍然没有触发中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="CB1_MOBILE"]

    Jamelly Ferreira
    /*注册 UART ISR*/ IntRegister (INT_UART5、pfnHandler);

    然后执行以下操作:

    Jamelly Ferreira
    /*uart5接收或接收超时中断的 ISR */空 UARTIntHandler (void)

    请注意,突出显示中的2个“函数名称”... 不匹配!    这是明智的-和/或正确的吗?

    [/报价]

    第一段代码是 init_serial 函数的声明+结构的一部分,此函数接收两个参数:一个 uint32_t 和一个函数指针。

    第二个是函数的声明+结构、我将传递给 main 函数中的 init_serial。 因此、函数名称在 C 语言方面的差异是可以接受的

    [引用 USER="CB1_MOBILE"]

    我还注意到、"没有提到"物理连接-这种连接将 UART5的 TX 引脚连接到 UART5的 RX 引脚。   减去那个连接- UART 5的 RX 中断(一旦正确命名/匹配)应该如何记录 UART5的 TX 传输?    (假设这是您的预期...)

    我还想指出的是、(我们使用的大多数) ARM MCU UART 要求其 UART RX 引脚"上拉"(通过简单的电阻器或线路驱动器 IC)、以便 UART 的 RX 接收器具有 "已知/有效逻辑电平"- 始终-不允许浮动!    (未提及您对 UART5 RX 引脚的处理。)

    [/报价]

    我没有提到我希望如何获得接收 FIFO 中的字符(我对此感到非常抱歉)。 我使用 USB 转串行转换器从运行 python 代码的 PC 发送字符、而且我不打算链接其 RX 线的 MCU 的 TX 线('starting..." 字符串只是为了知道 MCU 是否正确发送字符)。 关于 RX 引脚中的电阻器、如果我使用 USB 转串行适配器、是否有必要?


    [引用 USER="CB1_MOBILE"]

    Fire/I 不使用"注册中断"-而是在项目的"启动文件"中指定并适当地放置中断。    然后"确保"-中断名称(完全相同)出现在我们的代码中。

    [/报价]

    我不知道如何使用项目启动文件、因为我始终通过代码(如在计时器中)注册中断。 您能否解释(或发送一些链接)如何使用此文件?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道如何使用项目启动文件、因为我始终通过代码(如在计时器中)注册中断。 您能否解释(或发送一些链接)如何使用此文件?

    是的,是的,但必须等到今天下午晚些时候。 感谢您对(其他)问题的解释。

    'USB <-> TTL/CMOS 转换器通常会产生该'逻辑高电平、空闲信号'。 当然、您可以轻松测量并确认! (这种衡量标准——总是流行、“希望/祈祷”。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Jamelly Ferreira">我没有提到我希望如何获得接收 FIFO 中的字符(对此我真的很抱歉)。 我使用 USB 转串行转换器从运行 python 代码的 PC 发送字符、而且我不打算链接其 RX 线的 MCU 的 TX 线('starting..." 字符串只是为了知道 MCU 是否正确发送字符)。 关于 RX 引脚中的电阻器、如果我使用 USB 转串行适配器、是否有必要?[/quot]

    我通常使用 USB 转串行电缆来生成 RS232电平信号。 您确定在 PC6上具有3.3V 电平信号吗? 空闲或高电平状态应为3V、低电平状态、例如 START 位应接近于接地。

    https://www.sparkfun.com/tutorials/215

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

    发送给 Bob & Originating 海报、

     虽然我们发现 USB <-> TTL/CMOS 更加普遍、但 USB 转 UART 适配器和电缆都有(两种)类型。   (随着世界的发展、从 RS232向 USB 发展、这一趋势已变得相当远。)   一如既往的好 在将任何内容连接到 MCU 之前、请务必进行测量!

    现在到我们的海报-这里是启动文件的关键部分(这在 IAR 的 IDE 下)、但该方法几乎与您的(单个供应商版本)相同

    首先-所有 ISR 必须进行分组和标识-如此处所示。

    // 应用程序使用的中断处理程序的外部声明。

    //

    extern void IntDefaultHandler (void);

    extern void ADC0IntHandler (void);      // 正常 PGM 操作。

    extern void ADC0SS0Handler (void);    // Blinky_basicon.c 测试

    extern void GPIOBIntHandler (void);   // 霍尔感应

    extern void CANIntHandler (void);

    extern void FaultISR (void);

    extern void NmiSR (void);

    extern void PWM0IntHandler (void);    // PWM 发生器

    // extern void MainWaveformTick (void);

    extern void MainMillisecondTick (void); //多函数

    // extern void QEIIntHandler (void);

    extern void SysTickIntHandler (void);  // Switch、SPD Pot   

    // extern void WTimer0AIntHandler (void);  //集成 SAT (4秒)

    extern void WTimer5BIntHandler (void);  //失速检测(2秒)

    extern void Timer1BIntHandler (void);  // Tak 500US

    extern void Timer3AIntHandler (void);  //程序时基

    extern void WatchdogIntHandler (void);

    //

    然后-在下面、在启动文件中仍然存在:

    //矢量表。  请注意、必须将适当的构造放置在到上

    //确保它最终位于物理地址0x0000.0000。

    //

    //

    __root const uVectorEntry __vector_table[]@".intvec"=

      {.ulPtr =(无符号长整型) pulStack + sizeof (pulStack)}、

                          //初始堆栈指针

      ResetISR、                //重置处理程序

      NmiSR、                  // NMI 处理程序

      FaultISR、                //硬故障处理程序

      IntDefaultHandler、            // MPU 故障处理程序

      IntDefaultHandler、            //总线故障处理程序

      IntDefaultHandler、            //用法故障处理程序

     。

     。

    IntDefaultHandler、            // I2C0主机和从机

      IntDefaultHandler、            // PWM 故障 ***

      PWM0IntHandler、             // PWM 发生器0    请注意此 ISR 的名称与使用的名称(上面)是如何匹配的

      IntDefaultHandler、            // PWM 发生器1

      MainMillisecondTick、           // PWM 发生器2   -名称匹配

      IntDefaultHandler、            //正交编码器0

      ADC0IntHandler、             // ADC 序列0      这是第3个匹配项

      IntDefaultHandler、            // ADC 序列1

      IntDefaultHandler、            // ADC 序列2.

      IntDefaultHandler、            // ADC 序列3.

      WatchdogIntHandler、           //看门狗计时器

    *********

    现在、这些完全相同的 ISR 名称在我们的代码中进行部署(在该启动文件之外)。   重要的是、在您的程序代码中存在三个名称匹配项- 2 (正如我在这里详述的-包含在启动中)和第三个名称匹配项。

    好的、现在呢?   我们发现、与(更麻烦/容易出错的"中断注册")相比、"通过启动文件嵌入更可靠-更易于测试/调试。"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我分别使用3.3V 和0V 作为高电平和低电平
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    称赞 CB1。 干得不错。 谢谢你。 (#类似)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jamelly、

    既然 CB1已经完成了硬部分并缩小了问题范围、如果您有兴趣的话、在驱动程序库用户指南的第17.1节中有一个关于使用静态或动态中断注册的说明。 与 CB1类似,我更喜欢使用静态中断注册,因为它的效率略高。 我怀疑动态注册对您不起作用的原因是链接器命令文件。 (如果您有兴趣、我们可以进行猜测。) 我正在尝试重新创建您的问题、但使用了我自己的链接器命令文件。 我不能弄清楚它。 CB1为我节省了很多精力。 本论坛有一些最适合帮助其他成员的成员。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    同样感谢 Bob、尤其是为了让您的"核清晰度"、感谢 Bob 处理2个(或更多)缓冲区-当 µDMA 被"释放"并且(接近)同时管理和处理 ADC 值时...

    我们发现 FTDI 提供的不是将客户用户发送到"parkfuny"(我们认为是在练习"高评分")、而是"以更具竞争力的成本完成基于 USB 的产品线。 (作为 FTDI -是真正的来源...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bob Crosby"]CB1为我节省了大量精力。 本论坛有一些最适合帮助其他成员的成员。[/引述]

    如果我(小)的心脏-将"直至"(至少某种程度上)、我会注意到、"检查#2是"在邮件中"。    不是一个,而是两个非常善良,体贴的“认知”——在同一天——在几个小时内!   (失败的编码器海报-诱使另一个论坛用户-非常友好地撰写。)  

    感谢 Bob、感谢您这么好的评论、很高兴您发现"基于启动文件- ISR 管理-有用"的快速摘要。   (实际上-这是我们使用的唯一格式-一些关键客户(需求)!)  

    在同一天必须"接受两张支票"-可能会花费我(计划中)的公海冒险-当我们在航行下离开'DR'*(国王码头)时...  (这是一座保护良好的港口、由美国陆军工程团提供!)

    * MDR =洛杉矶 Marina del Rey (美丽的游艇港口和海滨社区。   海港被一英里长的保护、经过精心设计的"海墙"-将"台风"减少到仅一英尺...