Просмотр исходного кода

use HAL_UARTEx_ReceiveToIdle_DMA in BAN

Juraj Ďuďák 1 год назад
Родитель
Сommit
3b62779064
6 измененных файлов с 95 добавлено и 16 удалено
  1. 1 4
      Core/Inc/app_interface.h
  2. 60 10
      Core/Src/main.c
  3. 20 0
      Core/Src/stm32l0xx_hal_msp.c
  4. 2 0
      Core/Src/stm32l0xx_it.c
  5. 1 1
      Modules/nbus
  6. 11 1
      baModule-slave.ioc

+ 1 - 4
Core/Inc/app_interface.h

@@ -12,11 +12,8 @@
 void led_on();
 void led_off();
 void led_toggle();
-void uart_receive_it(uint8_t *data, int n);
-void uart_abort_receive();
-void timer_uart_start(int n);
-void timer_uart_stop();
 void uart_send(uint8_t *data, int n);
+void uart_receive(uint8_t *data, int n);
 void app_delay(uint8_t);
 
 #endif /* INC_APP_INTERFACE_H_ */

+ 60 - 10
Core/Src/main.c

@@ -65,6 +65,7 @@ TIM_HandleTypeDef htim22;
 
 UART_HandleTypeDef huart2;
 DMA_HandleTypeDef hdma_usart2_tx;
+DMA_HandleTypeDef hdma_usart2_rx;
 
 /* USER CODE BEGIN PV */
 
@@ -85,6 +86,12 @@ static void MX_SPI1_Init(void);
 
 /* Private user code ---------------------------------------------------------*/
 /* USER CODE BEGIN 0 */
+uint8_t data[64];
+uint8_t dataUART[64];
+volatile uint8_t dataL;
+volatile uint8_t dataI;
+volatile uint8_t dataUartReady=0;
+
 inline void uart_send(uint8_t *data, int n)
 {
 #if USE_USART_DMA_TX == 1
@@ -107,11 +114,12 @@ inline void led_toggle(){
 	HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
 }
 
-inline void uart_receive_it(uint8_t *data, int n)
+inline void uart_receive(uint8_t *data, int n)
 {
-	HAL_UART_Receive_IT(&huart2, data, n);
+	HAL_UARTEx_ReceiveToIdle_DMA(&huart2, data, n);
 }
 
+/*
 inline void uart_abort_receive(){
 	HAL_UART_AbortReceive_IT(&huart2);
 }
@@ -125,19 +133,49 @@ inline void timer_uart_start(int n){
 inline void timer_uart_stop(){
 	HAL_TIM_Base_Stop_IT(&htim22);
 }
-
+*/
 inline void app_delay(uint8_t ms){
 	HAL_Delay(ms);
 }
 
+/*
 static inline void nbus_app_UART_RX(UART_HandleTypeDef *huart) {
 	nbus_cb_UART_RX();
+}
+*/
+
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
+
+	HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
+	HAL_UARTEx_ReceiveToIdle_DMA(huart, data, 64);
+	if(dataL==0){
+		dataL = data[0];
+		dataI = 0;
+//		HAL_UARTEx_ReceiveToIdle_DMA(&huart2, data, 64);
+		HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
+		return;
+	}
+	memcpy(&dataUART[dataI], data, Size);
+	dataI += Size;
+	//HAL_UART_Transmit_DMA(huart, dataUART, dataI);
+	if(dataI >= dataL){
+		HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
+		dataL=0;
+		dataI=0;
+		data[0]=0;
+		//nbus_cb_UART_RX(dataUART, dataI);
+		dataUartReady = 1;
+	}
+//	HAL_UARTEx_ReceiveToIdle_DMA(&huart2, data, 64);
+
+
 }
 
+/*
 static inline void nbus_app_TIM_periodElapsed(TIM_HandleTypeDef *htim) {
 	nbus_cb_TIM_periodElapsed();
 }
-
+*/
 
 volatile uint8_t icm_data_ready = 0;
 
@@ -191,6 +229,10 @@ int main(void)
   MX_SPI1_Init();
   /* USER CODE BEGIN 2 */
 
+  dataI=0;
+  dataL=0;
+
+
 #ifdef MODULE_INIT_IP_ADC
   MX_ADC_Init();
 #endif
@@ -205,14 +247,14 @@ int main(void)
 #endif
 
   nBusPlatformInterface_t hw_platform = {
-		  uart_receive_it,
+		  uart_receive,
 		  uart_send,
-		  uart_abort_receive,
+//		  NULL,
 		  led_on,
 		  led_off,
 		  led_toggle,
-		  timer_uart_start,
-		  timer_uart_stop,
+//		  timer_uart_start,
+//		  timer_uart_stop,
 		  app_delay,
 		  loop_callback,
   };
@@ -251,8 +293,8 @@ int main(void)
 	// nbus_set_app_callback(loop_callback);
 #endif
 
-  HAL_UART_RegisterCallback(&huart2, HAL_UART_RX_COMPLETE_CB_ID, nbus_app_UART_RX);
-  HAL_TIM_RegisterCallback(&htim22, HAL_TIM_PERIOD_ELAPSED_CB_ID, nbus_app_TIM_periodElapsed);
+//  HAL_UART_RegisterCallback(&huart2, HAL_UART_RX_COMPLETE_CB_ID, nbus_app_UART_RX);
+//  HAL_TIM_RegisterCallback(&htim22, HAL_TIM_PERIOD_ELAPSED_CB_ID, nbus_app_TIM_periodElapsed);
 
   nBus_MemoryDriver memory_ec20 = {
   		DS28EC20_init,
@@ -263,6 +305,14 @@ int main(void)
 		DS28EC20_getId
   };
 
+  HAL_UARTEx_ReceiveToIdle_DMA(&huart2, data, 64);
+while(1){
+	if (dataUartReady == 1){
+		dataUartReady = 0;
+		HAL_UART_Transmit_DMA(&huart2, dataUART, dataI);
+	}
+}
+
   memory_ec20.init(ONE_WIRE_GPIO_Port, ONE_WIRE_Pin);
   nbus_init_memory_driver(&memory_ec20,16);
 

+ 20 - 0
Core/Src/stm32l0xx_hal_msp.c

@@ -28,6 +28,8 @@ extern DMA_HandleTypeDef hdma_adc;
 
 extern DMA_HandleTypeDef hdma_usart2_tx;
 
+extern DMA_HandleTypeDef hdma_usart2_rx;
+
 /* Private typedef -----------------------------------------------------------*/
 /* USER CODE BEGIN TD */
 
@@ -401,6 +403,23 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
 
     __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
 
+    /* USART2_RX Init */
+    hdma_usart2_rx.Instance = DMA1_Channel5;
+    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;
+    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);
@@ -436,6 +455,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
 
     /* USART2 DMA DeInit */
     HAL_DMA_DeInit(huart->hdmatx);
+    HAL_DMA_DeInit(huart->hdmarx);
 
     /* USART2 interrupt DeInit */
     HAL_NVIC_DisableIRQ(USART2_IRQn);

+ 2 - 0
Core/Src/stm32l0xx_it.c

@@ -60,6 +60,7 @@ extern ADC_HandleTypeDef hadc;
 extern TIM_HandleTypeDef htim21;
 extern TIM_HandleTypeDef htim22;
 extern DMA_HandleTypeDef hdma_usart2_tx;
+extern DMA_HandleTypeDef hdma_usart2_rx;
 extern UART_HandleTypeDef huart2;
 /* USER CODE BEGIN EV */
 
@@ -182,6 +183,7 @@ void DMA1_Channel4_5_6_7_IRQHandler(void)
 
   /* USER CODE END DMA1_Channel4_5_6_7_IRQn 0 */
   HAL_DMA_IRQHandler(&hdma_usart2_tx);
+  HAL_DMA_IRQHandler(&hdma_usart2_rx);
   /* USER CODE BEGIN DMA1_Channel4_5_6_7_IRQn 1 */
 
   /* USER CODE END DMA1_Channel4_5_6_7_IRQn 1 */

+ 1 - 1
Modules/nbus

@@ -1 +1 @@
-Subproject commit 5e72d669952141f67c40a36ad9f4b2be840886fd
+Subproject commit 32813fbb606bb296aca64aa0e0e189992708952d

+ 11 - 1
baModule-slave.ioc

@@ -18,7 +18,17 @@ Dma.ADC.0.Priority=DMA_PRIORITY_MEDIUM
 Dma.ADC.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
 Dma.Request0=ADC
 Dma.Request1=USART2_TX
-Dma.RequestsNb=2
+Dma.Request2=USART2_RX
+Dma.RequestsNb=3
+Dma.USART2_RX.2.Direction=DMA_PERIPH_TO_MEMORY
+Dma.USART2_RX.2.Instance=DMA1_Channel5
+Dma.USART2_RX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART2_RX.2.MemInc=DMA_MINC_ENABLE
+Dma.USART2_RX.2.Mode=DMA_NORMAL
+Dma.USART2_RX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART2_RX.2.PeriphInc=DMA_PINC_DISABLE
+Dma.USART2_RX.2.Priority=DMA_PRIORITY_HIGH
+Dma.USART2_RX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
 Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH
 Dma.USART2_TX.1.Instance=DMA1_Channel4
 Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE