Saura il y a 3 mois
Parent
commit
f831f7781a
5 fichiers modifiés avec 144 ajouts et 60 suppressions
  1. 1 0
      Core/Inc/stm32f3xx_it.h
  2. 87 51
      Core/Src/main.c
  3. 20 0
      Core/Src/stm32f3xx_hal_msp.c
  4. 15 1
      Core/Src/stm32f3xx_it.c
  5. 21 8
      nucleo-stm32f302r8.ioc

+ 1 - 0
Core/Inc/stm32f3xx_it.h

@@ -55,6 +55,7 @@ void SVC_Handler(void);
 void DebugMon_Handler(void);
 void PendSV_Handler(void);
 void SysTick_Handler(void);
+void DMA1_Channel6_IRQHandler(void);
 /* USER CODE BEGIN EFP */
 
 /* USER CODE END EFP */

+ 87 - 51
Core/Src/main.c

@@ -47,6 +47,7 @@ SPI_HandleTypeDef hspi2;
 TIM_HandleTypeDef htim1;
 
 UART_HandleTypeDef huart2;
+DMA_HandleTypeDef hdma_usart2_rx;
 
 /* USER CODE BEGIN PV */
 
@@ -55,6 +56,7 @@ UART_HandleTypeDef huart2;
 /* Private function prototypes -----------------------------------------------*/
 void SystemClock_Config(void);
 static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
 static void MX_SPI2_Init(void);
 static void MX_USART2_UART_Init(void);
 static void MX_TIM1_Init(void);
@@ -81,66 +83,83 @@ int _write(int file, char *ptr, int len) {
 
 // ---
 #define PAGE_SIZE 256
+#define RX_BUF_SIZE 1
 
-void uart_receive_audio(void)
+uint8_t rx_buf[RX_BUF_SIZE];
+uint8_t file_data[256];
+uint32_t file_len = 0;
+
+void start_uart_rx(void)
 {
-    uint8_t page_buffer[2048];
-    uint16_t index = 0;
-    uint16_t page = 0;
-    uint32_t total_bytes = 0;
+    HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rx_buf, RX_BUF_SIZE);
+}
+
+/* Этот колб�?к вызывает�?�? при IDLE */
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
+{
+    if (huart->Instance == USART2)
+    {
+        // Копируем данные в общий буфер
+        memcpy(&file_data[file_len], rx_buf, Size);
+        file_len += Size;
+
+        printf("Received chunk: %u bytes (total: %lu)\r\n", Size, file_len);
 
+        start_uart_rx();
+    }
+}
+
+void uart_receive_audio(void)
+{
     printf("=== UART Flash Loader Ready ===\r\n");
     printf("Send your audio file now...\r\n");
 
-    uint8_t byte;
-    uint32_t last_rx_time = HAL_GetTick();
+    start_uart_rx();
 
     while (1)
     {
-        if (HAL_UART_Receive(&huart2, &byte, 1, 10) == HAL_OK)
-        {
-            page_buffer[index++] = byte;
-            last_rx_time = HAL_GetTick();
-            total_bytes++;
-
-            // когда набрали 256 байт — записываем страницу
-            if (index >= 256)
-            {
-//                at45db_write(page, page_buffer, 256);
-//                at45db_wait_ready();
-                printf("Written page %u (%lu bytes)\r\n", page, total_bytes);
-
-                index = 0;
-                page++;
-            }
-        }
-        else
-        {
-            // если 2 секунды тишины — значит передача закончилась
-            if (HAL_GetTick() - last_rx_time > 2000)
-            {
-                if (index > 0)
-                {
-                    // записываем неполную страницу
-//                    at45db_write(page, page_buffer, index);
-//                    at45db_wait_ready();
-                    total_bytes += index;
-                }
-
-                printf("Upload complete. Total %lu bytes written.\r\n", total_bytes);
-
-			  {
-				printf("Data read:\r\n");
-				for (int i = 0; i < page_buffer / 256; i++)
-				{
-					printf("%02X ", page_buffer[i]);
-				}
-				printf("\r\n");
-			  }
-
-                break;
-            }
-        }
+//        	buffer[total_bytes] = tmp_byte;
+//        	total_bytes += 1;
+//        	if (total_bytes >= 256) {
+//        		total_bytes = 0;
+//        		for (int i = 0; i < total_bytes; i += 1) {
+//        			printf("%u", buffer[i]);
+//        		}
+//        	}
+
+
+
+//        if (HAL_UART_Receive(&huart2, &byte, 1, 10) == HAL_OK)
+//        {
+//
+//        }
+//        else
+//        {
+//            // е�?ли 2 �?екунды тишины — значит передача закончила�?ь
+//            if (HAL_GetTick() - last_rx_time > 2000)
+//            {
+//                if (index > 0)
+//                {
+//                    // запи�?ываем неполную �?траницу
+////                    at45db_write(page, page_buffer, index);
+////                    at45db_wait_ready();
+//                    total_bytes += index;
+//                }
+//
+//                printf("Upload complete. Total %lu bytes written.\r\n", total_bytes);
+//
+//			  {
+//				printf("Data read:\r\n");
+//				for (int i = 0; i < page_buffer / 256; i++)
+//				{
+//					printf("%02X ", page_buffer[i]);
+//				}
+//				printf("\r\n");
+//			  }
+//
+//                break;
+//            }
+//        }
     }
 }
 
@@ -175,6 +194,7 @@ int main(void)
 
   /* Initialize all configured peripherals */
   MX_GPIO_Init();
+  MX_DMA_Init();
   MX_SPI2_Init();
   MX_USART2_UART_Init();
   MX_TIM1_Init();
@@ -464,6 +484,22 @@ static void MX_USART2_UART_Init(void)
 
 }
 
+/**
+  * Enable DMA controller clock
+  */
+static void MX_DMA_Init(void)
+{
+
+  /* DMA controller clock enable */
+  __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);
+
+}
+
 /**
   * @brief GPIO Initialization Function
   * @param None

+ 20 - 0
Core/Src/stm32f3xx_hal_msp.c

@@ -24,6 +24,7 @@
 /* USER CODE BEGIN Includes */
 
 /* USER CODE END Includes */
+extern DMA_HandleTypeDef hdma_usart2_rx;
 
 /* Private typedef -----------------------------------------------------------*/
 /* USER CODE BEGIN TD */
@@ -247,6 +248,23 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
     GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
     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_VERY_HIGH;
+    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
+
   /* USER CODE BEGIN USART2_MspInit 1 */
 
   /* USER CODE END USART2_MspInit 1 */
@@ -276,6 +294,8 @@ 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);
   /* USER CODE BEGIN USART2_MspDeInit 1 */
 
   /* USER CODE END USART2_MspDeInit 1 */

+ 15 - 1
Core/Src/stm32f3xx_it.c

@@ -55,7 +55,7 @@
 /* USER CODE END 0 */
 
 /* External variables --------------------------------------------------------*/
-
+extern DMA_HandleTypeDef hdma_usart2_rx;
 /* USER CODE BEGIN EV */
 
 /* USER CODE END EV */
@@ -198,6 +198,20 @@ void SysTick_Handler(void)
 /* please refer to the startup file (startup_stm32f3xx.s).                    */
 /******************************************************************************/
 
+/**
+  * @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 */
+}
+
 /* USER CODE BEGIN 1 */
 
 /* USER CODE END 1 */

+ 21 - 8
nucleo-stm32f302r8.ioc

@@ -2,18 +2,30 @@
 CAD.formats=
 CAD.pinconfig=
 CAD.provider=
+Dma.Request0=USART2_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_VERY_HIGH
+Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
 File.Version=6
 GPIO.groupedBy=Group By Peripherals
 KeepUserPlacement=false
 Mcu.CPN=STM32F302R8T6
 Mcu.Family=STM32F3
-Mcu.IP0=NVIC
-Mcu.IP1=RCC
-Mcu.IP2=SPI2
-Mcu.IP3=SYS
-Mcu.IP4=TIM1
-Mcu.IP5=USART2
-Mcu.IPNb=6
+Mcu.IP0=DMA
+Mcu.IP1=NVIC
+Mcu.IP2=RCC
+Mcu.IP3=SPI2
+Mcu.IP4=SYS
+Mcu.IP5=TIM1
+Mcu.IP6=USART2
+Mcu.IPNb=7
 Mcu.Name=STM32F302R(6-8)Tx
 Mcu.Package=LQFP64
 Mcu.Pin0=PC13
@@ -40,6 +52,7 @@ Mcu.UserName=STM32F302R8Tx
 MxCube.Version=6.10.0
 MxDb.Version=DB.6.0.100
 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false
+NVIC.DMA1_Channel6_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
 NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false
 NVIC.ForceEnableDMAVector=true
 NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false
@@ -129,7 +142,7 @@ ProjectManager.ToolChainLocation=
 ProjectManager.UAScriptAfterPath=
 ProjectManager.UAScriptBeforePath=
 ProjectManager.UnderRoot=true
-ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SPI2_Init-SPI2-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_TIM1_Init-TIM1-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_SPI2_Init-SPI2-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true
 RCC.ADC12outputFreq_Value=64000000
 RCC.AHBFreq_Value=64000000
 RCC.APB1CLKDivider=RCC_HCLK_DIV2