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.

[参考译文] MSP432P401R:MSP432 UART TX DMA

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/914018/msp432p401r-msp432-uart-tx-dma

器件型号:MSP432P401R

我让 UART 使用中断处理 RX 和 TX。  我需要更改 UART 以与 DMA 配合使用。  我尝试了从其他帖子中找到的示例、但无法使任何内容正常工作。

/* DMA 控制表*/
#if defined (__TI_Compiler_version__)
#pragma DATA_ALIGN (MSP_EXP432P401RLP_DMAControlTable,1024)
#Elif defined (__IAR_SYSTEMS_ICC__)
#pragma DATA_ALIGINS=1024
#Elif defined (__GULC_)#defend_D32_DCC_(__)







(_DIC24_DICE_DIC_DICE_DIC_)(_DICE_DIRECTIVAT_UST_DICE_UST_CLINDIC_(_UST_DIC_)#Eli_UST_CLUST_CLINDIC_(_UST_CLIN_DIC_)#CONFIGINDIC_(_UST_
map_dma_enableModule();
MAP_DMA_setControlBase (MSP_EXP432P401RLP_DMAControlTable);
MAP_DMA_assignChannel (DMA_CH4_EUSCIA2TX);//将 DMA 通道4分配给 EUSCI_A2_TX
MAP_DMA_disableChannelAttribute (DMA_CH4_EUSCIA2TX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
MAP_DMA_setChannelControl (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1);
EUSCI_A0_BASE
MAP_DMA_赋 值中断(DMA_INT1、4);
MAP_DMA_clearInterruptFlag (4);
}
__attribute__((中断)
void DMA_INT1_IRQHandler (void){
uint32_t ui32模式;

ui32Mode=map_dma_getChannelMode (dma_ch4_EUSCIA2TX | Udma_PRI_select);
if (ui32Mode=udma_mode_stop)
{
DICE_TX_BUSY=0;
EUSCI_A2->IFG &=~EUSCI_A_IFG_TXIFG;
}
MAP_DMA_clearInterruptFlag (4);
MAP_DMA_disableInterrupt (DMA_INT1);
}
__attribute__((中断)
void DMA_ERR_IRQHandler (void)
{
uint32_t ui32Status;

//检查 uDMA 错误位
ui32Status = map_dma_getErrorStatus();

//如果存在 uDMA 错误,则清除错误并递增错误计数器
if (ui32状态)
{
MAP_DMA_clearErrorStatus();

}
}


空 EUSCIA2_IRQHandler (空)
{
volatile uint8_t temp;
IF (EUSCI_A2->IFG 和 EUSCI_A_IFG_RXIFG)
{
DIice_Rx[DIice_Rx_WRI]= EUSCI_A2->RXBUF;
if (++DIES_Rx_WRI >= DIES_Rx_SIZE)
{

DICE_Rx_WRI=0;

}
dlice_rx_cnt++;

}

// IF (EUSCI_A2->IFG 和 EUSCI_A_IFG_TXIFG)
//{
// //检查 DICE 发送队列
// if (!(dice_TX_mT ())))
// {
// EUSCI_A2->TXBUF=dice_TX_DEQ ();
//}
// 其他
// {
// //没有要发送的内容,禁用发送中断
// DICE_TX_BUSY=0;
// EUSCI_A2->IFG &=~EUSCI_A_IFG_TXIFG;
//}
//}
//

此处是我尝试将数据传递给 DMA
uint32_t * DICE_TX;
DICE_TX =(uint32_t *)&EUSCI_A2->TXBUF;


//从优先级缓冲器到 DICE TX 缓冲
器空优先级_pop (PacketType 数据包){
int i;
switch (Packet){
案例 HS_DATA:
MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、PRIORY_BUF.HS_DATA_BUF.buffer[PRIORY_BUF.HS_DATA_BUF.tail].ALL_8、
(void*) DICE_TX、HS_DATA_SIZE);
//for (i=0;i IFG |= EUSCI_A_IFG_TXIFG;
中断;
//目前仅使用此案例进行测试
}
}

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

    您好!

    tipontite92 说:
    我尝试了从其他帖子中找到的以下示例,但无法使任何内容正常工作

    这是一个良好的开始。 您能更具体地说明哪些不起作用吗? 是否有任何指示特定内容的行为? 例如、DMA 中断是否触发?

    此致、

    James

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

    RX 的 UART 中断触发器。 DMA 中断不会触发、DMA 错误处理程序也不会触发。

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

    尝试将 DICE_TX 更改为 a (uint8_t *)。 编译器有权确保 a (uint32_t *)是32位对齐的、但 TXBUF (偏移量0x0E)不对齐。 [参考 TRM (SLAU356I)表24-7]

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

    将 DICE_TX 更改为 a (uint8_t*)不会改变我可以看到的行为。  我尝试手动触发通道(DMA_Channel->SW_CHTRIG |= DMA_SW_CHTRIG_CH4);  这会导致 UCTXIFG 以及通道4的 DMA_ENASET 和 EMA_ENACLR 置1。 但是、DMA 中断和错误处理程序仍然不会触发。

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

    能够使 DMA 在这篇文章中正常工作。  通过使用之前的中断、我手动清除了 TXIFG。 移除此中断并禁用 TX 中断可使 DMA 正常工作。

    e2e.ti.com/.../870953