[技术讨论] 正点原子开发板UART通讯连接后不发报文问题

[复制链接]
5055|1
 楼主| 雪奴 发表于 2021-9-14 16:10 | 显示全部楼层 |阅读模式
使用正点原子探索板,HAL库开发。打算将UART2的TX和RX短接测试UART2的接收中断程序是否正常(发送正常,已测试)。但是将TX和RX短接后断开,TX和RX都是只输出高电平,且RX并没有收到任何报文。请问如何让RX正常接收报文?

以下是相关文件的头文件
  1. #ifndef JUDGE_UART
  2. #define JUDGE_UART

  3. #include "changeable for user.h"

  4. typedef union
  5. {
  6.         uint8_t result[4];
  7.         uint32_t input;
  8. }
  9. Message_TRX_Helper;

  10. typedef struct
  11. {
  12.         uint32_t data[3];
  13.         uint8_t mask;
  14. }
  15. Judge_TX_DATA;

  16. typedef struct
  17. {
  18.         Judge_TX_DATA DataIn;
  19.         uint8_t DataOut[20];
  20. }
  21. Judge_TX_Mailbox;

  22. extern Judge_TX_Mailbox Judge_TX_Mailbox1;                                                                    //
  23. extern uint8_t Judge_RX_Mailbox1;                                   //
  24. extern Message_TRX_Helper Message_TRX_Helper1;                           

  25. void Judge_Communicate_Init(void);           //
  26. void Judge_Transmit(void);                   //
  27. void Judge_Receive(void);                    //

  28. #endif




以下是相关文件的源文件
  1. #include "judge_uart.h"
  2. #include "CRC.h"
  3. #include "test for creater.h"

  4. //Judge_Communicate_Init
  5. UART_HandleTypeDef JudgeCom;

  6. //Judge_Transmit/Receive
  7. Judge_TX_Mailbox Judge_TX_Mailbox1;
  8. Message_TRX_Helper Message_TRX_Helper1;
  9. uint8_t Judge_RX_Mailbox1;

  10. void Judge_Communicate_Init(void)
  11. {
  12.         GPIO_InitTypeDef JudgeCom_Tx_Pin;
  13.         GPIO_InitTypeDef JudgeCom_Rx_Pin;
  14.        
  15.         //GPIO
  16.         __HAL_RCC_GPIOA_CLK_ENABLE();
  17.        
  18.         JudgeCom_Tx_Pin.Pin=UART_TX_PIN;
  19.         JudgeCom_Tx_Pin.Mode=GPIO_MODE_AF_PP;
  20.         JudgeCom_Tx_Pin.Pull=GPIO_PULLUP;
  21.         JudgeCom_Tx_Pin.Speed=GPIO_SPEED_FREQ_HIGH;
  22.         JudgeCom_Tx_Pin.Alternate=GPIO_AF7_USART2;
  23.         HAL_GPIO_Init(UART_TX_GPIO,&JudgeCom_Tx_Pin);
  24.        
  25.         JudgeCom_Rx_Pin.Pin=UART_RX_PIN;
  26.         JudgeCom_Rx_Pin.Mode=GPIO_MODE_AF_PP;
  27.         JudgeCom_Rx_Pin.Pull=GPIO_PULLUP;
  28.         JudgeCom_Rx_Pin.Speed=GPIO_SPEED_FREQ_HIGH;
  29.         JudgeCom_Rx_Pin.Alternate=GPIO_AF7_USART2;
  30.         HAL_GPIO_Init(UART_RX_GPIO,&JudgeCom_Rx_Pin);
  31.        
  32.         //UART
  33.         __HAL_RCC_USART2_CLK_ENABLE();
  34.        
  35.         JudgeCom.Instance = USART2;
  36.   JudgeCom.Init.BaudRate = 115200;
  37.   JudgeCom.Init.WordLength = UART_WORDLENGTH_8B;
  38.   JudgeCom.Init.StopBits = UART_STOPBITS_1;
  39.   JudgeCom.Init.Parity = UART_PARITY_NONE;
  40.   JudgeCom.Init.Mode = UART_MODE_TX_RX;
  41.   JudgeCom.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  42.   JudgeCom.Init.OverSampling = UART_OVERSAMPLING_16;
  43.         HAL_UART_Init(&JudgeCom);
  44.        
  45.         HAL_UART_Receive_IT(&JudgeCom,&Judge_RX_Mailbox1,1);
  46. }

  47. /***************************************
  48.             Judge_Transmit
  49. ***************************************/

  50. void Judge_Transmit(void)
  51. {
  52.         //略
  53. }

  54. /***************************************
  55.            Judge_Receive
  56. ***************************************/

  57. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  58. {
  59.                 __HAL_UART_ENABLE_IT(&JudgeCom,UART_IT_RXNE);
  60.        
  61.                 HAL_NVIC_EnableIRQ(USART2_IRQn);
  62.                 HAL_NVIC_SetPriority(USART2_IRQn,3,3);
  63. }

  64. void USART1_IRQHandler(void)                       
  65. {
  66.         uint32_t timeout=0;
  67.        
  68.         HAL_UART_IRQHandler(&JudgeCom);        //
  69.        
  70.         timeout=0;
  71.   while (HAL_UART_GetState(&JudgeCom) != HAL_UART_STATE_READY)
  72.         {
  73.          timeout++;
  74.    if(timeout>HAL_MAX_DELAY) break;               
  75.         }
  76. }

  77. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  78. {
  79.         delay_init(168);
  80.        
  81.         HAL_UART_Receive_IT(&JudgeCom,&Judge_RX_Mailbox1,1);
  82.        
  83.         if(Judge_RX_Mailbox1 != 0x00)
  84.         {
  85.                 HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
  86.         }
  87. }



以下是主函数
  1. int main()
  2. {
  3.         HAL_Init();
  4.         Stm32_Clock_Init(336,8,2,7);
  5.         delay_init(168);
  6.        
  7.         Judge_Communicate_Init();
  8.         delay_ms(50);
  9.        
  10.         Judge_TX_Mailbox1.DataIn.data[0]=0x5555;
  11.         Judge_TX_Mailbox1.DataIn.data[1]=0x5555;
  12.         Judge_TX_Mailbox1.DataIn.data[2]=0x5555;
  13.         Judge_TX_Mailbox1.DataIn.mask=0x55;

  14.         Judge_Communicate_Init();
  15.        
  16.         while(1)
  17.         {
  18.                 Judge_Transmit();
  19.                 delay_us(10);
  20.         }
  21. }


推测是中断函数出了问题
我尝试用keil5调试,但是发送之后所有图标变灰色,用正点原子给的串口中断例程调试出现相同现象,推测是keil5无法进入中断。
 楼主| 雪奴 发表于 2021-9-14 16:30 | 显示全部楼层
在网上查阅资料得知,在中断处理函数中打断点可以进入中断处理函数,但是实操后并没有用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部