wuzhengmin 发表于 2026-7-6 13:01:24

AiCube如何在STC32G144K246中设置SPI1+DAM+INT?

我曾经在STC32G12K128中用AiCube来驱动TFT 7789彩屏(240*240)


现在搞了快STC32G144K246的板子,发现在AiCube中功能多很多,有点难以操控

这几天想把原来TC32G12K128中用AiCube来驱动TFT 7789彩屏(240*240)的程序

移植到STC32G144K246的板子上,结果遇到问题:


这段程序在STC32G12K128 正常运行,搬运到STC32G144K246就卡死?

哪位大侠帮手看看?


// 全局 DMA 缓冲区叫 pu8SPIDMATxBuffer,大小为 BLOCK_SIZE ( 1024)
// 硬件SPI+DMA彩色清屏函数(RGB565格式,不再按“行”分块,而是按“总字节数”分块。
// 分块传输适配1024字节缓冲区)
void LCD_Fill_Color_RGB565(uint16_t color) // SPI+DMA清屏(RGB565格式)
{
    unsigned int i;
    // 计算屏幕总字节数:宽 * 高 * 2 (RGB565每个像素2字节)
    unsigned long total_len = (unsigned long)LCD_WIDTH * LCD_HEIGHT * 2;
    unsigned long sent_len = 0;
    unsigned int chunk;

    // 将颜色拆分为高低两个字节(适配你的 pu8SPIDMATxBuffer 是 uint8_t 数组)
    uint8_t high_byte = color >> 8;
    uint8_t low_byte = color & 0xFF;

    // 1. 设置全屏显示窗口(只需要在最开始设置一次)
    LCD_Set_Address(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);

    // 2. 拉高 DC(数据模式),拉低 CS(片选使能)
   
    LCD_DC_PIN = 1;
    LCD_CS_PIN = 0;

    // 3. 分块循环通过 DMA 发送纯色数据
    while (sent_len < total_len)
    {
      // 计算本次需要搬运的字节数
      chunk = (total_len - sent_len > BLOCK_SIZE) ? BLOCK_SIZE : (unsigned int)(total_len - sent_len);

      // 【核心修改】将纯色数据填充到 DMA 缓冲区
      // 因为 chunk 是字节数,而 RGB565 一个像素占 2 个字节,所以循环 chunk/2 次
      for (i = 0; i < chunk / 2; i++)
      {
            pu8SPI1DMATxBuffer = high_byte;    // 填充高字节
            pu8SPI1DMATxBuffer = low_byte; // 填充低字节
      }

      // 如果 chunk 是奇数(极小概率发生,但为了严谨),补上最后一个字节
      if (chunk % 2 != 0)
      {
            pu8SPI1DMATxBuffer = high_byte;
      }

      // 触发 DMA 发送(完全复用你图片显示的底层函数)
      TFT_SendData(pu8SPI1DMATxBuffer, chunk);

      // 累加已发送长度
      sent_len += chunk;
    }

    // 4. 传输完毕,释放片选
    LCD_CS_PIN = 1;
}
////////////////////////////////////////
// 发送TFT——7789数据
// 入口参数: dat (数据序列)
//         len (数据长度)
// 函数返回: 无
////////////////////////////////////////
void TFT_SendData(uint8_t *dat, uint16_t len)
{

    // 【核心修复】如果只发1个字节(通常是纯指令),直接走阻塞发送,避免DMA长度为0的BUG
    if (len == 1)
{
      LCD_CS_PIN = 0;
      SPI1_WriteByte(*dat); // 调用SPI底层函数
      LCD_CS_PIN = 1;
      return;
    }

    LCD_CS_PIN = 0;//片选使能


memcpy(pu8SPI1DMATxBuffer, dat, len);       //将数据复制到DMA缓冲区

    DMA_SPI1_SetAmount(len - 1);                //设置DMA发送字节数
    DMA_SPI1_MasterTrigger();                   //触发SPI主机DMA
    fSPIDMABusy = 1;                           //设置DMA传输忙标志
   
    // 【核心修复】必须在这里死等 DMA 传输彻底完成!直接查询全局忙标志位即可
    while (fSPIDMABusy);
    LCD_CS_PIN = 1;                            // 传输彻底完成后,再释放片选
}





32G12K128 发表于 2026-7-7 08:56:40


可以直接用 AICUBE直接生成STC32G144K246对应的程序,
直接移植的话,还是有区别的:



wuzhengmin 发表于 2026-7-7 11:28:26

32G12K128 发表于 2026-7-7 08:56
可以直接用 AICUBE直接生成STC32G144K246对应的程序,
直接移植的话,还是有区别的:



感谢您!我慢慢研究一下,主要是AICUBE 的设置项和直接用寄存器的对应关系,很多时候搞不清楚,资料也不知道去哪里找..........

神农鼎 发表于 2026-7-7 13:54:32

问STC的 【AI助手】

页: [1]
查看完整版本: AiCube如何在STC32G144K246中设置SPI1+DAM+INT?