微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

STM32F3 在这种特殊情况下无法让 UART 工作

如何解决STM32F3 在这种特殊情况下无法让 UART 工作

我无法在两个 STM32F3 discovery 板之间进行非常简单的传输。让我解释一下我在做什么。

我通过 i2c 将板 A 连接到 LCD 20x4,板 B 通过 i2c 连接到 Qrobot 3D 手势传感器,目标是捕捉板 B 的运动,使同一板上的一些 LED 闪烁并发送一个通过 UART (uart4) 到 BoardA 的数字。

问题是,虽然调试显示发生了传输,但实际上Board-A从未进入RxCpltCallback的回调中。在深入探讨更详细的主题之前,让我向您展示代码

这是 Board-A 的 Receive 回调。 (这个问题也被测试通过 Uart4 从另一个 F3 接收(F3 也通过 uart4 发送,但在 BushButton 的回调中))

void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{

switch (recvbuff)
    {

        case 1:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_9);
            lcd_send_string(up);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);

        break; //causa l'uscita immediata dallo switch
        case 2:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);
            lcd_send_string(down);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);


        break;
        case 3:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_11);
            lcd_send_string(left);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);


        break;
        case 4:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_12);
            lcd_send_string(right);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        case 5:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_13);
            lcd_send_string(forward);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        case 6:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_14);
            lcd_send_string(backward);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        case 7:
            HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_15);
            lcd_send_string(clockwise);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        case 8:
            lcd_send_string(anticlockwise);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        case 9:
            lcd_send_string(wave);
            for(int i=0;i<5000000;i++){
                count1=count+1;
            }
            count1=0;

            lcd_send_cmd (0x01);



        break;
        default:

        break;
    }
HAL_UART_Receive_IT(&huart4,(uint8_t*)&recvbuff,sizeof(uint32_t));

}

这似乎工作正常,我认为问题不在这里

让我们看看 Board-B 的代码:这个程序必须在循环中检查一些代表手势的标志,当一个标志发生时,一些 LED 闪烁并通过 huart 发送一个数字,这是一项非常简单的任务!

>
   while (1)
   {
         /* USER CODE END WHILE */
         Gesture_Data = DEV_I2C_ReadWord(PAJ_INT_FLAG1);
            if (Gesture_Data)
            {
            switch (Gesture_Data)
            {
                case PAJ_UP:                         { send(1);
                                                       HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_9);                    
                                                      break;}
                case PAJ_DOWN:                       { send(2);
                                                       HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_13);                                       
                                                       break;}
                case PAJ_LEFT:                       { send(3);
                                                       HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_15);                       
                                                       break;}
                case PAJ_RIGHT:                      { send(4);                                                       
                                                       break;}

                /* other cases */
                default: break;
            }
            Gesture_Data=0;
            DEV_Delay_ms(50);
        }

}

为了通过调试和断点进行测试,我只为传输创建了一个单独的函数(还尝试了 HAL_UART_Transimit(&huart4,(uint8_t *)num,sizeof (uint32_t),HAL_MAX_DELAY)):

void send(uint32_t num)
{
HAL_UART_Transmit_IT(&huart4,sizeof (uint32_t));
}

当我在板上尝试此代码时,传感器识别手势并闪烁正确的 LED,在调试中我可以清楚地看到我进入了 trasmit 的函数 sed() 但没有任何东西到达另一个板上。 P.S:连接两块电路板的每条电缆都工作正常,并且位于正确的引脚上。

你怎么看?我无法摆脱这个问题!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?