STM32bug记录之不同IO口不同协议却导致协议冲突

依靠江科大的OLED驱动写了一个简单的UI,但是在使用我自己设计的二级菜单时发现IIC协议的函数和带有SPI的函数放在同一个switch判断的case中时,发生了冲突???这个错误还是我胡乱试出来的。出错代码片段代码如下:

void updatePage_secondpage(int page, int *currentPage, char *prefix, void (*updateLayer)(int)) {
    OLED_Clear();
    *currentPage += page;
    if (*currentPage < 1) *currentPage = 8;
    if (*currentPage > 8) *currentPage = 1;

    OLED_ShowString(0, 0, prefix, OLED_6X8);
    char pageNum[10];
    sprintf(pageNum, "%d", *currentPage);
    OLED_ShowString(40, 0, pageNum, OLED_6X8);
    updateLayer(*currentPage);
    OLED_Update();
}




// 处理子页面导航的函数
void handleSubPageNavigation(int *currentPage, void (*updateLayer)(int), int maxPage) {
    int result;
    while (Botton_Cycle() == 'T');  // 等待按钮释放
    do {
        result = Botton_Cycle();
        switch (result) {
            case 1:  // 往前翻一页
                updatePage_secondpage(-1, currentPage, "Page: ", updateLayer);
                if (*currentPage < 1) *currentPage = maxPage;
                break;
            case 3:  // 往下翻一页
                updatePage_secondpage(1, currentPage, "Page: ", updateLayer);
                if (*currentPage > maxPage) *currentPage = 1;
                break;
            case 'T':  // 确认当前页面
                return;
            default:
                break;
        }
    } while (result != 'T');
}



// 封装的子循环处理函数
void handlePage2Navigation(int *page_2, bool *Page_Loop) {

        handleSubPageNavigation(page_2, OLED_Second_layer, MAX_SUBPAGE);

        if (*page_2 == 1) {
            // 执行IMU1的六轴校准
            // 擦除第二扇区4k,并校准重新写入数据
            
            Gyro_Calibration(&IMU_Input_1, IMU1_Channel);
            Calculate_MPU9250_Mag(&IMU_Input_1,IMU2_Channel);
            W25Q32_SectorErase(IMU1_storage_address);
            EKF_Struct_Arry_Split(IMU_Input_1, IMU1_storage_address, 40);

在这里我用了一个函数指针静态页面函数的方式实现翻页和功能调用,但是当出现包含两个模拟协议出现的地方却发生了执行一个IIC协议后,后续包含IIC协议的函数和SPI协议的函数全都执行不了!解决办法也摸索出来了,就是把包含SPI协议的函数和IIC协议的函数分隔开,放在不同的case中执行就可以了!希望有懂得大哥给咱科普科普,感激不敬!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值