如何解决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 举报,一经查实,本站将立刻删除。