找回密码
 立即注册
查看: 74|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:209
  • 最近打卡:2026-07-17 10:26:30
已绑定手机

27

主题

2667

回帖

3441

积分

论坛元老

积分
3441
发表于 2026-7-6 13:01:24 | 显示全部楼层 |阅读模式
我曾经在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[i * 2] = high_byte;    // 填充高字节
            pu8SPI1DMATxBuffer[i * 2 + 1] = low_byte; // 填充低字节
        }

        // 如果 chunk 是奇数(极小概率发生,但为了严谨),补上最后一个字节
        if (chunk % 2 != 0)
        {
            pu8SPI1DMATxBuffer[chunk - 1] = 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;                            // 传输彻底完成后,再释放片选
}





回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:149
  • 最近打卡:2026-07-21 08:54:57

39

主题

543

回帖

3327

积分

超级版主

积分
3327
发表于 2026-7-7 08:56:40 | 显示全部楼层

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

截图202607070856272678.jpg
电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:209
  • 最近打卡:2026-07-17 10:26:30
已绑定手机

27

主题

2667

回帖

3441

积分

论坛元老

积分
3441
发表于 2026-7-7 11:28:26 | 显示全部楼层
32G12*** 发表于 2026-7-7 08:56
可以直接用 AICUBE直接生成  STC32G144K246对应的程序,
直接移植的话,还是有区别的:

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-7-7 13:54:32 | 显示全部楼层
问STC的 【AI助手】
截图202607071354263181.jpg
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-22 09:16 , Processed in 0.070972 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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