初级会员

- 积分
- 194
- 金钱
- 194
- 注册时间
- 2020-1-27
- 在线时间
- 19 小时
|

楼主 |
发表于 2020-7-26 06:52:59
|
显示全部楼层
参考众多大侠的代码后,写出来了,分享给大家
- extern unsigned char HZK16;
- static void _DMA2D_Copy(void * pSrc,
- void * pDst,
- uint32_t xSize,
- uint32_t ySize,
- uint32_t OffLineSrc,
- uint32_t OffLineDst,
- uint32_t PixelFormat)
- {
- // 取字模,转换成DMA2D格式
- // 实际应用时先把字模改好,成到FLASH中
- unsigned char * p = &HZK16 + 0xE880; // 显示“成”字
- uint8_t buf[16*16];
- for(int i = 0; i < 32; i++)
- {
- char c = p[i];
- for(int j = 3; j >=0; j--)
- {
- uint16_t k = i*4+j;
- buf[k] = (c & 1) ? 0xf0 : 0;
- c >>= 1;
- buf[k] |= (c & 1) ? 0xf : 0;
- c >>= 1;
- }
- }
- // 字符背景
- uint32_t buf2[16*16/4];
- for(int i = 0; i < sizeof(buf2)/sizeof(*buf2); i++)
- {
- buf2[i] = 0xffffffff;
- }
- /* DMA2D采用存储器到存储器模式, 这种模式是前景层作为DMA2D输入 */
- DMA2D->CR = (1 << 17); // 混合模式,存储器到存储器并执行 PFC
- DMA2D->FGCOLR = 0x0000ff00; // 前景颜色,绿
- DMA2D->FGMAR = (uint32_t)buf; // 前景地址
- DMA2D->FGOR = 0; // 前景偏移
- DMA2D->BGCOLR = 0x000000ff; // 背景颜色,红
- DMA2D->BGMAR = (uint32_t)buf2; // 背景地址
- DMA2D->BGOR = 0; // 背景偏移
- DMA2D->OMAR = (uint32_t)pDst; // 目标地址
- DMA2D->OOR = 0; // 目标偏移
- DMA2D->NLR = (uint32_t)(xSize << 16) | (uint16_t)ySize; // 行列数
-
- /* 前景层和背景层是A4模式,输出区域是RGB565颜色格式 */
- DMA2D->FGPFCCR = 0xA; // A4模式;
- DMA2D->BGPFCCR = 0xA; // A4模式;
- DMA2D->OPFCCR = 0x2; // RGB565;
- /* 启动传输 */
- DMA2D->CR |= DMA2D_CR_START;
- /* 等待DMA2D传输完成 */
- while (DMA2D->CR & DMA2D_CR_START) {}
- }
复制代码
记得在主程序中加上
__HAL_RCC_DMA2D_CLK_ENABLE();
启动DMA2D
有了这个以后,显示文字基本不占用CPU时间,主循环周期在10us内,H750,当然还有一些其它技巧。
显示的同时不影响其它实时控制。 |
|