|
|
@@ -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
|