Other Parts Discussed in Thread: SYSBIOS
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