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.

[参考译文] RTOS/TM4C123GH6PM:TI-RTOS 上的 CANIntHandler ()

Guru**** 2478485 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/681258/rtos-tm4c123gh6pm-caninthandler-on-ti-rtos

器件型号:TM4C123GH6PM

工具/软件:TI-RTOS

我一直在尝试在 TI-RTOS 上运行 CANIntHandler(),作为中断编号为55的硬件中断(Hwi)(从数据表55开始,为 CAN0分配)。 但中断状态最终显示错误。

我 已将 CAN_Rx()分配为任务。
请帮我处理该代码  

/* XDCtools 头文件*/
#include 
#include 
#include 

/* BIOS 头文件*/
#include 

/*板头文件*/
#include "Board.h"
#include 
#include 
#include 





















void "inc/hw_gpio.h"#include "void/hw_types.h"#include "inc/hw_ints.h"#include "inc/hw_memmap.h"#include "driverlib/sysctL.h"#include "driverlib/pin_map.h"#include "driverlib/volatile trl.h";包含"driverlib#driverlib/volature.h"#br/volature.eh"#include "driverlib#br/volatile/driveride"#br/trl.eh"#include #br/包含#b#b#br/volatile/r.eh"

void CANIntHandler (void);




void main (void)
{
hardware_init ();
BIOS_start();
}

void hardware_init (void)
{


//将时钟设置为直接从晶体运行。
SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);

//设置调试 UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、SysCtlClockGet ());

//设置 CAN0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinConfigure (GPIO_PE4_CAN0RX);
GPIOPinConfigure (GPIO_PE5_CAN0TX);
GPIOPinTypeCAN (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);
//CANIntRegister (CAN0_BASE、CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN0);
CANEnable (CAN0_BASE);

}
// CAN 中断处理
程序 void CANIntHandler (void){

无符号长整型状态= CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);//读取中断状态

if (status =CAN_INT_INTID_STATUS){//控制器状态中断
STATUS = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);
UARTprintf ("%l/"、status);//这在我的代码中显示了错误
错误标志= 1;
} 否则、如果(status ==1){// msg 对象1
CANIntClear (CAN0_BASE、1);//清除中断
rxFlag = 1;//设置 Rx 标志
错误标志= 0;//清除任何错误标志
} 否则{//永远不会发生
UARTprintf ("意外的 CAN 总线中断\n");
}
}

void CAN_Rx (void)
{
tCANMsgObject msg;// CAN msg 对象
// uint8_t msgData[8];
unsigned char msgData[8];//用于 Rx 消息数据的8字节缓冲区
unsigned int uIdx;
//使用 ID 和掩码0接收包含任何 CAN ID 的消息
MSG.ui32MsgID = 0;
MSG.ui32MsgIDMask = 0;
MSG.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
MSG.ui32MsgLen = 8;//最多允许8个字节

//将 msg 加载到 CAN 外设报文对象1中,以便它可以触发任何匹配的 Rx 报文上的中断
CANMessageSet (CAN0_BASE、1、&msg、MSG_OBJ_TYPE_RX);

while (1){

if (rxFlag){//发生 Rx 中断

MSG.pui8MsgData = msgData;//设置指向 Rx 缓冲区的指针
CANMessageGet (CAN0_BASE、1、&msg、0);//从 CAN 外设读取 CAN 消息对象1

rxFlag = 0;//清除 Rx 标志

if (msg.ui32Flags & MSG_obj_data_lost){//检查消息是否丢失
UARTprintf ("检测到 CAN 消息丢失\n");
}

UARTprintf ("Msg ID=0x%08X len=%u data=0x"、msg.ui32MsgID、msg.ui32MsgLen);
for (uIdx = 0;uIdx < msg.ui32MsgLen;uIdx++)
{
UARTprintf ("%d\"、msgData[uIdx]);
}
}

返回0;
}

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

    尊敬的先生,

    请告诉我们有关您的错误的更多信息?? 您到底会遇到什么错误??

    此致、

    Digvijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    我看不到 CAN 模块的 Hwi 线程结构。 我已在项目中添加(部分)以下代码。

    hwi_Params_init (&(paramsunion.hwiParams));
    paramsunion.hwiParams.arg =(UArg)句柄;

    hwi_construct(&(object->hwi)、hwAttrs->intNum、CANTiva_hwiIntFxn、
    &(Samsunion.hwiParams),NULL);

    另外、请浏览 UART 的驱动程序库、以更好地了解 Hwi 生成。

    此致、
    Digvijay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    感谢您的回复!
    我对 TI-RTOS 非常陌生。 我们刚刚浏览了 TI-RTOS 技术讲座文档,并通过 GUI 将 CANIntHandler 指定为 HWI。 我不知道将您发送的上述代码放入程序中。
    从第84行、它只打印了"错误"。
    如果您需要其他信息、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    我也是 TI-RTOS 的新手。 对于 CAN 模块、我修改了 UART 的驱动程序库、它适用于我。 由于你已经使用 GUI 构建了 Hwi、所以不需要添加我建议的代码。 但我有疑问的是,如何使用 GUI 将 CANIntHandler()函数分配给 CAN 中断?
    由于错误出现在 UARTprintf 函数中,因此业余的方法是从 CANIntHandler()中删除所有 UARTprintf 函数。 原因是我们无法从 Hwi 线程调用一些函数、如 create、str破坏 等。 如果这不能解决您的问题、您必须从专家处获得帮助。 我不能想到任何其他解决方案。

    此致、
    Digvijay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    CANIntHandler 应作为 ISR 函数放置、并且 CAN0的中断号为55 (对于 TM4C123GH6PM、请查看数据表)。
    但是、我的问题是使用 CAN_Rx 作为任务线程来解决的。
    谢谢你。
    此致、
    Nanda Kishore
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的先生,

    [引用 user="Nanda Kishore Moduga"]我 已将 CAN_Rx()分配为任务。

    在 您的第一个帖子 中,您说您已将 CAN_Rx()分配为任务。 所以我不认为这是问题。 实际上,我要问的是,在 GUI 中将处理程序函数 CANIntHandler()放置在哪里?

    此致、

    Digvijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    在 Hwi 中创建一个实例(请参阅 TI-RTOS 实验课程手册)、并询问句柄名称、ISR 函数和中断号
    句柄名称= CAN_xx (您的愿望)
    ISR 函数= CANIntHandler
    中断编号= 55 (请查看数据表)
    此致、
    Nanda Kishore
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nanda、您好!

    您能否在读取中断状态后立即放置一个断点?  接收到的值是多少?  此外、您能否将*。cfg 文件附加到此帖子。

    此致、

    伊曼纽尔

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

    e2e.ti.com/.../7416.empty.cfgHiEmmanuel、

     接收到的值为32768。 请在附件中找到*。cfg 文件。

    您能帮我解决其他问题吗?上述代码位于 Rx 函数上、运行良好、但当我将 Tx 函数添加到 RTOS 时、Rx 将接收消息(仅接收到消息 ID、未接收到数据)  由相同的 Tx 代码发送、但在从其他器件发送 CAN 消息时、Rx 功能未接收到任何消息。

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

    Nanda、

    很抱歉、这是由于裂缝而脱落。 这仍然是个问题吗?

    Todd

    [更新:将此标记为 TI 认为已解决、因为海报不活动。 如果仍有问题、请发布回复。]