您好!
需要有关以下问题的帮助。
设置2个 EVA 板一个是 MSP432P401R 另一个是 TI 的 TM4C。
这两个器件都运行稍作修改的 UART 回波示例。 UART 频率1MHz。
TM4C UART 发送器 MSP432是接收器。
TM4C 正在发送256字节的数据包、同时激活 DMA。
MSP432遇到 UART 溢出错误。
我使用 UART freq 运行、一切都好。。。
问题:为了消除接收器侧的 UARToverrun 错误、可以采取哪些措施?
谢谢
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.
您好!
需要有关以下问题的帮助。
设置2个 EVA 板一个是 MSP432P401R 另一个是 TI 的 TM4C。
这两个器件都运行稍作修改的 UART 回波示例。 UART 频率1MHz。
TM4C UART 发送器 MSP432是接收器。
TM4C 正在发送256字节的数据包、同时激活 DMA。
MSP432遇到 UART 溢出错误。
我使用 UART freq 运行、一切都好。。。
问题:为了消除接收器侧的 UARToverrun 错误、可以采取哪些措施?
谢谢
您好 Amit
>两个发送器和接收器板之间是否实现了任何形式的流量控制?
不确定、你要问什么... 根据定义、DMA 现在意味着流控制、我只需配置通道、而不是启用通道。 DMA 通过中断调用在传输就绪时通知我。
>请注意,TM4C 器件可能以较高的系统频率运行,从而使其几乎可以连续传输帧,从而使接收器件不堪重负。
同意... 那么、什么呢? 1MHz UART 频率是合法的、并且在文档中承诺的范围内。 UART 必须能够处理此流。
>步骤1:从 Tx 发送数据到 Rx 时,以预定义字节大小的块(例如32)发送数据
我尝试过这种方法、即使使用2个字节也无法正常工作。 不要说32
> Rx 处理数据后,仅在完成后才将 ACK 发送回 Tx 模块。
它不能在 RX 处理数据步骤中工作... 没有接收到的数据、溢出状态、因此无需确认。 确认
>这将确保 CPU 在数据超时处理时不会中断。
抱歉。 不工作。 我使用 UART 尝试了 DMA…… 也没有帮助。
>或者,必须在 Rx 端使用中断来通知 CPU 数据正在通过
很抱歉,我没有得到。 您写的"即将到来"。 您是指32字节块的中间?
这话什么意思?
我知道的中断已被接收。
正如我承诺的那样、这是我在 MSP432上运行的代码。
正如我说过的、我可以运行频率为3、6 MHz 的 UART、但前提是每个字节之间用小的暂停时间分隔、因此实际上会降低我的整体字节流速度。 从3.6MHz 到700kHz。
我的经理问我什么、MSP432文档中承诺的只是什么。 他是对的。
/* DriverLib 包括*/
#include
/*标准包括*/
#include
#include
静态 dma_ControlTable dmaControlTable[8];
静态 void preparedma()
{
map_dma_enableModule();
MAP_DMA_setControlBase (dmaControlTable);
/*将 DMA 通道0分配给 EUSCI_A0_TX0 *
MAP_DMA_赋 值通道(DMA_CH0_EUSCIA0TX);
/*设置 TX 传输特性和缓冲器*/
MAP_DMA_setChannelControl (DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
MAP_DMA_赋 值中断(INT_DMA_INT1、DMA_CHANNEL 0);
MAP_DMA_disableInterrupt (INT_DMA_INT1);
/*将 DMA 通道1分配给 EUSCI_A0_RX0 *
MAP_DMA_赋 值通道(DMA_CH1_EUSCIA0RX);
/*设置 RX 传输特性和缓冲器*/
MAP_DMA_setChannelControl (DMA_CH1_EUSCIA0RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
MAP_DMA_赋 值中断(INT_DMA_INT2、DMA_CHANNEL);
MAP_DMA_disableInterrupt (INT_DMA_INT2);
}
静态空 UART_SEND_DMA (char *缓冲区、int n)
{
MAP_DMA_setChannelTransfer (
DMA_CH0_EUSCIA0TX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、
缓冲器、
(void *) map_spi_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、n);
MAP_DMA_enableInterrupt (INT_DMA_INT1);
MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
MAP_DMA_enableInterrupt (INT_DMA_ERR);
MAP_Interrupt_enableInterrupt (INT_DMA_ERR);
map_dma_enableChannel (dma_channel_0);
}
静态空 UART_receive_dma (char * buff、int n)
{
MAP_DMA_setChannelTransfer (
DMA_CH1_EUSCIA0RX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、
(void*) map_SPI_getReceiveBufferAddressForDMA (EUSCI_A0_BASE)、
缓冲器、n);
MAP_DMA_enableInterrupt (INT_DMA_INT2);
MAP_Interrupt_enableInterrupt (INT_DMA_INT2);
MAP_DMA_enableInterrupt (INT_DMA_ERR);
MAP_Interrupt_enableInterrupt (INT_DMA_ERR);
map_dma_enableChannel (dma_channel_1);
}
struct Stat
{
uint32_t 时间;
uint32_t errCnt;
uint32_t cnt;
uint8_t num;
uint8_t indx;
uint32_t errIndx;
}stat={0,0,0,1,0};
struct ErrStat
{
char soll;
char ist;
}errStat ={0};
静态 uint32_t 时间戳;
静态 bool 接收;
静态 void prepareUART()
{
const eUSCI_UART_Config uartConfig =
{
EUSCI_A_UART_CLOCKSOURCE_SMCLK、// SMCLK 时钟源
6、 // BRDIV = 78
0、 // UCxBRF = 2
6、 // UCxBRS = 0
EUSCI_A_UART_ever_parity、 //无奇偶校验
EUSCI_A_UART_LSB_FIRST、 // LSB 优先
EUSCI_A_UART_One_stop_bit、 //一个停止位
EUSCI_A_UART_MODE、 // UART 模式
0 //过采样
};
/*在 UART 模式下选择 P1.2和 P1.3 */
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、
GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);
/*将 DCO 设置为24MHz */
CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24);
/*配置 UART 模块*/
MAP_UART_initModule (EUSCI_A0_BASE、uartConfig);
MAP_UART_selectDeglitchTime (EUSCI_A0_BASE、EUSCI_A_UART_DEGLITCH_TIME_2ns);
/*启用 UART 模块*/
MAP_UART_enableModule (EUSCI_A0_BASE);
MAP_Interrupt_enableMaster();
}
静态 void prepareTimer()
{
MAP_Timer32_initModule (TIMER32_BASE、TIMER32_prescaler_1、TIMER32_32位、
TIMER32_FREE_RUN_MODE);
MAP_Timer32_startTimer (TIMER32_BASE、TRUE);
时间戳= map_Timer32_getValue (TIMER32_BASE);
}
静态空分析2 (char* buff)
{
bool e1 =!(abs (buff [ stat.indx]-stat.num)== 1)&buff [ stat.indx];
bool E2 =缓冲区[0]+stat.indx!= 128;
IF (E1 || E2)
{
++stat.errCnt;
STAT.errIndx = E1? 1:2;
如果(E1)
{
errStat.ist =缓冲区[stat.indx];
errStat.soll = stat.num +1;
}
}
stat.indx =(128>buff [0])? 128-buff [0]:stat.indx;
++stat.cnt;
STAT.num =缓冲区[stat.indx];
uint32_t newTime = map_Timer32_getValue (TIMER32_BASE);
STAT.TIME =时间戳- newTime;
时间戳= newTime;
}
void errAnalyze (char* buff)
{
uint8_t e1 =!buff [stat.indx]|| abs (buff [stat.indx]-stat.num)== 1;
如果(!E1)
{
++stat.errCnt;
errStat.ist =缓冲区[stat.indx];
errStat.soll = stat.num + 1;
stat.indx =(128>buff [1])? 129-缓冲区[1]:stat.indx;
stat.indx =(stat.indx = 128)? 0:stat.indx;
STAT.num =缓冲区[stat.indx];
}
其他
{
STAT.num =缓冲区[stat.indx];
++stat.cnt;
}
uint32_t newTime = map_Timer32_getValue (TIMER32_BASE);
STAT.TIME =时间戳- newTime;
时间戳= newTime;
}
int main (void)
{
字符缓冲[256];
uint32_t i;
MAP_WDT_A_HOLDTimer();
prepareUART();
preparedma();
prepareTimer();
/*准备 OSCi */
_delay_cycles (24000000);
while (1)
{
接收= 1;
UART_Receive_DMA (缓冲区、128);
while (receive);
错误分析(缓冲器);
}
memset (buff、0x00、256);
对于(i=0;i<128;++I)
buff [i]= i;
while (1)
{
接收= 1;
++buff [0];
UART_SEND_DMA (缓冲区、128);
while (receive);
++stat.cnt;
_delay_cycles (48);
}
}
void dma_int2_IRQHandler (void)
{
MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
接收= 0;
}
void DMA_INT1_IRQHandler (void)
{
MAP_DMA_clearInterruptFlag (DMA_CHANNEL 0);
接收= 0;
}
void dma_ERR_IRQHandler (void)
{
MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
MAP_DMA_clearInterruptFlag (DMA_CHANNEL);
接收= 0;
}
空 EUSCIA0_IRQHandler (空)
{
uint32_t status = MAP_UART_getEnabledInterruptStatus (EUSCI_A0_BASE);
uint32_t 错误= MAP_UART_queryStatusFlags (EUSCI_A0_BASE、
EUSCI_A_UART_组 帧错误|
EUSCI_A_UART_over_error|
EUSCI_A_UART_parity 错误);
MAP_UART_clearInterruptFlag (EUSCI_A0_BASE、STATUS);
IF (STATUS 和 EUSCI_A_UART_receive_interrupt_FLAG)
{
//map_UART_transmitData (eUSCI_A0_BASE、map_UART_receiveData (eUSCI_A0_BASE));
}
}
> MSP432P401R 设备的数据源是什么?
EK_TM4C129EXL、运行修改后的 UART DMA 回显示例
很抱歉、我不明白我必须为您提供什么系统时钟设置? 我在我的第一篇帖子中向您发送了完整的源代码...
这话什么意思?
/* Setting DCO to 24MHz */ CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);我尝试了这两种方法
MAP_PCM_setCoreVoltageLevel (PCM_VCORE0);
MAP_PCM_setCoreVoltageLevel (PCM_VCORE01);
在这两种情况下、UARTRX 频率最大值均为3、6MHz…… 远低于规格中承诺的
初始化代码
const eUSCI_UART_Config uartConfig3MHz6 = { EUSCI_A_UART_CLOCKSOURCE_SMCLK、// SMCLK 时钟源 6、 // BRDIV 0、 // UCxBRF 6、 // UCxBRS EUSCI_A_UART_ever_parity、 //无奇偶校验 EUSCI_A_UART_LSB_FIRST、 // LSB 优先 EUSCI_A_UART_One_stop_bit、 //一个停止位 EUSCI_A_UART_MODE、 // UART 模式 0 //过采样 }; /*在 UART 模式下选择 P1.2和 P1.3 */ MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、 GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION); /*将 DCO 设置为24MHz (升级 Vcore)*/ MAP_PCM_setCoreVoltageLevel (PCM_VCORE0);//PCM_VCORE1 CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24); /*配置 UART 模块*/ MAP_UART_initModule (EUSCI_A0_BASE、&uartConfig3MHz6);
抱歉、无法使其在 Rx 频率超过3.6 MHz 时工作。
>"修改后的 DMA UART 回波示例"听起来像是发送器正在发送连续流。
不连续、发送方发送一个256字节的缓冲区、这正是接收方 UART 的设置。 然后暂停20微秒、然后再次发送缓冲区、
> 没有多少时间--重新启动 Rx DMA 以捕获第129个字节
我想20微秒是足够的时间。
> Rx 完成后、它会立即重新启动 DMA (可能使用不同的缓冲器)。
不同的缓冲器、我没有尝试过。 也许... 但我有一种感觉,它不会有所帮助。
更糟糕的是...
查看发件人端的代码
大于480个时钟--也许,也许不…… "靠近边缘"
我将暂停增加到1毫秒、负极。 仍然存在溢出错误
>是否先启动接收器?
是的、 我先启动... 作为一个探头、我将暂停时间延长了1秒 运行数十个测试。 负..
我在示波器中检查了信号的形状、非常完美。
我不同意我在边缘附近做一些事情。 边沿将是7MHz……
请在您的实验中重复我的代码。 它基本上是带有 DMA 的 UART 回显,但速度有所提高。
为什么在地球上它拒绝在频率为4 MHz 的频率上工作???
我没有任何 Tivas、我只能找到一个正常工作的 Launchpad、因此我设置您的程序以循环方式、同时充当发送器和接收器。 这将模拟 Amit 建议的模块间暂停协议。
结果:
1) 1)示波器显示250ns 位周期、即4Mbps。
2) 2)我让它运行大约半小时、但我根本看不到任何超限(STATW:OE)。 (我希望任何 OE 实际上都会导致 DMA 在这里挂起、但无论如何我都明确检查了。)
块之间的(自强加)暂停大约为35uS (-O0)。 其中、大约9us 是您的分析、26us 似乎是 DMA 设置(2倍)。 将其中一半(13us)属性分配给 Rx DMA 设置、这表明您将无法使用连续 Rx 流在~3us 中关闭 Rx DMA。 您可能需要使用循环 DMA 来获得连续 Rx。
这是我的修改后循环:
while (1) { 接收= 1; #ifBMC P2->OUT &=~BIT2; #endif UART_RECEIVE_DMA (buff、128); #ifBMC UART_SEND_DMA (txbuf、128); #endif while (receive); #ifBMC P2->OUT |= BIT2; #endif errAnalyze (buff); #ifBMC IF (EUSCI_A0->STATW 和 EUSCI_A_STATW_OE) P2->OUT |= BIT0; ++bufcnt; if ((bufcnt & 0xff)==1) P1->OUT ^= BIT0; #endif }