فهرست منبع

添加lora发送回调。返回success,继续发生

xuxinyi 2 ماه پیش
والد
کامیت
f5f331426d
6فایلهای تغییر یافته به همراه110 افزوده شده و 7 حذف شده
  1. 3 0
      Core/Inc/main.h
  2. 1 0
      Core/Inc/stm32f1xx_it.h
  3. 21 5
      Core/Src/main.c
  4. 22 0
      Core/Src/stm32f1xx_hal_msp.c
  5. 50 0
      Core/Src/stm32f1xx_it.c
  6. 13 2
      lora_bl.ioc

+ 3 - 0
Core/Inc/main.h

@@ -60,6 +60,9 @@ void Error_Handler(void);
 
 /* USER CODE BEGIN Private defines */
 extern uint8_t rx_buf[100];
+extern uint8_t rx_buf_uart2[100];
+extern  uint8_t loraSendNextDataFlag;
+// extern uint8_t loraDataErrorCount;
 extern uint8_t totalData[30][100];
 extern uint8_t workMode;  // 0: 接收蓝牙数据 1: 使用lora发生数据。
 extern uint8_t receiveBlDataCount;

+ 1 - 0
Core/Inc/stm32f1xx_it.h

@@ -56,6 +56,7 @@ void DebugMon_Handler(void);
 void PendSV_Handler(void);
 void SysTick_Handler(void);
 void DMA1_Channel3_IRQHandler(void);
+void DMA1_Channel6_IRQHandler(void);
 void TIM3_IRQHandler(void);
 void USART2_IRQHandler(void);
 void USART3_IRQHandler(void);

+ 21 - 5
Core/Src/main.c

@@ -49,12 +49,16 @@
 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[100] = {0};
+uint8_t rx_buf_uart2[100] = {0};
 uint8_t totalData[30][100] = {0};
 uint8_t uart2_rx_byte[10] = {0};
+uint8_t loraSendNextDataFlag = 0;
+// uint8_t loraDataErrorCount = 0;
 uint8_t workMode = 0;  // 0: 接收蓝牙数据 1: 使用lora发生数据 2:等待间隔时间
 uint8_t receiveBlDataCount = 0;
 /* USER CODE END PV */
@@ -97,11 +101,10 @@ int __io_putchar(int ch)
 
 void sentLoraData(uint8_t  sendDataNum) {
   HAL_UART_Transmit(&huart2, totalData[sendDataNum], 8, HAL_MAX_DELAY);
-  memset(totalData[sendDataNum], 0, sizeof(totalData[sendDataNum]));
 }
 
 uint8_t randomFun() {
-  return rand() % 60 + 120; //随机时间1分钟到3分钟之间随机数
+  return rand() % 20 + 60; //随机时间1分钟到3分钟之间随机数
 }
 /* USER CODE END 0 */
 
@@ -144,6 +147,10 @@ int main(void)
   // HAL_UART_Receive_IT(&huart2, uart2_rx_byte, 7);
   // 使能 USART2 空闲中断
   __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
+  HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf));
+  // HAL_UART_Receive_IT(&huart2, uart2_rx_byte, 7);
+  // 使能 USART2 空闲中断
+  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
 
   E104_BT5005A_ROLE_Fun();
   E104_BT5005A_SCANINTV_Fun();
@@ -167,7 +174,7 @@ int main(void)
     /* USER CODE END WHILE */
     if (workMode == 0) {  // 接收蓝牙数据
       printf("接收中第%d秒,接受了%d位数据\r\n", count, receiveBlDataCount);
-      if (count > 4) { //搜10秒数据
+      if (count > 10) { //搜10秒数据
         E104_BT5005A_SLEEP_Fun();
         HAL_Delay(5);//等待蓝牙模块进入睡眠模式
         // receiveBlDataCount = 0;
@@ -177,13 +184,19 @@ int main(void)
         count++;
       }
     }else if (workMode == 1) { // 发送数据给Lora
-
       printf("发送第%d个数据,总数据大小为%d\r\n", count,receiveBlDataCount);
       if (count < receiveBlDataCount)
       {
         // 启动 USART2 DMA 接收
         sentLoraData(count);
-        count++;
+        HAL_Delay(3);
+        if (loraSendNextDataFlag == 0 || loraSendNextDataFlag > 3) {
+          memset(totalData[count], 0, sizeof(totalData[count]));
+          count++;
+          loraSendNextDataFlag = 0;
+        }else  {
+          printf("send error!\r\n");
+        }
       }else {
         receiveBlDataCount = 0;
         workMode = 2;
@@ -362,6 +375,9 @@ static void MX_DMA_Init(void)
   /* DMA1_Channel3_IRQn interrupt configuration */
   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
+  /* DMA1_Channel6_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
 
 }
 

+ 22 - 0
Core/Src/stm32f1xx_hal_msp.c

@@ -23,6 +23,8 @@
 /* USER CODE BEGIN Includes */
 
 /* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_usart2_rx;
+
 extern DMA_HandleTypeDef hdma_usart3_rx;
 
 /* Private typedef -----------------------------------------------------------*/
@@ -141,6 +143,23 @@ 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);
@@ -238,6 +257,9 @@ 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 */

+ 50 - 0
Core/Src/stm32f1xx_it.c

@@ -60,10 +60,12 @@
 /* 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 */
 
 /* USER CODE END EV */
@@ -220,6 +222,20 @@ void DMA1_Channel3_IRQHandler(void)
   /* USER CODE END DMA1_Channel3_IRQn 1 */
 }
 
+/**
+  * @brief This function handles DMA1 channel6 global interrupt.
+  */
+void DMA1_Channel6_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Channel6_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_Channel6_IRQn 1 */
+}
+
 /**
   * @brief This function handles TIM3 global interrupt.
   */
@@ -243,11 +259,45 @@ void USART2_IRQHandler(void)
 
   /* USER CODE END USART2_IRQn 0 */
   HAL_UART_IRQHandler(&huart2);
+
+  // 检测空闲中断
+  if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
+  {
+    __HAL_UART_CLEAR_IDLEFLAG(&huart2);    // 清除空闲标志
+    HAL_UART_DMAStop(&huart2);             // 停止 DMA
+
+    // 计算接收到的数据长度
+    uint32_t received_len = sizeof(rx_buf_uart2) - __HAL_DMA_GET_COUNTER(huart2.hdmarx);
+
+    // 检查是否收到 "SUCCESS"
+    if (received_len >= 7 && strncmp((char *)rx_buf_uart2, "SUCCESS", 7) == 0 && workMode == 1)
+    {
+      // TODO: 收到 SUCCESS 后执行的代码
+      printf("发生成功:%s\r\n",rx_buf_uart2);
+      loraSendNextDataFlag = 0;
+    }else if (workMode == 1) {
+      if (loraSendNextDataFlag > 3)
+      {
+        // loraSendNextDataFlag = 99;//0表示发送成功。99表示发送超时。 >0 <99表示发送失败,重新发送。
+        printf("发送数据:失败。继续发生下一个数据\r\n");
+      }else {
+        loraSendNextDataFlag++;
+      }
+    }
+
+    // 清空缓冲区(可选)
+    memset(rx_buf_uart2, 0, sizeof(rx_buf_uart2));
+
+    // 重新开启 DMA 接收
+    HAL_UART_Receive_DMA(&huart2, rx_buf_uart2, sizeof(rx_buf_uart2));
+  }
+
   /* USER CODE BEGIN USART2_IRQn 1 */
 
   /* USER CODE END USART2_IRQn 1 */
 }
 
+
 /**
   * @brief This function handles USART3 global interrupt.
   */

+ 13 - 2
lora_bl.ioc

@@ -3,7 +3,17 @@ CAD.formats=
 CAD.pinconfig=
 CAD.provider=
 Dma.Request0=USART3_RX
-Dma.RequestsNb=1
+Dma.Request1=USART2_RX
+Dma.RequestsNb=2
+Dma.USART2_RX.1.Direction=DMA_PERIPH_TO_MEMORY
+Dma.USART2_RX.1.Instance=DMA1_Channel6
+Dma.USART2_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART2_RX.1.MemInc=DMA_MINC_ENABLE
+Dma.USART2_RX.1.Mode=DMA_NORMAL
+Dma.USART2_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART2_RX.1.PeriphInc=DMA_PINC_DISABLE
+Dma.USART2_RX.1.Priority=DMA_PRIORITY_HIGH
+Dma.USART2_RX.1.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
@@ -47,6 +57,7 @@ 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_Channel3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
+NVIC.DMA1_Channel6_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
@@ -114,7 +125,7 @@ ProjectManager.ToolChainLocation=
 ProjectManager.UAScriptAfterPath=
 ProjectManager.UAScriptBeforePath=
 ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true,7-MX_RTC_Init-RTC-false-HAL-true
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true
 RCC.ADCFreqValue=18000000
 RCC.AHBCLKDivider=RCC_SYSCLK_DIV2
 RCC.AHBFreq_Value=36000000