找回密码
 立即注册
查看: 249|回复: 4

请教SPI-Flash-Writer-UART例程中的一些问题

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:243
  • 最近打卡:2025-06-16 11:34:59
已绑定手机

25

主题

353

回帖

1868

积分

金牌会员

积分
1868
发表于 2024-11-1 11:36:45 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-11-1 11:43 编辑

SPI-Flash-Writer-UART例程中UART_Process()函数
while (bReadPtr != bWritePtr)  是bReadPtr与bWritePtr不相等再执行里面的语句  ,什么条件不相等呢?是接收到串口数据吗?
dat = _getkey();      _getkey函数中又有个等待bReadPtr与bWritePtr相等 后执行return语句,while (bReadPtr == bWritePtr);又在什么条件下相等呢?

switch (stage)
        {
        default:
        case STG_IDLE:
L_CheckHead:
            if (dat == 'A')
                stage = STG_CMD_HEAD1;
            else
                stage = STG_IDLE;
            break;
        case STG_CMD_HEAD1:
            if (dat == 'I')
                stage = STG_CMD_HEAD2;
            else
                goto L_CheckHead;
            break;
        case STG_CMD_HEAD2:
            if (dat == 'C')
                stage = STG_CMD_HEAD3;
            else
                goto L_CheckHead;
            break;
        case STG_CMD_HEAD3:
            addr = 0;
            len = 0;
            index = 0;

default:    语句为啥又是放在switch里的第一个语句呢,不是放在最后吗



case STG_READ_ADDR0:
        case STG_READ_ADDR1:
        case STG_READ_ADDR2:
        case STG_READ_ADDR3:
        case STG_PROGRAM_ADDR0:
        case STG_PROGRAM_ADDR1:
        case STG_PROGRAM_ADDR2:
        case STG_PROGRAM_ADDR3:
        case STG_ERASE_ADDR0:
        case STG_ERASE_ADDR1:
        case STG_ERASE_ADDR2:
        case STG_ERASE_ADDR3:


为啥又要留这些语句呢?又不会执行什么

求教各位大佬




SPI-Flash-Writer-UART.zip

2.48 MB, 下载次数: 50

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2025-06-17 11:06:43
已绑定手机

29

主题

306

回帖

674

积分

高级会员

积分
674
发表于 2024-11-1 13:07:16 | 显示全部楼层
本帖最后由 小坤 于 2024-11-1 13:09 编辑


BYTE bReadPtr;                 
BYTE bWritePtr;                    
例程中都主注释了 串口的读写指针,这个是典型的环形队形数据的处理机制



       case STG_READ_ADDR0:
        case STG_READ_ADDR1:
        case STG_READ_ADDR2:
        case STG_READ_ADDR3:
        case STG_PROGRAM_ADDR0:
        case STG_PROGRAM_ADDR1:
        case STG_PROGRAM_ADDR2:
        case STG_PROGRAM_ADDR3:
        case STG_ERASE_ADDR0:
        case STG_ERASE_ADDR1:
        case STG_ERASE_ADDR2:
        case STG_ERASE_ADDR3:

            addr <<= 8;
            addr |= dat;
            stage++;
            if (stage == STG_ERASE_DONE)
            {
                switch (cmd)
                {
                case CMD_ERASE_4K:
                    W25Q_Erase4K_20(addr, FALSE);
                    UART_SendData("AIS", 3);
                    stage = STG_IDLE;
                    break;
                case CMD_ERASE_32K:
                    W25Q_Erase32K_52(addr, FALSE);
                    UART_SendData("AIS", 3);
                    stage = STG_IDLE;
                    break;
                case CMD_ERASE_64K:
                    W25Q_Erase64K_D8(addr, FALSE);
                    UART_SendData("AIS", 3);
                    stage = STG_IDLE;
                    break;
                default:
                    goto L_CheckHead;
                }
            }
            break;
以上的case ......条件都是执行下列的程序
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:243
  • 最近打卡:2025-06-16 11:34:59
已绑定手机

25

主题

353

回帖

1868

积分

金牌会员

积分
1868
发表于 2024-11-1 13:34:52 | 显示全部楼层
小*** 发表于 2024-11-1 13:07
BYTE bReadPtr;                 
BYTE bWritePtr;                    
例程中都主注释了 串口的读写指针 ...

还是不明白
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:243
  • 最近打卡:2025-06-16 11:34:59
已绑定手机

25

主题

353

回帖

1868

积分

金牌会员

积分
1868
发表于 2024-11-1 13:43:19 | 显示全部楼层
小*** 发表于 2024-11-1 13:07
BYTE bReadPtr;                 
BYTE bWritePtr;                    
例程中都主注释了 串口的读写指针 ...

char _getkey()  原来这个函数是C51库函数,我还以为是写例程的大佬自定义的函数呢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:243
  • 最近打卡:2025-06-16 11:34:59
已绑定手机

25

主题

353

回帖

1868

积分

金牌会员

积分
1868
发表于 2024-11-1 14:06:37 | 显示全部楼层
整明白了一些,分享下,串口接收到数据进入中断 bWritePtr++, UART_Process()  函数  while (bReadPtr != bWritePtr)语句成立,往下执行dat = _getkey();语句,读取缓冲区数据并返回;同时bReadPtr++,bWritePtr也就跟bReadPtr相等,程序再往下执行,判断是否接收到“AIC”指令,再往下执行......
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 20:54 , Processed in 0.121728 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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