CH32V307SPI DMA

用DMA和SPI发送一个大数组,就是在SPI屏幕上显示数组里的图像数据


出现一个问题,DMA内存地址不自增的时候发送数据是对的,就是发那么多个,但是内存地址自增的时候图像下面的数据出错,debug过了图像数据没有问题,但是屏幕下面显示出错,说明屏幕下面的数据出错了,难道你们的大数组存放的位置是分开的吗


#define TFT_IMG_W 128

#define TFT_IMG_H 152


unsigned char TFT_Img[TFT_IMG_H][TFT_IMG_W*2];


void TFT_DMA_Init(void)

{

    //DMA1_CHANNEL5

    //RCC DMA

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    //Init

    DMA_InitTypeDef DMA_InitStructure;

    DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)&SPI2->DATAR;

    DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)TFT_Img;

    DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

    DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;

    DMA_InitStructure.DMA_BufferSize=0;

    DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;

    DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

    DMA_InitStructure.DMA_Priority=DMA_Priority_Low;

    DMA_Init(DMA1_Channel5, &DMA_InitStructure);


    DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel5_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;

    NVIC_Init(&NVIC_InitStructure);


    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);

}


void TFT_DMA_Start(void)

{

    if(!TFT_DMA_Transmiting)

    {

        TFT_DMA_Transmiting=1;

        TFT_Set_Region(0,0,TFT_IMG_W-1,TFT_IMG_H-1);

        DMA_Cmd(DMA1_Channel5, DISABLE);

        DMA_SetCurrDataCounter(DMA1_Channel5, TFT_IMG_H*TFT_IMG_W*2);


        DMA_Cmd(DMA1_Channel5, ENABLE);

    }

}



我去,内存地址自增就错了,不自增刷的就是对的,啊


有没有一种可能,你的图像数组的内容在刷新期间变了


你好 你的数组大小并没有很大,在RAM中指定数组的地址即可,如果你需要DMA搬运很大的数据(64K左右),请邮箱与我联系zdg@wch.cn8165a93060bdbfa4563833fe4a20ba5.png


ba34557cca95b558bdaa24f07e99b9d.png数组这样声明


这个指定ram的地址,是有什么讲究吗,如果不指定会咋样?


有具体问题可以邮箱联系,谢谢


有空又回来弄一下这个,可是我加了他就报错了


d:/_software/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld.exe:C:\Users\qwe19\Desktop\CH30V307\CH32V307_V3\MCU\Ld\Link.ld:1 cannot move location counter backwards (from 0000000020000228 to 0000000020000100)

collect2.exe: error: ld returned 1 exit status

make: *** [makefile:57: CH32V307_V3.elf] Error 1

image.png


只改过这个东西

image.png


您好,你这报错原因应该是设置的section太小了,放在该区域的数据太大,超过定义指定的这个RAM的空间大小了,导致越界,可将0x100改的大一些,比如改成0x1000,具体可根据你数据的大小来定这段区域的大小。后续若有问题,可通过邮箱(lzs@wch.cn)和我沟通



楼主,你这个问题解决了吗?我遇到不知道怎么使用DMA批量发送数据至SPI的屏,可以指导一下吗?


只有登录才能回复,可以选择微信账号登录