用DMA和SPI发送一个大数组,就是在SPI屏幕上显示数组里的图像数据
出现一个问题,DMA内存地址不自增的时候发送数据是对的,就是发那么多个,但是内存地址自增的时候图像下面的数据出错,debug过了图像数据没有问题,但是屏幕下面显示出错,说明屏幕下面的数据出错了,难道你们的大数组存放的位置是分开的吗
用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.cn
数组这样声明
这个指定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
只改过这个东西
您好,你这报错原因应该是设置的section太小了,放在该区域的数据太大,超过定义指定的这个RAM的空间大小了,导致越界,可将0x100改的大一些,比如改成0x1000,具体可根据你数据的大小来定这段区域的大小。后续若有问题,可通过邮箱(lzs@wch.cn)和我沟通
楼主,你这个问题解决了吗?我遇到不知道怎么使用DMA批量发送数据至SPI的屏,可以指导一下吗?