|
本帖最后由 liudingding 于 2022-9-13 11:40 编辑
我属愚笨型人员,主控F407是用寄存器开发的,显示屏用TK499,例程都是库开发的,不懂库函数,写起程序很困难,照瓢画瓢从例程上抄了个DMA搬运数据显示的程序,不工作,求斑竹看看哪里错了,直接来个正确的程序,你要是说修改方法的话,我将是云里雾里的听不懂,这个帖子就看不懂:www.amobbs.com/forum.php?mod=vie ... 4&highlight=DMA,
程序如下:
LCD_Fill_Pic(0, 0,320, 480, (u32*)gImage_MM_T035); //用DMA模式 显示一幅图片
/******************************************
函数名:Lcd图像填充
功能:向Lcd指定位置填充图像
入口参数:
(x,y): 图片左上角起始坐标
(pic_H,pic_V): 图片的宽高
pic 指向存储图片数组的指针
******************************************/
void LCD_Fill_Pic(u16 x, u16 y,u16 pic_H, u16 pic_V, u32* pic)
{
//DMA 方式
BlockWrite(x,x+pic_H-1,y,y+pic_V-1); //开窗函数
TK80_DMA_Init((u32)pic, pic_H*pic_V*2); //DMA初始化
while((DMA2->ISR & 0x20)==0);
DMA2->IFCR |=1<<5;
}
void TK80_DMA_Init(u32 srcAdd ,u32 len) //TK80的DMA配置函数,srcAdd是源地址,len是数据长度,一次能搬运42亿点
{
RCC->AHB2ENR |= RCC_AHB2Periph_TK80;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
DMA2_Channel2->CCR = 0x3090; //0x3090==8位, 0x3590==16位, 0x3A90==32位,
DMA2_Channel2->CPAR = (u32)&(TK80->DINR);
TK80->CFGR1 = 0x05050102;
TK80->CFGR2 = 0x0501;
DMA2_Channel2->CMAR = srcAdd; //存储器地址(发送地址)
DMA2_Channel2->CNDTR = len; //数据传输长度
DMA2_Channel2->CCR |= 1; //通道开启
TK80->CR |= 1;
}
void WriteComm(unsigned int CMD) //写命令
{
TK80->CMDIR = CMD;
while(TK80->SR & 0x10000);
}
void WriteData(u32 dat) //写数据
{
TK80->DINR = dat;
while(TK80->SR & 0x10000);
}
/**********************************************
函数名:开窗函数
入口参数:XStart x方向的起点
Xend x方向的终点
YStart y方向的起点
Yend y方向的终点
这个函数的意义是:开一个矩形框,方便接下来往这个框填充数据
***********************************************/
void BlockWrite(unsigned int Xstart,unsigned int Xend,unsigned int Ystart,unsigned int
Yend)
{
WriteComm(0x2a);
WriteData(Xstart>>8);
WriteData(Xstart);
WriteData(Xend>>8);
WriteData(Xend);
WriteComm(0x2b);
WriteData(Ystart>>8);
WriteData(Ystart);
WriteData(Yend>>8);
WriteData(Yend);
WriteComm(0x2c);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
有一句段子是这样说的,身家过亿的只关心自己的身体,身家千万的,在担心传承,勉强糊口度日才天天看国际新闻,关心国家大事。
|