主题中讨论的其他器件: TMS570LC4357、 HALCOGEN
工具与软件:
您好!
我正在修整 TMDX570LC43HDK (TMS570LC4357 MCU)。 我当前正在尝试使用 DMA 通过 SCI 发送数据、但读取并不总是有效。
以下是我的最小可重现示例代码:
/** srcs unsigned char *[2] [0x0000D218 {72 'H'},0x08000294 {72 'H'}] 0x08000284 [0] unsigned char * 0x0000D218 "Hello, wor..." 0x08000284 [1] unsigned char * 0x08000294 "Hello, wor..." 0x08000288 */ void func(void) { // Enable MPU first _enable_interrupt_(); _mpuInit_(); _mpuEnable_(); // Initialize peripherals sciInit(); dmaDisable(); dmaEnable(); uint8_t *src1 = "Hello, world!\r\n"; uint8_t src2[] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\r', '\n'}; uint32_t count = sizeof(src2) / sizeof(src2[0]); uint8_t *srcs[] = {src1, src2}; for (uint8_t i = 0; i < 2; i++) { g_dmaCTRL g_dmaCTRLPKT = { .SADD = (uint32_t)srcs[i], .DADD = ((uint32_t)&sciREG1->TD) + 3, // TMS570LC4357 is big endian .CHCTRL = 0, .FRCNT = count, .ELCNT = 1, .ELDOFFSET = 0, .ELSOFFSET = 0, .FRDOFFSET = 0, .FRSOFFSET = 0, .PORTASGN = PORTA_READ_PORTB_WRITE, .RDSIZE = ACCESS_8_BIT, .WRSIZE = ACCESS_8_BIT, .TTYPE = FRAME_TRANSFER, .ADDMODERD = ADDR_INC1, .ADDMODEWR = ADDR_FIXED, .AUTOINIT = AUTOINIT_OFF, }; dmaReqAssign(DMA_CH0, DMA_REQ29); dmaReqAssign(DMA_CH29, DMA_REQ0); dmaSetCtrlPacket(DMA_CH0, g_dmaCTRLPKT); dmaSetChEnable(DMA_CH0, DMA_HW); sciREG1->SETINT = (1 << 8) | (1 << 16); while ((dmaREG->BTCFLAG & (1 << DMA_CH0)) == 0) { } dmaREG->BTCFLAG = (1 << DMA_CH0); sciREG1->CLEARINT = (1 << 8) | (1 << 16); } while (1) { } }
此代码执行简单的操作:从 src1读取并通过 sci 发送、然后从 src2读取并再次通过 sci 发送、然后停止。
src1和 src2包含的"Hello、world!"数据相同 两者都使用 DMA 发送、但只有 src1传输成功。 对于 src2、远程器件接收填充为0的数据而不是原始数据。
我怀疑问题与他们的记忆位置有关。 指向常量字符数组的 src1为0x0000D218、而 src2、本地 uint8_t 数组为0x08000294。
但我不知道究竟是什么导致了这个问题以及如何解决它。 我未设置 DMA 内存保护。
谢谢!