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.

[参考译文] TM4C1294NCPDT:可以触发 UART RX 中断#39;t

Guru**** 2563570 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/815365/tm4c1294ncpdt-the-uart-rx-interrupt-can-t-be-triggered

器件型号:TM4C1294NCPDT

我有一个 EK-TM4C129XL、该 EK-TM4C129XL 将通过串行/UART 从 PC 上的 Matlab 进行控制。

问题是、来自 PC 的传输不会触发接收中断。 我不会忘记在尝试之前"恢复"。

请检查我是否正确配置了所有内容。 这是相关代码。

void initPCInterface (uint32_t sys_clk)
{

SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、0b00000011);
UARTConfigSetExpClk (UART0_BASE、SYS_CLK、57600、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
UARTFIFOEnable (UART0_BASE);
UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX2_8、UART_FIFO_RX2_8);
UARTIntEnable (UART0_BASE、UART_INT_RX);
UARTIntRegister (UART0_BASE、pcCommInterface);
IntPrioritySet (INT_UART0、0x20);//中等优先级
IntEnable (INT_UART0);
} 
void initGPIO (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、PB_MASK);
GPIOPinWrite (GPIO_PORTB_BASE、PB_MASK、0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOP));
GPIOPinTypeGPIOOutput (GPIO_PORTP_BASE、PP_MASK);
GPIOPinWrite (GPIO_PORTP_BASE、PP_MASK、0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE));
GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、PE_MASK);
GPIOPinWrite (GPIO_Porte _BASE、PE_MASK、0);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOC));
GPIOPinTypeGPIOOutput (GPIO_PORTC_BASE、PC_MASK);
GPIOPinWrite (GPIO_PORTC_BASE、PC_MASK、0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOQ));
GPIOPinTypeGPIOOutput (GPIO_PORTQ_BASE、PQ_MASK);
GPIOPinWrite (GPIO_PORTQ_BASE、PQ_MASK、0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOK));
GPIOPinTypeGPIOInput (GPIO_PORTK_base、PK_MASK);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD));
//解锁 PD7,默认 NMI
HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_CR)= 0x80;
GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、PD_MASK);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOM));
GPIOPinTypeGPIOInput (GPIO_PORTM_BASE、PM_MASK);

SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION));
GPIOPinTypeGPIOInput (GPIO_PORTN_BASE、PN_MASK);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
GPIOPinTypeGPIOInput (GPIO_Porta_base、PA_MASK);
} 

int main (void)
{
{//限制 sys_clock 的作用域
uint32_t sys_clock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
initGPIO();
initPCInterface (sys_clock);
}//sys_clock 从堆栈中弹出
IntMasterEnable();

while (true);
} 

最小 Matlab 测试。  MATLAB 成功打开端口

清除
全部关闭
s=serial ('/dev/ttyS0、...
'budrate'、57600、'DataBits'、8、'Parity、'none'、...
'stopBits'、1、'Timeout'、2);

fopen (s);%successful
fprintf (s、'rzzzklkl');%send 某个东西、不
执行 fclose;

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

    您好 Andrey、

     您是否在 startup_ccs.c 中正确注册了 pcCommInterface 中断?

    如果您暂停调试、它是处于 while 循环中还是陷入 ISR 中?

    为便于阅读、我建议进行交换

    GPIOPinTypeUART (GPIO_Porta_base、0b00000011);

    使用

    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

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

    它在 while 循环处停止。

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

    我从中断切换到轮询、结果 μ µC 什么也不接收。 我在调试器中停止了以查看接收状态寄存器。 它没有显示错误。

    现在我迷路了。 我不知道在哪里可以进一步了解。 也许我会尝试向 Putty 发送一些内容、并查看是否可以从该处接收到这些内容

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

    Putty 也不会产生任何反应。

    sudo setserial -bg /dev/tty 显示

    0x03F8 (IRQ = 4)处的/dev/ttyS0为16550A

    其余部分

    无法获取串行信息:设备的 ioctl 不合适

    因此、ttyS0是唯一有效的串行端口。

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

    事实证明、我在 Linux 上遇到了一些问题。 我在 我的 Windows 笔记本电脑上安装了 CCS、它可以正常工作。

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

    您好 Andrey、

    好的、谢谢您的介绍。 然后、我将关闭这个线程。 祝您在 Linux 调试中一切顺利。

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

    更确切地说、端口是 /dev/ttyACM0、而不是 ttyS0。 它适用于 Putty,但不适用于 Matlab,因为 Matlab 只能识别 /dev/ttyS 端口,但这当然是不同的情况...