void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
? ? NVIC_InitTypeDef? NVIC_InitStructure;
? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);? //使能DMA傳輸
? DMA_DeInit(DMA_CHx);? ?//將DMA的通道1寄存器重設(shè)為缺省值
? ? DMA1_MEM_LEN=cndtr;
? ? DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;? //DMA外設(shè)ADC基地址
? ? DMA_InitStructure.DMA_MemoryBaseAddr = cmar;? //DMA內(nèi)存基地址
? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;? //數(shù)據(jù)傳輸方向,從內(nèi)存讀取發(fā)送到外設(shè)
? ? DMA_InitStructure.DMA_BufferSize = cndtr;? //DMA通道的DMA緩存的大小
? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;? //外設(shè)地址寄存器不變
? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? //內(nèi)存地址寄存器遞增
? ? DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte? ;? //數(shù)據(jù)寬度為8位
? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte? ?; //數(shù)據(jù)寬度為8位
? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;? //工作在正常緩存模式
? ? DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x擁有中優(yōu)先級
? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? //DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏?/span>
? ? DMA_Init(DMA_CHx, &DMA_InitStructure);? //根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道USART1_Tx_DMA_Channel所標(biāo)識的寄存器
? ? NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ? NVIC_Init(&NVIC_InitStructure);
? ? DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);? //使能DMA傳輸完成中斷
}?
/*************************************************************************************************************/
//? ? int32_t x;
//? ? int32_t y;
//? ? for(y = area->y1; y <= area->y2; y++) {
//? ? ? ? for(x = area->x1; x <= area->x2; x++) {
//? ? ? ? ? ? /*Put a pixel to the display. For example:*/
//? ? ? ? ? ? /*put_px(x, y, *color_p)*/
//? ? ? ? ? ? LCD_DrawPoint(x, y, color_p->full);
//? ? ? ? ? ? color_p++;
//? ? ? ? }
//? ? }
//? ? u16 height, width;
//? ? uint32_t y=0;
//? ? ? ? width = area->x2 -area->x1 + 1;
//? ? ? ? height = area->y2 -area->y1 + 1;
//? ? ? ? LCD_Address_Set(area->x1,area->y1,area->x2,area->y2);
//? ? ? ? for(y = 0; y
//? ? ? ? ? ? ? ? {
//? ? ? ? ? ? LCD_WR_DATA(color_p->full);
//? ? ? ? ? ? ? ? ? ? color_p++;
//? ? ? ? ? ? ? ? }
? ? void DMA1_Channel3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
? ? void DMA1_Channel3_IRQHandler(void);
? ? ? {
? ? ? ? ? if(DMA_GetITStatus(DMA1_IT_TC3))
? ? ? ? ? {
? ? ? ? ? ? ? printf("進入DMA中斷\r\n");? ? ? ? ? ? ? ? ? ? ?//無法打印
? ? ? ? ? ? ? lv_disp_flush_ready(disp_drv);
? ? ? ? ? ? ? DMA_ClearITPendingBit(DMA1_IT_TC3); //清除全部中斷標(biāo)志
? ? ? ? ? }
? ? ? }
? ? LCD_Fill(area->x1,area->y1,area->x2,area->y2,color_p->full);
/*************************************************************************************************************/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)? ? ? ? ? ? ? ? ?//LCD打印函數(shù)
{? ? ? ? ??
? ? u16 color1[1];
? ? u16 num;
? ? color1[0]=color;
? ? num=(xend-xsta+1)*(yend-ysta+1)*2;
? ? LCD_Address_Set(xsta,ysta,xend,yend);//設(shè)置顯示范圍
? ? LCD_CS_Clr();
? ? MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DATAR,(u32)color1,num);
? ? SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
? ? MYDMA_Enable(DMA1_Channel3);
? ? LCD_CS_Set();
}
/*************************************************************************************************************/
如果不用DMA,使用以下函數(shù)之一是可以打印的
//? ? int32_t x;
//? ? int32_t y;
//? ? for(y = area->y1; y <= area->y2; y++) {
//? ? ? ? for(x = area->x1; x <= area->x2; x++) {
//? ? ? ? ? ? /*Put a pixel to the display. For example:*/
//? ? ? ? ? ? /*put_px(x, y, *color_p)*/
//? ? ? ? ? ? LCD_DrawPoint(x, y, color_p->full);
//? ? ? ? ? ? color_p++;
//? ? ? ? }
//? ? }
//? ? u16 height, width;
//? ? uint32_t y=0;
//? ? ? ? width = area->x2 -area->x1 + 1;
//? ? ? ? height = area->y2 -area->y1 + 1;
//? ? ? ? LCD_Address_Set(area->x1,area->y1,area->x2,area->y2);
//? ? ? ? for(y = 0; y
//? ? ? ? ? ? ? ? {
//? ? ? ? ? ? LCD_WR_DATA(color_p->full);
//? ? ? ? ? ? ? ? ? ? color_p++;
//? ? ? ? ? ? ? ? }