OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5222|回复: 3

请问DMA2D能不能用于字符和汉字显示?

[复制链接]

12

主题

29

帖子

1

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2020-1-27
在线时间
19 小时
发表于 2020-7-26 06:52:58 | 显示全部楼层 |阅读模式
1金钱
请问DMA2D能不能用于字符和汉字显示?

最佳答案

查看完整内容[请看2#楼]

参考众多大侠的代码后,写出来了,分享给大家 记得在主程序中加上 __HAL_RCC_DMA2D_CLK_ENABLE(); 启动DMA2D 有了这个以后,显示文字基本不占用CPU时间,主循环周期在10us内,H750,当然还有一些其它技巧。 显示的同时不影响其它实时控制。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

29

帖子

1

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2020-1-27
在线时间
19 小时
 楼主| 发表于 2020-7-26 06:52:59 | 显示全部楼层
参考众多大侠的代码后,写出来了,分享给大家
  1. extern unsigned char HZK16;
  2. static void _DMA2D_Copy(void * pSrc,
  3.                         void * pDst,
  4.                         uint32_t xSize,
  5.                         uint32_t ySize,
  6.                         uint32_t OffLineSrc,
  7.                         uint32_t OffLineDst,
  8.                         uint32_t PixelFormat)
  9. {
  10.         // 取字模,转换成DMA2D格式
  11.         // 实际应用时先把字模改好,成到FLASH中
  12.         unsigned char * p = &HZK16 + 0xE880;        // 显示“成”字
  13.         uint8_t buf[16*16];
  14.         for(int i = 0; i < 32; i++)
  15.         {
  16.                 char c = p[i];
  17.                 for(int j = 3; j >=0; j--)
  18.                 {
  19.                         uint16_t k = i*4+j;
  20.                         buf[k] = (c & 1) ? 0xf0 : 0;
  21.                         c >>= 1;
  22.                         buf[k] |= (c & 1) ? 0xf : 0;
  23.                         c >>= 1;
  24.                 }
  25.         }       
  26.         // 字符背景
  27.         uint32_t buf2[16*16/4];
  28.         for(int i = 0; i < sizeof(buf2)/sizeof(*buf2); i++)
  29.         {
  30.                 buf2[i] = 0xffffffff;
  31.         }

  32.   /* DMA2D采用存储器到存储器模式, 这种模式是前景层作为DMA2D输入 */  
  33.         DMA2D->CR      = (1 << 17);                                // 混合模式,存储器到存储器并执行 PFC
  34.         DMA2D->FGCOLR  = 0x0000ff00;                        // 前景颜色,绿
  35.   DMA2D->FGMAR   = (uint32_t)buf;                // 前景地址
  36.   DMA2D->FGOR    = 0;                                                                // 前景偏移
  37.         DMA2D->BGCOLR  = 0x000000ff;                        // 背景颜色,红
  38.   DMA2D->BGMAR   = (uint32_t)buf2;        // 背景地址
  39.   DMA2D->BGOR    = 0;                                                                // 背景偏移
  40.   DMA2D->OMAR    = (uint32_t)pDst;        // 目标地址
  41.   DMA2D->OOR     = 0;                                                                // 目标偏移
  42.   DMA2D->NLR     = (uint32_t)(xSize << 16) | (uint16_t)ySize;        // 行列数
  43.   
  44.   /* 前景层和背景层是A4模式,输出区域是RGB565颜色格式 */
  45.   DMA2D->FGPFCCR = 0xA;        // A4模式;
  46.   DMA2D->BGPFCCR = 0xA;        // A4模式;
  47.   DMA2D->OPFCCR  = 0x2;        // RGB565;

  48.   /* 启动传输 */
  49.   DMA2D->CR   |= DMA2D_CR_START;   

  50.   /* 等待DMA2D传输完成 */
  51.   while (DMA2D->CR & DMA2D_CR_START) {}
  52. }
复制代码

记得在主程序中加上
        __HAL_RCC_DMA2D_CLK_ENABLE();
启动DMA2D
有了这个以后,显示文字基本不占用CPU时间,主循环周期在10us内,H750,当然还有一些其它技巧。
显示的同时不影响其它实时控制。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-7-28 03:02:40 | 显示全部楼层
hhhh63 发表于 2020-7-26 06:52
参考众多大侠的代码后,写出来了,分享给大家

记得在主程序中加上

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6252
金钱
6252
注册时间
2018-6-27
在线时间
534 小时
发表于 2021-7-7 16:52:49 | 显示全部楼层
学习学习,谢谢分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表