Browse Source

成功配置蓝牙模块为观察值模式(AT+ROLE=2),成功接收蓝牙数据。这里需要重启一次。

xuxinyi 3 months ago
parent
commit
feb7e0aa22
6 changed files with 124 additions and 62 deletions
  1. 2 1
      Core/Inc/stm32f1xx_it.h
  2. 13 12
      Core/Src/main.c
  3. 26 21
      Core/Src/stm32f1xx_hal_msp.c
  4. 29 16
      Core/Src/stm32f1xx_it.c
  5. 12 11
      lora_bl.ioc
  6. 42 1
      问题记录/问题笔记.md

+ 2 - 1
Core/Inc/stm32f1xx_it.h

@@ -55,9 +55,10 @@ void SVC_Handler(void);
 void DebugMon_Handler(void);
 void PendSV_Handler(void);
 void SysTick_Handler(void);
-void DMA1_Channel6_IRQHandler(void);
+void DMA1_Channel3_IRQHandler(void);
 void TIM3_IRQHandler(void);
 void USART2_IRQHandler(void);
+void USART3_IRQHandler(void);
 /* USER CODE BEGIN EFP */
 
 /* USER CODE END EFP */

+ 13 - 12
Core/Src/main.c

@@ -43,7 +43,7 @@
 UART_HandleTypeDef huart1;
 UART_HandleTypeDef huart2;
 UART_HandleTypeDef huart3;
-DMA_HandleTypeDef hdma_usart2_rx;
+DMA_HandleTypeDef hdma_usart3_rx;
 
 /* USER CODE BEGIN PV */
 uint8_t rx_buf[500];
@@ -121,12 +121,15 @@ int main(void)
   MX_USART3_UART_Init();
   /* USER CODE BEGIN 2 */
   // 启动 USART2 DMA 接收
-  HAL_UART_Receive_DMA(&huart2, rx_buf, sizeof(rx_buf));
+  HAL_UART_Receive_DMA(&huart3, rx_buf, sizeof(rx_buf));
   // 使能 USART2 空闲中断
-  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
+  __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
 
-  printf("USART2 DMA + IDLE 中断接收已启动\r\n");
-  uint8_t i = 0xaa;
+  printf("USART3 DMA + IDLE 中断接收已启动\r\n");
+  // 发送一个字符串到UART2
+  const char *msg = "AT+ROLE=2";  // 建议加上回车换行
+  HAL_UART_Transmit(&huart3, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY);
+  // uint8_t i = 0xaa;
   /* USER CODE END 2 */
 
   /* Infinite loop */
@@ -137,10 +140,8 @@ int main(void)
     // 用 printf 输出(printf 已经重定向到 USART2)
     // printf("hello world task 2\r\n");
 
-    // 发送一个字符串到UART2
-    const char *msg = "12345hhl789099999999999999999999999999999999999999999999999999999999899999999999999999999999999999999999999999999fdasfdeqrftewqtrewfgdaf9999999999999fdasffdsafdsafdsafdsafddsafsdddddddddddddddddd88888888888888888888888888888888888888888ddddddddddddddddddssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss99999999999999999999999999999999999999999990078rewqreqwrewqrewqfdsafdsafewqfdsafewqfdsafew  fdsafe77xxy888";
-    // HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
-    //
+
+
     // printf("Received data: %s\r\n", rx_buf);
     // memset(rx_buf, '\0', 500);
     // printf("%02X\r\n",i++);
@@ -302,9 +303,9 @@ static void MX_DMA_Init(void)
   __HAL_RCC_DMA1_CLK_ENABLE();
 
   /* DMA interrupt init */
-  /* DMA1_Channel6_IRQn interrupt configuration */
-  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
-  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
+  /* DMA1_Channel3_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
 
 }
 

+ 26 - 21
Core/Src/stm32f1xx_hal_msp.c

@@ -23,7 +23,7 @@
 /* USER CODE BEGIN Includes */
 
 /* USER CODE END Includes */
-extern DMA_HandleTypeDef hdma_usart2_rx;
+extern DMA_HandleTypeDef hdma_usart3_rx;
 
 /* Private typedef -----------------------------------------------------------*/
 /* USER CODE BEGIN TD */
@@ -141,23 +141,6 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
-    /* USART2 DMA Init */
-    /* USART2_RX Init */
-    hdma_usart2_rx.Instance = DMA1_Channel6;
-    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
-    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
-    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
-    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
-    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
-    hdma_usart2_rx.Init.Mode = DMA_NORMAL;
-    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_HIGH;
-    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
-    {
-      Error_Handler();
-    }
-
-    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
-
     /* USART2 interrupt Init */
     HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
     HAL_NVIC_EnableIRQ(USART2_IRQn);
@@ -188,6 +171,26 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
+    /* USART3 DMA Init */
+    /* USART3_RX Init */
+    hdma_usart3_rx.Instance = DMA1_Channel3;
+    hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart3_rx.Init.Mode = DMA_NORMAL;
+    hdma_usart3_rx.Init.Priority = DMA_PRIORITY_HIGH;
+    if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx);
+
+    /* USART3 interrupt Init */
+    HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
+    HAL_NVIC_EnableIRQ(USART3_IRQn);
     /* USER CODE BEGIN USART3_MspInit 1 */
 
     /* USER CODE END USART3_MspInit 1 */
@@ -235,9 +238,6 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
     */
     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
 
-    /* USART2 DMA DeInit */
-    HAL_DMA_DeInit(huart->hdmarx);
-
     /* USART2 interrupt DeInit */
     HAL_NVIC_DisableIRQ(USART2_IRQn);
     /* USER CODE BEGIN USART2_MspDeInit 1 */
@@ -258,6 +258,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
     */
     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
 
+    /* USART3 DMA DeInit */
+    HAL_DMA_DeInit(huart->hdmarx);
+
+    /* USART3 interrupt DeInit */
+    HAL_NVIC_DisableIRQ(USART3_IRQn);
     /* USER CODE BEGIN USART3_MspDeInit 1 */
 
     /* USER CODE END USART3_MspDeInit 1 */

+ 29 - 16
Core/Src/stm32f1xx_it.c

@@ -21,7 +21,6 @@
 #include "main.h"
 #include "stm32f1xx_it.h"
 #include "string.h"
-#include <stdio.h>
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
 /* USER CODE END Includes */
@@ -57,8 +56,9 @@
 /* USER CODE END 0 */
 
 /* External variables --------------------------------------------------------*/
-extern DMA_HandleTypeDef hdma_usart2_rx;
+extern DMA_HandleTypeDef hdma_usart3_rx;
 extern UART_HandleTypeDef huart2;
+extern UART_HandleTypeDef huart3;
 extern TIM_HandleTypeDef htim3;
 
 /* USER CODE BEGIN EV */
@@ -204,17 +204,17 @@ void SysTick_Handler(void)
 /******************************************************************************/
 
 /**
-  * @brief This function handles DMA1 channel6 global interrupt.
+  * @brief This function handles DMA1 channel3 global interrupt.
   */
-void DMA1_Channel6_IRQHandler(void)
+void DMA1_Channel3_IRQHandler(void)
 {
-  /* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
+  /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
 
-  /* USER CODE END DMA1_Channel6_IRQn 0 */
-  HAL_DMA_IRQHandler(&hdma_usart2_rx);
-  /* USER CODE BEGIN DMA1_Channel6_IRQn 1 */
+  /* USER CODE END DMA1_Channel3_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart3_rx);
+  /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
 
-  /* USER CODE END DMA1_Channel6_IRQn 1 */
+  /* USER CODE END DMA1_Channel3_IRQn 1 */
 }
 
 /**
@@ -241,18 +241,31 @@ void USART2_IRQHandler(void)
   /* USER CODE END USART2_IRQn 0 */
   HAL_UART_IRQHandler(&huart2);
   /* USER CODE BEGIN USART2_IRQn 1 */
-  if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
+
+  /* USER CODE END USART2_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART3 global interrupt.
+  */
+void USART3_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART3_IRQn 0 */
+
+  /* USER CODE END USART3_IRQn 0 */
+  HAL_UART_IRQHandler(&huart3);
+  /* USER CODE BEGIN USART3_IRQn 1 */
+  if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
   {
-    __HAL_UART_CLEAR_IDLEFLAG(&huart2);
-    HAL_UART_DMAStop(&huart2);
+    __HAL_UART_CLEAR_IDLEFLAG(&huart3);
+    HAL_UART_DMAStop(&huart3);
 
-    uint32_t received_len = sizeof(rx_buf) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
-    // printf("Received %lu bytes: %.*s\r\n", received_len, (int)received_len, rx_buf);
+    uint32_t received_len = sizeof(rx_buf) - __HAL_DMA_GET_COUNTER(huart3.hdmarx);
     HAL_UART_Transmit(&huart1, rx_buf, received_len, 100);
     memset(rx_buf, 0, sizeof(rx_buf));
-    HAL_UART_Receive_DMA(&huart2, rx_buf, sizeof(rx_buf)); // 重新启动
+    HAL_UART_Receive_DMA(&huart3, rx_buf, sizeof(rx_buf)); // 重新启动
   }
-  /* USER CODE END USART2_IRQn 1 */
+  /* USER CODE END USART3_IRQn 1 */
 }
 
 /* USER CODE BEGIN 1 */

+ 12 - 11
lora_bl.ioc

@@ -2,17 +2,17 @@
 CAD.formats=
 CAD.pinconfig=
 CAD.provider=
-Dma.Request0=USART2_RX
+Dma.Request0=USART3_RX
 Dma.RequestsNb=1
-Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY
-Dma.USART2_RX.0.Instance=DMA1_Channel6
-Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
-Dma.USART2_RX.0.MemInc=DMA_MINC_ENABLE
-Dma.USART2_RX.0.Mode=DMA_NORMAL
-Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
-Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE
-Dma.USART2_RX.0.Priority=DMA_PRIORITY_HIGH
-Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
+Dma.USART3_RX.0.Direction=DMA_PERIPH_TO_MEMORY
+Dma.USART3_RX.0.Instance=DMA1_Channel3
+Dma.USART3_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART3_RX.0.MemInc=DMA_MINC_ENABLE
+Dma.USART3_RX.0.Mode=DMA_NORMAL
+Dma.USART3_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART3_RX.0.PeriphInc=DMA_PINC_DISABLE
+Dma.USART3_RX.0.Priority=DMA_PRIORITY_HIGH
+Dma.USART3_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
 File.Version=6
 GPIO.groupedBy=Group By Peripherals
 KeepUserPlacement=false
@@ -46,7 +46,7 @@ Mcu.UserName=STM32F103C8Tx
 MxCube.Version=6.15.0
 MxDb.Version=DB.6.0.150
 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
-NVIC.DMA1_Channel6_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
+NVIC.DMA1_Channel3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
 NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 NVIC.ForceEnableDMAVector=true
 NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
@@ -60,6 +60,7 @@ NVIC.TIM3_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true
 NVIC.TimeBase=TIM3_IRQn
 NVIC.TimeBaseIP=TIM3
 NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
+NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 PA10.Mode=Asynchronous
 PA10.Signal=USART1_RX

+ 42 - 1
问题记录/问题笔记.md

@@ -3,4 +3,45 @@
 2. 串口接收的坑:
    HAL_UART_Receive_IT(&huart2, &rx_buffer, 20);
     这里如果串口约定了20字节,那么触发这个回调的条件之一就是,串口接收到20字节。如果发生的字节数不够,那么不会触发,等待你下一次发生
-    数据。直到接收到20个字节,才会触发。会导致混乱。所以改成单字节获取。这样就可以接收不定长串口的数据了。
+    数据。直到接收到20个字节,才会触发。会导致混乱。所以改成单字节获取。这样就可以接收不定长串口的数据了。
+3. 串口数据解析:
+   1E B1 58 52 D0 30:设备mac
+    原报文:
+   26 
+   1E B1 58 52 D0 30 
+   B8 
+   1E 01 06 19 16 F7 FD 01 32 1D 48 85 C0 C5 4C 11 A9 B3 B6 DF B8 CD 91 E3 40 EE 2A DA 03 1B D5 
+
+
+   26 
+   AF 3C 43 AC EC 1B 
+   BA 
+   1E FF 06 00 01 09 20 02 C5 F3 5C 7C 4A 7C 87 0B DE 45 AA 9C 14 A9 ED 58 F6 6F 4A 00 54 B7 EE 
+   
+   25 
+   1B 4E 6F E2 42 2D 
+   AB 
+   02 01 06 1A FF 4C 00 02 15 26 86 F3 9C BA DA 46 58 85 4A A6 2E 7E 5E 8B 8D 00 01 00 00 0B 
+   
+   15 
+   FF 12 CC 3E 2D 54 
+   00 
+   00 20 48 0F C5 78 47 87 48 0F C5 78 47 87 
+   
+   26 
+   6E 5E 3E B6 B9 17 
+   AE 
+   1E FF 06 00 01 09 20 22 D3 BD 05 1B 37 DA D1 9B 1D 34 16 85 95 68 AE 8D D6 1D B5 D1 75 13 CB 
+   
+   26 
+   1E B1 58 52 D0 30 
+   BD 
+   1E FF 06 00 01 0F 20 02 C5 54 37 1F 8C A7 ED A9 9B B7 52 6D 59 7C E1 B0 65 00 59 D6 60 3D 42 
+   
+   26 
+   2E 74 18 2E F8 10 
+   B3 
+   1E FF 06 00 01 09 20 22 5E 45 E1 50 B5 B5 9A 5D 82 63 24 D9 57 44 D2 3A 02 C5 4B D5 C7 3B 3F 
+   
+   1D 
+   9E B9 6C C5 0F 48 A8 15 FF 12 CC 3E 2D 54 00 00 20 48 0F C5 78 47 87 48 0F C5 78 47 87 25 71 0B 1D 60 C8 F0 B6 02 01 06 1A FF 4C 00 02 15 FD A5 06 93 A4 E2 4F B1 AF CF C6 EB 07 64 78 25 2A 32 0B 71 C3