马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
[AppleScript] 纯文本查看 复制代码 void LCD_LVGL_Color_Fill(u16 sx, u16 sy, u16 ex, u16 ey, lv_color_t *color)
{
// 计算参数
u16 width = ex - sx + 1;
u16 height = ey - sy + 1;
u32 num = width * height;
if(num == 0) return;
// 设置显示范围
LCD_Address_Set(sx, sy, ex, ey);
LCD_CS_Clr();
// 保存并设置SPI为16位模式
uint16_t spi_cr1_backup = SPI1->CR1;
SPI1->CR1 |= SPI_CR1_DFF;
SPI_Cmd(SPI1, DISABLE);
SPI_Cmd(SPI1, ENABLE);
// 只更新每次传输变化的参数
DMA1_Channel3->CMAR = (uint32_t)color; // 内存地址
DMA1_Channel3->CNDTR = num; // 传输数量
DMA_ClearFlag(DMA1_FLAG_TC3);// 清除标志
DMA_Cmd(DMA1_Channel3, ENABLE);// 按正确顺序启动
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
while(DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET);// 等待传输完成
// 清理
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, DISABLE);
DMA_Cmd(DMA1_Channel3, DISABLE);
// 恢复SPI
SPI1->CR1 = spi_cr1_backup;
SPI_Cmd(SPI1, DISABLE);
SPI_Cmd(SPI1, ENABLE);
LCD_CS_Set();
}
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
LCD_LVGL_Color_Fill(area->x1,area->y1,area->x2,area->y2,color_p);
lv_disp_flush_ready(disp_drv);
}
[AppleScript] 纯文本查看 复制代码 void lcd_lvgl_dma_init()
{
static DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
// 这些参数每次传输都需要更新
DMA_InitStructure.DMA_MemoryBaseAddr = 0; // 临时值
DMA_InitStructure.DMA_BufferSize = 0; // 临时值
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
}
使用时候必须初始化lcd_lvgl_dma_init(),只需要在程序的开始初始化一次即可
|