昨天做串口DMA传输的时候遇到一个问题,方向是存储器到外设,传输数据不正确,传输数量是对的,并且改变源传输数据(改变数组内容),串口发出的数据并没有改变。
对此非常疑惑,费很多心思,后来发现个问题
512KB的SRAM被MDK拆分成两部分,并且其中一部分默认不使用,
对照数据手册的储存器映射表,
默认不使用的是DTCM,大小为128KB,
随后,我将另一块RAM勾选上,但是仍然不行,我将数组地址输出查看,发现地址仍然在20020000开始的区域。
于是我将其改为
DMA随即好使,
对此我十分困惑,有以下几个问题
问题1:2002000开始区域的SRAM1不能用作DMA传输的储存器地址域吗?还是我对DMA配置存在问题?
问题2:MDK的默认选项为何将ram拆分了,并且选择SRAM1?
DMA配置代码:
#define USARTx USART3
#define DMAstrx DMA1_Stream4
#define Stream_ch 7
#define Periph_data_size_8 0U
#define Periph_data_size_16 1U
#define Periph_data_size_32 2U
#define Memory_data_size_8 0U
#define Memory_data_size_16 1U
#define Memory_data_size_32 2U
#define Periph_TO_Memory 0X00U
#define Memory_TO_Periph 0X40U
#define Memory_TO_Memory 0X80U
#define Periph_NOT_Inc 0X000U
#define Memory_NOT_Inc 0X000U
#define Periph_Inc 0X200U
#define Memory_Inc 0X400U
#define Circular_mode 0x100U
void DMA1_USART3_init(DMA_Stream_TypeDef *DMA1S,u32 ch,u32 Prio,u32 M0AD,u32 WsheAD) // DMA1_Stream0
{
RCC->AHB1ENR|=RCC_AHB1ENR_DMA1EN;
while(DMA1S->CR&0X1);
DMA1S->PAR=WsheAD;
DMA1S->M0AR=M0AD;
DMA1S->CR=Periph_data_size_8<<11|Memory_data_size_8<<13|Memory_Inc|Memory_TO_Periph;
DMA1S->CR|=(u32)ch<<25;
DMA1S->CR|=(Prio<<16);
DMA1S->CR|=(u32)0x10; //transfer complete interrupt
NVIC->ISER[0]|=(u32)0x01<<DMA1_Stream4_IRQn;
NVIC->IP[DMA1_Stream4_IRQn]=(u8)0xf0;
}
DMA1_USART3_init(DMAstrx,Stream_ch,1,((u32)&USART_SendBuf),(u32)&USARTx->TDR);
@香水城
经验有限,所以想请城主帮忙解决一下,谢谢了
|