diff --git a/include/main.h b/include/main.h index 864f8bc..70e84f5 100644 --- a/include/main.h +++ b/include/main.h @@ -44,6 +44,7 @@ TIM_HandleTypeDef htim2; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; +DMA_HandleTypeDef hdma_usart2_rx; /* USER CODE END ET */ diff --git a/include/stm32l0xx_it.h b/include/stm32l0xx_it.h index 9733211..e62a3ae 100644 --- a/include/stm32l0xx_it.h +++ b/include/stm32l0xx_it.h @@ -53,7 +53,9 @@ void PendSV_Handler(void); void SysTick_Handler(void); void RTC_IRQHandler(void); void EXTI4_15_IRQHandler(void); +void DMA1_Channel4_5_6_7_IRQHandler(void); void TIM2_IRQHandler(void); +void USART2_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/src/main.c b/src/main.c index 3cf5b62..6cfbd06 100644 --- a/src/main.c +++ b/src/main.c @@ -41,7 +41,9 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ -#define BUFFER_SIZE 1024 +#define BUFFER_SIZE 1024 +#define RxBuf_SIZE 512 +#define MainBuf_SIZE 1024 /* USER CODE END PD */ @@ -52,7 +54,12 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ -char floatBuffer[20]; +uint8_t RxBuf[RxBuf_SIZE]; +uint8_t MainBuf[MainBuf_SIZE]; + +uint16_t sml_frame_size; + + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -61,6 +68,7 @@ static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); +static void MX_DMA_Init(void); static void MX_TIM2_Init(void); static void MX_RTC_Init(void); /* USER CODE BEGIN PFP */ @@ -70,8 +78,6 @@ static void MX_RTC_Init(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -uint8_t sml_frame[BUFFER_SIZE]; - double T1Wh = -2, SumWh = -2; typedef struct { @@ -275,20 +281,14 @@ static void reportfunc (osjob_t* j) { static osjob_t testjob; static void testfunc( osjob_t *j){ - // uint32_t ticks; - // ticks = HAL_GetTick(); - // debug_str( (const char*)sml_frame ); - // debug_val("Ticks: ", ticks ); - for( int i = 0; i < sizeof(sml_frame); i++ ){ - sml_frame[i] = 0u; - }; - HAL_UART_Receive( &huart2, sml_frame, 512, 2000 ); - // HAL_UART_Transmit( &huart1, sml_frame, 512, HAL_MAX_DELAY ); - for(int i = 0; i < 512; i++){ - readByte( &sml_frame[i] ); + + // HAL_UART_Transmit( &huart1, MainBuf, MainBuf_SIZE, HAL_MAX_DELAY ); + + for(int i = 0; i < sml_frame_size; i++){ + readByte( &MainBuf[i] ); }; // debug_str( "\r\n" ); - + os_setTimedCallback(j, os_getTime()+sec2osticks(10), testfunc); } @@ -395,19 +395,13 @@ int main(void) /* Configure the system clock */ SystemClock_Config(); - - /* Configure SysTick to generate an interrupt every millisecond */ - // if (SysTick_Config(SystemCoreClock / 1000) != HAL_OK) { - // // Error Handling - // Error_Handler(); - // } - /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); + MX_DMA_Init(); MX_SPI1_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); @@ -415,6 +409,9 @@ int main(void) MX_RTC_Init(); /* USER CODE BEGIN 2 */ + HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuf, RxBuf_SIZE); + __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT); + HAL_TIM_Base_Start_IT(&htim2); // <----------- change to your setup __HAL_SPI_ENABLE(&hspi1); // <----------- change to your setup @@ -735,9 +732,7 @@ static void MX_USART2_UART_Init(void) huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXOVERRUNDISABLE_INIT|UART_ADVFEATURE_DMADISABLEONERROR_INIT; - huart2.AdvancedInit.OverrunDisable = UART_ADVFEATURE_OVERRUN_DISABLE; - huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); @@ -748,6 +743,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_Channel4_5_6_7_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel4_5_6_7_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel4_5_6_7_IRQn); + +} + /** * @brief GPIO Initialization Function * @param None @@ -804,7 +815,7 @@ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { HAL_RTC_GetAlarm(hrtc,&sAlarm,RTC_ALARM_A,FORMAT_BIN); uint8_t next_minutes = sAlarm.AlarmTime.Minutes + 5; - if (next_minutes > 56) next_minutes = 0; + if (next_minutes >= 56) next_minutes = 0; sAlarm.AlarmTime.Minutes = next_minutes; @@ -814,6 +825,26 @@ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { } + +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) +{ + + if (huart->Instance == USART2) + { + memset(MainBuf,0x00u, MainBuf_SIZE ); + + memcpy(MainBuf, RxBuf, Size ); + sml_frame_size = Size; + + HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuf, RxBuf_SIZE); + __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT); + + } + +} + + + // void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { // RTC_TimeTypeDef sTime; // RTC_DateTypeDef sDate; diff --git a/src/stm32l0xx_hal_msp.c b/src/stm32l0xx_hal_msp.c index 4a47677..4c87841 100644 --- a/src/stm32l0xx_hal_msp.c +++ b/src/stm32l0xx_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 */ @@ -304,20 +305,34 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) PA2 ------> USART2_TX PA3 ------> USART2_RX */ - GPIO_InitStruct.Pin = USART2_TX_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_USART2; - HAL_GPIO_Init(USART2_TX_GPIO_Port, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = USART2_RX_Pin; + GPIO_InitStruct.Pin = USART2_TX_Pin|USART2_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_USART2; - HAL_GPIO_Init(USART2_RX_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* USART2 DMA Init */ + /* 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_LOW; + 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); /* USER CODE BEGIN USART2_MspInit 1 */ /* USER CODE END USART2_MspInit 1 */ @@ -365,6 +380,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOA, USART2_TX_Pin|USART2_RX_Pin); + /* USART2 DMA DeInit */ + HAL_DMA_DeInit(huart->hdmarx); + + /* USART2 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART2_IRQn); /* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE END USART2_MspDeInit 1 */ diff --git a/src/stm32l0xx_it.c b/src/stm32l0xx_it.c index 5c27acc..033102a 100644 --- a/src/stm32l0xx_it.c +++ b/src/stm32l0xx_it.c @@ -57,6 +57,8 @@ /* External variables --------------------------------------------------------*/ extern RTC_HandleTypeDef hrtc; extern TIM_HandleTypeDef htim2; +extern DMA_HandleTypeDef hdma_usart2_rx; +extern UART_HandleTypeDef huart2; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -171,6 +173,20 @@ void EXTI4_15_IRQHandler(void) /* USER CODE END EXTI4_15_IRQn 1 */ } +/** + * @brief This function handles DMA1 channel 4, channel 5, channel 6 and channel 7 interrupts. + */ +void DMA1_Channel4_5_6_7_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Channel4_5_6_7_IRQn 0 */ + + /* USER CODE END DMA1_Channel4_5_6_7_IRQn 0 */ + 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 */ +} + /** * @brief This function handles TIM2 global interrupt. */ @@ -185,6 +201,20 @@ void TIM2_IRQHandler(void) /* USER CODE END TIM2_IRQn 1 */ } +/** + * @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26. + */ +void USART2_IRQHandler(void) +{ + /* USER CODE BEGIN USART2_IRQn 0 */ + + /* USER CODE END USART2_IRQn 0 */ + HAL_UART_IRQHandler(&huart2); + /* USER CODE BEGIN USART2_IRQn 1 */ + + /* USER CODE END USART2_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */