你好,在使用CC2541时目前遇到一个很困惑的问题,我的程序希望通过串口发送,同样的程序在开发板上运行能够正常的收发,将程序下载到我们自己的目标板上,就没法发送出去了,跟踪到HalUARTWriteDMA函数体,
if (HAL_UART_DMA_TX_AVAIL() < len)
{
return 0;
}
发现总是在这个地方就返回了,感觉不知是DMA还是UART中断没有产生,DMA缓存满了
不能理解的就是在开发板上就可以。
Barbara Wu:
请问您的目标板的硬件连接和开发板是一样的吗?
shiquan wu:
回复 Barbara Wu:
串口那个地方没有特殊处理,我用直接端口输出,
P0SEL &= 0xF3; // P1.4、P1.5 选择通用IO
P0DIR |= 0x0C; // P1.4、P1.5 设置输出
P0 ^= 0x0C; // P1.4、P1.5 输出置在P0.3能看到正常波形
目标板的其他功能都是正常的
shiquan wu:
回复 Barbara Wu:
会不会是单片机内核中的串口或者DMA有问题了?
Barbara Wu:
回复 shiquan wu:
单片机?你应该使用的是CC2541本身的DMA吧?是有使用协议栈还是没有使用协议栈?
感觉DMA出问题的可能性很低,但如果有多个板子可以换个板子试一下
Barbara Wu:
回复 shiquan wu:
开发板上默认使用的是P0_2 P0_3 P_4 P_5做的串口
感觉您应该是把CC2541作为8051在编程,请参考TI已经提供的代码http://www.ti.com/lit/zip/swrc257
里面有UART_DMA的例程
shiquan wu:
回复 Barbara Wu:
跟踪到了串口中断服务程序HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ),中断进入了,第一个字符发送后就在没有中断了,是否可以进一步判定是串口问题?
Barbara Wu:
回复 shiquan wu:
如果使用ISR的模式,根据例程看起来是要有清空标志位的操作的。
/************************************************************************************ @fn UART0_TX_ISR** @brief Function which completes the UART transmit session, that is it* sends the rest of the UART0 packet.** @param void**/#pragma vector = UTX0_VECTOR__interrupt void UART0_TX_ISR(void){ // Clear UART0 TX Interrupt Flag (IRCON2.UTX0IF = 0). UTX0IF = 0;
// Send next UART byte. U0DBUF = uartTxBuffer[uartTxIndex++];
// If no UART byte left to transmit, stop this UART TX session if (uartTxIndex >= SIZE_OF_UART_TX_BUFFER) { // Note: // In order to start another UART TX session the application just needs // to prepare the source buffer, and trigger the TX isr. uartTxIndex = 0; IEN2 &= ~IEN2_UTX0IE; }}
shiquan wu:
回复 Barbara Wu:
困惑啊,我用的是TI的协议栈,串口部分的代码为协议栈自带的,同样的程序,在开发板上能否正常的串口收发,目标板已经精简到只有一个CPU和调试接口了,依然问题存在。
#if (HAL_UART_DMA == 1)HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )#elseHAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )#endif{ HAL_ENTER_ISR();
if (dmaCfg.txHead == dmaCfg.txTail) { IEN2 &= ~UTXxIE; dmaCfg.txMT = 1; } else { UTXxIF = 0; UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++];
if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) { dmaCfg.txHead = 0; } }
HAL_EXIT_ISR();}#endif
第一次调用HalUARTWrite,能进入以上中断服务程序,UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; 向UxDBUF 写入一个字符后,就再也进不了中断,感觉移位寄存器没有工作一样,请问有哪些情况下会导致移位寄存器不工作呢?
Barbara Wu:
回复 shiquan wu:
请问目标板和开发板的硬件设计不同在哪里?
感觉这个时候要查一下有没有因为硬件设计不同而导致的问题。