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.

[参考译文] TMS320F28388D:CM 内核、SYSBIOS、Hwi 和 UART0有问题

Guru**** 2928980 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1022466/tms320f28388d-trouble-with-cm-core-sysbios-hwi-and-uart0

器件型号:TMS320F28388D
Thread 中讨论的其他器件:SYSBIOS

你(们)好

我正在尝试使用 SYSBIOS Hwi 使连接管理器内核的 UART0接收器中断正常工作。    以下是我正在使用的工具版本:

CCS 版本10_4_0_00006

xdcTools 版本3_55_02_00

BIOS 版本6_76_01_12

网络服务版本2_60_01_06

此时、RTOS 正在运行、NDK 软件正在 CM ARM 内核上运行。 我可以连接到网络并发送和接收 TCP 消息。  现在、我想使用 CM UART。  我能够从 CM 的 UART0发送数据、如果我轮询接收状态寄存器、则可以接收数据。  但是、我一直无法使用 Hwi 模块触发 Rx 中断。  以下是 配置文件的相关部分:

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
var ti_sysbios_family_arm_m3/hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');

///---------------------- 这里的其他东西----------------------------------------------------

var hwi0Params = new hwi.Params();
hwi0Params.instance.name ="hwi0";
hwi0Params.arg = 55;
program.global.hwi0 = Hwi.create (18、"&hwi_IsrUart0rx"、hwi0Params);

 在通过调用 BIOS_start()启动 BIOS 之前,我执行 UART0的以下初始化:

#define U_base 0x4000C000

#define UART_DR 0x00 //数据寄存器
#define UART_RSR 0x04 //接收状态/写入
#define UART_FR 0x18 //标志
#define UART_ILPR 0x20 // IrDA
#define UART_IBRD 0x24 //波特率分频系数整数
#define UART_FBRD 0x28 //波特率分频系数小数
#define UART_LCRH 0x2C //线路控制
#define UART_CTL 0x30 //控制寄存器
#define UART_IFL 0x34 //中断 FIFO 深度选择
#define UART_IM 0x38 //中断掩码
#define UART_RIS 0x3c //原始中断状态
#define UART_MIS 0x40 //屏蔽中断状态
#define UART_ICLR 0x44 //中断清除

uint32_t * uartBase;

void CM_uartInit (uint32_t base){
uartBase =(uint32_t *) U_BASE;

UART0_RxWrite = UART0_RxRead = 0;//初始化 Rx 循环队列
GPIO_writePin (86、1);//启用 RS485驱动程序
GPIO_writePin (87、0);//启用 RS485接收器

SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_UART0);//确保时钟打开

*((uint32_t *)(u_BASE + UART_CTL)))=~0x0001;//根据 TechRef 禁用 UART (寄存器的 B0)

*((uint32_t *)(U_base + UART_IBRD))= 0x43;//设置波特率= 115200
*((uint32_t *)(U_base + UART_FBRD))= 0x34;

*(((uint32_t *)(u_BASE + UART_LCRH))= 0x70;// 8N1   (0x70 = FIFO 开启、   0x60 = FIFO 关闭)


*((uint32_t *)(u_BASE + UART_IFL))= 0x12;

UART_clearInterruptStatus (base、UART_INT_RX);
UART_enableInterrupt (base、UART_INT_RX);
*((uint32_t *)(U_base + UART_CTL))= 0x0301;//启用 Tx、Rx 和 UART

中断服务例程如下所示:

void hwi_IsrUart0rx (){
   UART_clearInterruptStatus (U_base、UART_INT_RX);

程序会编译、链接和运行、但如果我从终端程序向 UART0发送字符、我可以看到它们到达数据寄存器(使用 CCS 存储器浏览器或寄存器视图)、但不会触发中断。  我可以在 ISR 中放置一个断点、但它永远不会触发。

我还有关于中断服务例程的问题。  在配置文件(请参阅上文)中、我将向 ISR 发送一个值为55的参数。  问题是如何编写 ISR。  喜欢这个吗?   

void hwi_IsrUart0rx (uint8_t 参数){

   //此处显示其他代码

还是其他方式?

提前感谢

     Joel

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

    在你的 Hwi 设置中、我不确定18是正确的中断编号。 可以尝试34吗? Hwi 函数指针类型定义为"void (* FuncPtr)(UArg");"

    如果这不起作用、您能否确认在寄存器视图中检查中断标志、您是否会看到 UART 寄存器中设置了中断标志?

    惠特尼

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

    这就是问题所在。  我使用了 IRQ 号、而不是矢量表偏移量。