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; // 传输彻底完成后,再释放片选
}
可以直接用 AICUBE直接生成STC32G144K246对应的程序,
直接移植的话,还是有区别的:
32G12K128 发表于 2026-7-7 08:56
可以直接用 AICUBE直接生成STC32G144K246对应的程序,
直接移植的话,还是有区别的:
感谢您!我慢慢研究一下,主要是AICUBE 的设置项和直接用寄存器的对应关系,很多时候搞不清楚,资料也不知道去哪里找.......... 问STC的 【AI助手】
页:
[1]