用DMA和SPI發(fā)送一個大數組,就是在SPI屏幕上顯示數組里的圖像數據
出現一個問題,DMA內存地址不自增的時候發(fā)送數據是對的,就是發(fā)那么多個,但是內存地址自增的時候圖像下面的數據出錯,debug過了圖像數據沒有問題,但是屏幕下面顯示出錯,說明屏幕下面的數據出錯了,難道你們的大數組存放的位置是分開的嗎
用DMA和SPI發(fā)送一個大數組,就是在SPI屏幕上顯示數組里的圖像數據
出現一個問題,DMA內存地址不自增的時候發(fā)送數據是對的,就是發(fā)那么多個,但是內存地址自增的時候圖像下面的數據出錯,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左右),請郵箱與我聯(lián)系zdg@wch.cn
數組這樣聲明
這個指定ram的地址,是有什么講究嗎,如果不指定會咋樣?
有具體問題可以郵箱聯(lián)系,謝謝
有空又回來弄一下這個,可是我加了他就報錯了
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太小了,放在該區(qū)域的數據太大,超過定義指定的這個RAM的空間大小了,導致越界,可將0x100改的大一些,比如改成0x1000,具體可根據你數據的大小來定這段區(qū)域的大小。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通
樓主,你這個問題解決了嗎?我遇到不知道怎么使用DMA批量發(fā)送數據至SPI的屏,可以指導一下嗎?