找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 468|回复: 1
打印 上一主题 下一主题
收起左侧

STM32f407使用SPI+DMA用LVGL作为GUI库刷屏发生碎屏数据错乱问题

[复制链接]
跳转到指定楼层
楼主
ID:1132556 发表于 2025-2-13 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用SPI刷屏时能够完美实现刷屏效果。但加入DMA后效果就如视频链接所示,数据产生错位,但又能马上恢复正常,以下是我的刷屏代码,请求帮助.
  1. /**
  2. * @brief   指定区域进行颜色填充
  3. * @param   xs:起始列地址
  4. * @param   ys:起始行地址
  5. * @param   xe:结束列地址
  6. * @param   ye:结束行地址
  7. * @param   color:需要填充的颜色
  8. * @retval  无
  9. */
  10. void LCD_ColorFill(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t *color)
  11. {
  12.     uint8_t count=0;    /* 定义传输次数 */
  13.     uint16_t t = 1;
  14.     uint32_t num, num1;
  15.     num = (xe - xs+1) * (ye - ys+1);
  16.     LCD_AddressSet(xs, ys, xe, ye);             /* 设置显示窗口 */
  17.     SPI_Cmd(BSP_SPI_PORT, DISABLE);                     /* 失能SPI */
  18.     SPI_DataSizeConfig(BSP_SPI_PORT, SPI_DataSize_16b); /* 设置SPI数据传输宽度:16bit */
  19.     BSP_SPI_CS_Clr();
  20.     SPI_Cmd(BSP_SPI_PORT, ENABLE); /* 使能SPI */
  21.     while (t)
  22.     {
  23.         if (num > 25600)
  24.         {
  25.             num -= 25600;
  26.             num1 = 25600;
  27.             count++;
  28.         }
  29.         else
  30.         {
  31.             t = 0;
  32.             num1 = num;
  33.             if(count!=0)
  34.             {
  35.                 color += (25600*count); /* 地址跟随自增 */
  36.             }
  37.         }
  38.         BSP_DMA_ConfigC(BSP_DMA_Channel, (uint32_t)&BSP_SPI_PORT->DR, (uint32_t)color, num1);
  39.         SPI_I2S_DMACmd(BSP_SPI_PORT, SPI_I2S_DMAReq_Tx, ENABLE);
  40.         BSP_DMA_Enable();
  41.         while (1)
  42.         {
  43.             if (DMA_GetFlagStatus(BSP_DMAy_Streamx, BSP_SPI_DMA_TX_FLAG) != RESET) /* 等待通道传输完成 */
  44.             {
  45.                 DMA_ClearFlag(BSP_DMAy_Streamx, BSP_SPI_DMA_TX_FLAG); /* 清除通道传输完成标志 */
  46.                 break;
  47.             }
  48.         }
  49.     }
  50.     while (SPI_I2S_GetFlagStatus(BSP_SPI_PORT, SPI_I2S_FLAG_BSY) == SET); /* 检测发送完成SPI外设处于空闲状态 */
  51.     BSP_SPI_CS_Set();
  52.     SPI_Cmd(BSP_SPI_PORT, DISABLE);                    /* 失能SPI */
  53.     SPI_DataSizeConfig(BSP_SPI_PORT, SPI_DataSize_8b); /* 设置SPI数据传输宽度:8bit */
  54.     SPI_Cmd(BSP_SPI_PORT, ENABLE);                     /* 使能SPI */
  55. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2025-2-14 15:37 | 只看该作者
顶一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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