请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
你好!
我计划在 SPI、sci、scilin 使用 DMA 来节省 CPU 资源。 作为起点、我目前正在使用通过 DMA 进行的 sci 传输。
DMA 块的结构是1帧和8个元素、因此 DMA 应该以 sci 的形式发送8个字节。 源是 uint8_t 数组、具有16个元素("0"至"f")。
DMA 应发送'01234567'。
#include "sys_common.h"
/* USER CODE BEGIN (1) */
#include "sys_dma.h"
#include "sci.h"
/* USER CODE END */
/** @fn void main(void)
* @brief Application main function
* @note This function is empty by default.
*
* This function is called after startup.
* The user can use this function to implement the application.
*/
/* USER CODE BEGIN (2) */
void setDmaPacket(g_dmaCTRL *packet);
void setDmaSciReceive(g_dmaCTRL *packet);
void setDmaSciTransmit(g_dmaCTRL *packet);
uint8_t p[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/* USER CODE END */
int main(void)
{
/* USER CODE BEGIN (3) */
g_dmaCTRL dmaPacket = {0};
uint32_t dmaReqlineSciRx = 30;
uint32_t dmaReqlineSciTx = 31;
_enable_interrupt_();
sciInit();
sciSend(sciREG, 6, "init\r\n");
setDmaPacket(&dmaPacket);
setDmaSciTransmit(&dmaPacket);
dmaEnable();
dmaReqAssign(DMA_CH0, dmaReqlineSciTx);
dmaSetCtrlPacket(DMA_CH0, dmaPacket);
dmaSetChEnable(DMA_CH0, DMA_HW);
dmaEnableInterrupt(DMA_CH0, HBC);
dmaEnableInterrupt(DMA_CH0, BTC);
sciREG->SETINT |= (1 << 16);
while(1)
{
}
/* USER CODE END */
}
/* USER CODE BEGIN (4) */
void setDmaSciTransmit(g_dmaCTRL *packet)
{
packet->SADD = (uint32_t)p;
packet->DADD = (uint32_t)(&(sciREG->TD));
}
void setDmaSciReceive(g_dmaCTRL *packet)
{
packet->SADD = (uint32_t)(&(sciREG->RD));
packet->DADD = (uint32_t)p;
}
void setDmaPacket(g_dmaCTRL *packet)
{
packet->CHCTRL = 0;
packet->ELCNT = 8;
packet->ELDOFFSET = 0;
packet->ELSOFFSET = 1;
packet->FRDOFFSET = 0;
packet->FRSOFFSET = 0;
packet->FRCNT = 1;
packet->PORTASGN = 4;
packet->RDSIZE = ACCESS_8_BIT;
packet->WRSIZE = ACCESS_8_BIT;
packet->TTYPE = BLOCK_TRANSFER;
packet->ADDMODERD = ADDR_INC1;
packet->ADDMODEWR = ADDR_FIXED;
packet->AUTOINIT = AUTOINIT_OFF;
}
void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel)
{
/* enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (54) */
switch(inttype)
{
case HBC:
sciSend(sciREG, 12, "half block\r\n");
break;
case BTC:
sciSend(sciREG, 12, "block done\r\n");
break;
}
终端的预期结果为:
初始化
0123Half block
4567块完成
0~7的位置可能会有所不同。
实际结果为:
初始化
7Half Block
块完成
只有最后一个元素7通过 sci 发送。 当我将第8个元素7更改为不同的值时、结果会相应地发生变化、因此 DMA 正在读取某个内容、但无法正确读取。
问题可能出在哪呢?