硬汉嵌入式论坛

 找回密码
 立即注册
查看: 544|回复: 3
收起左侧

[STM32H7] [求助帖]STM32H7+SPI+ST7796代码玄学运行

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2023-7-23 11:41:10 | 显示全部楼层 |阅读模式
本帖最后由 Nino 于 2023-7-23 11:52 编辑

问题情况:

同样的代码, 在仿真模式下(加入断点)可以正常工作, 但是烧录进MCU后便无效, ST7789初始化不成功
void LCD_Init(void) {
    LCD_RES_Clr();
    osDelay(1);
    LCD_RES_Set();
    osDelay(200);

    //************* Start Initial Sequence **********//
    LCD_WR_REG(0x11); //第一个断点
    //osDelay(200);    //Delay 120ms
    //************* Start Initial Sequence **********//
//    LCD_WR_REG(0Xf0);
//    LCD_WR_DATA8(0xc3);
//    LCD_WR_REG(0Xf0);
//    LCD_WR_DATA8(0x96);
    LCD_WR_REG(0x36);    // Memory Access Control
    if (USE_HORIZONTAL == 0)LCD_WR_DATA8(0x48);
    else if (USE_HORIZONTAL == 1)LCD_WR_DATA8(0x88);
    else if (USE_HORIZONTAL == 2)LCD_WR_DATA8(0x28);
    else LCD_WR_DATA8(0xE8);

    LCD_WR_REG(0x3A);
    LCD_WR_DATA8(0x65);

    /* Porch Setting */
    LCD_WR_REG(0xB2);
    LCD_WR_DATA8(0x0C);
    LCD_WR_DATA8(0x0C);
    LCD_WR_DATA8(0x00);
    LCD_WR_DATA8(0x33);
    LCD_WR_DATA8(0x33);

    /*  Gate Control */
    LCD_WR_REG(0xB7);
    LCD_WR_DATA8(0x72);

    /* VCOM Setting */
    LCD_WR_REG(0xBB);
    LCD_WR_DATA8(0x3D);   //Vcom=1.625V

    /* LCM Control */
    LCD_WR_REG(0xC0);
    LCD_WR_DATA8(0x2C);

    /* VDV and VRH Command Enable */
    LCD_WR_REG(0xC2);
    LCD_WR_DATA8(0x01);

    /* VRH Set */
    LCD_WR_REG(0xC3);
    LCD_WR_DATA8(0x19);

    /* VDV Set */
    LCD_WR_REG(0xC4);
    LCD_WR_DATA8(0x20);

    /* Frame Rate Control in Normal Mode */
    LCD_WR_REG(0xC6);
    LCD_WR_DATA8(0x0F);

    /* Power Control 1 */
    LCD_WR_REG(0xD0);
    LCD_WR_DATA8(0xA4);
    LCD_WR_DATA8(0xA1);

    /* Positive Voltage Gamma Control */
    LCD_WR_REG(0xE0);
    LCD_WR_DATA8(0xD0);
    LCD_WR_DATA8(0x04);
    LCD_WR_DATA8(0x0D);
    LCD_WR_DATA8(0x11);
    LCD_WR_DATA8(0x13);
    LCD_WR_DATA8(0x2B);
    LCD_WR_DATA8(0x3F);
    LCD_WR_DATA8(0x54);
    LCD_WR_DATA8(0x4C);
    LCD_WR_DATA8(0x18);
    LCD_WR_DATA8(0x0D);
    LCD_WR_DATA8(0x0B);
    LCD_WR_DATA8(0x1F);
    LCD_WR_DATA8(0x23);

    /* Negative Voltage Gamma Control */
    LCD_WR_REG(0xE1);
    LCD_WR_DATA8(0xD0);
    LCD_WR_DATA8(0x04);
    LCD_WR_DATA8(0x0C);
    LCD_WR_DATA8(0x11);
    LCD_WR_DATA8(0x13);
    LCD_WR_DATA8(0x2C);
    LCD_WR_DATA8(0x3F);
    LCD_WR_DATA8(0x44);
    LCD_WR_DATA8(0x51);
    LCD_WR_DATA8(0x2F);
    LCD_WR_DATA8(0x1F);
    LCD_WR_DATA8(0x1F);
    LCD_WR_DATA8(0x20);
    LCD_WR_DATA8(0x23);

    /* Display Inversion On */
    //LCD_WR_REG(0x21);

    LCD_WR_REG(0x29);//第二个断点
    //osDelay(100);

    LCD_Address_Set(0, 0, LCD_W - 1, LCD_H - 1);
    LCD_Fill(0, 0, LCD_W - 1, LCD_H - 1, BLACK);
}


猜测原因:
1. 时序问题, 但是调节分频系数后, 将硬件SPI速率降低至12M时依旧无效
2. 初始化时需要一定延时来保证运行稳定, 如代码处 在打断点的地方加入了一定时长的延时,无法正常工作
3. 优先级问题. 但目前没有给SPI加入中断处理, 在RTOS的任务中, LCD初始化/显示的任务也是最高优先级, 但个人认为不是这个问题, 因为仿真下可以正常运行
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2023-7-23 12:39:11 | 显示全部楼层
问题已解决, 我将这个init函数置于了临界区保护段之中, 去掉临界区保护便可以正常初始化与运行, 但具体原因还不清楚
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2023-7-24 08:06:36 | 显示全部楼层
Nino 发表于 2023-7-23 12:39
问题已解决, 我将这个init函数置于了临界区保护段之中, 去掉临界区保护便可以正常初始化与运行, 但具体原因 ...

临界保护区中,导致延迟函数无法正常执行。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2023-7-24 10:03:15 | 显示全部楼层
eric2013 发表于 2023-7-24 08:06
临界保护区中,导致延迟函数无法正常执行。

硬汉哥说的对 睡了一觉想明白了 因为延时函数用了osDelay, 进了临界保护便会导致其无法正常进行中断计时, 导致osDelay处卡死
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 03:00 , Processed in 0.159094 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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