From 0fa19004d36fd02b2328e85ce399c3f3f4bf01dd Mon Sep 17 00:00:00 2001 From: jazzpi Date: Fri, 24 Jun 2022 09:35:47 +0200 Subject: [PATCH] Use DMA for TMP144 communication --- Core/Inc/stm32f4xx_it.h | 2 ++ Core/Src/TMP144.c | 19 ++++++++----- Core/Src/main.c | 50 ++++++++++++++++++++++++++++------ Core/Src/stm32f4xx_hal_msp.c | 47 ++++++++++++++++++++++++++++++++ Core/Src/stm32f4xx_it.c | 30 ++++++++++++++++++++ Makefile | 2 +- ams-slave.ioc | 53 +++++++++++++++++++++++++++--------- 7 files changed, 174 insertions(+), 29 deletions(-) diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index bc45418..b768b6f 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -55,11 +55,13 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void DMA1_Stream1_IRQHandler(void); void CAN1_RX0_IRQHandler(void); void CAN1_RX1_IRQHandler(void); void I2C1_EV_IRQHandler(void); void USART1_IRQHandler(void); void USART3_IRQHandler(void); +void DMA2_Stream2_IRQHandler(void); void CAN2_RX0_IRQHandler(void); void CAN2_RX1_IRQHandler(void); void CAN2_SCE_IRQHandler(void); diff --git a/Core/Src/TMP144.c b/Core/Src/TMP144.c index e6723ed..fd5101f 100644 --- a/Core/Src/TMP144.c +++ b/Core/Src/TMP144.c @@ -69,7 +69,7 @@ HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) { } bus->state = TMP144_RESETTING; - CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 2)); + CHECK_STATUS(HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, 2)); // Keep sending Global Software Reset until it echoes back (as per 7.5.2) int tries = 0; do { @@ -77,14 +77,19 @@ HAL_StatusTypeDef tmp144_init_reset(TMP144Bus* bus) { bus->state = TMP144_ERROR; return HAL_TIMEOUT; } - CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_RESET, - sizeof(TMP144_SEQ_RESET), 100)); - HAL_Delay(50); + if (bus->handle->RxState == HAL_UART_STATE_READY && + bus->state == TMP144_RESETTING) { + HAL_UART_DMAStop(bus->handle); + CHECK_STATUS(HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, 2)); + } + CHECK_STATUS(HAL_UART_Transmit_IT(bus->handle, TMP144_SEQ_RESET, + sizeof(TMP144_SEQ_RESET))); + HAL_Delay(100); tries++; } while (bus->state == TMP144_RESETTING); bus->state = TMP144_INITIALIZING; - CHECK_STATUS(HAL_UART_Receive_IT(bus->handle, bus->rxbuf, 3)); + CHECK_STATUS(HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, 3)); bus->expected_response_time = HAL_GetTick() + 100; CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_ADDR, sizeof(TMP144_SEQ_ADDR), 100)); @@ -134,8 +139,8 @@ HAL_StatusTypeDef tmp144_send_read_temps(TMP144Bus* bus) { bus->state = TMP144_READING_TEMP; CHECK_STATUS( - HAL_UART_Receive_IT(bus->handle, bus->rxbuf, - sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors)); + HAL_UART_Receive_DMA(bus->handle, bus->rxbuf, + sizeof(TMP144_SEQ_READ_TEMPS) + 2 * bus->n_sensors)); bus->expected_response_time = HAL_GetTick() + TMP144_RESPONSE_TIMEOUT; CHECK_STATUS(HAL_UART_Transmit(bus->handle, TMP144_SEQ_READ_TEMPS, sizeof(TMP144_SEQ_READ_TEMPS), 100)); diff --git a/Core/Src/main.c b/Core/Src/main.c index 5a7aabd..e50db88 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -60,6 +60,8 @@ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; UART_HandleTypeDef huart6; +DMA_HandleTypeDef hdma_usart1_rx; +DMA_HandleTypeDef hdma_usart3_rx; /* USER CODE BEGIN PV */ uint8_t slave_id; @@ -74,8 +76,9 @@ static void MX_I2C1_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); static void MX_USART3_UART_Init(void); -static void MX_USART6_UART_Init(void); +static void MX_DMA_Init(void); static void MX_TIM3_Init(void); +static void MX_USART6_UART_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -97,25 +100,35 @@ void update_status_leds() { } void check_error_conditions() { + int error = 0; if (bq_status != BQ_RDY) { ams_can_send_error(AMS_ERROR_BQ, AMS_ERROR_TX_TIMEOUT); + error = 1; } tmp144_check_timeouts(); if (tmp144_bus_busbar.state == TMP144_ERROR || tmp144_bus_other.state == TMP144_ERROR) { ams_can_send_error(AMS_ERROR_TMP144, AMS_ERROR_TX_TIMEOUT); + error = 1; } if (min_voltage < THRESH_UV) { ams_can_send_error(AMS_ERROR_UV, AMS_ERROR_TX_TIMEOUT); + error = 1; } if (max_voltage > THRESH_OV) { ams_can_send_error(AMS_ERROR_OV, AMS_ERROR_TX_TIMEOUT); + error = 1; } if (min_temperature < THRESH_UT) { ams_can_send_error(AMS_ERROR_UT, AMS_ERROR_TX_TIMEOUT); + error = 1; } if (max_temperature > THRESH_OT) { ams_can_send_error(AMS_ERROR_OT, AMS_ERROR_TX_TIMEOUT); + error = 1; + } + + if (error) { } } @@ -164,18 +177,21 @@ int main(void) { MX_CAN1_Init(); MX_CAN2_Init(); MX_I2C1_Init(); + MX_DMA_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); - MX_USART6_UART_Init(); MX_TIM3_Init(); + MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */ - HAL_GPIO_WritePin(DCDC_CTRL_GPIO_Port, DCDC_CTRL_Pin, GPIO_PIN_SET); - HAL_Delay(100); - afe_init(&huart2); + fan_ctrl_init(&htim3, TIM_CHANNEL_4); eeprom_init(&hi2c1); eeprom_read_random(EEPROM_ADDR_SLAVE_ID, &slave_id); - fan_ctrl_init(&htim3, TIM_CHANNEL_4); + ams_can_init(&hcan1, &hcan2); + HAL_GPIO_WritePin(DCDC_CTRL_GPIO_Port, DCDC_CTRL_Pin, GPIO_PIN_SET); + HAL_Delay(100); + tmp144_init(&huart1, &huart3); + afe_init(&huart2); /* USER CODE END 2 */ /* Infinite loop */ @@ -390,13 +406,13 @@ static void MX_USART1_UART_Init(void) { /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; + huart1.Init.BaudRate = 57600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OverSampling = UART_OVERSAMPLING_8; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } @@ -495,6 +511,24 @@ static void MX_USART6_UART_Init(void) { /* USER CODE END USART6_Init 2 */ } +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) { + + /* DMA controller clock enable */ + __HAL_RCC_DMA2_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Stream1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + /* DMA2_Stream2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); +} + /** * @brief GPIO Initialization Function * @param None diff --git a/Core/Src/stm32f4xx_hal_msp.c b/Core/Src/stm32f4xx_hal_msp.c index 76660ad..a588435 100644 --- a/Core/Src/stm32f4xx_hal_msp.c +++ b/Core/Src/stm32f4xx_hal_msp.c @@ -23,6 +23,9 @@ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ +extern DMA_HandleTypeDef hdma_usart1_rx; + +extern DMA_HandleTypeDef hdma_usart3_rx; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -390,6 +393,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* USART1 DMA Init */ + /* USART1_RX Init */ + hdma_usart1_rx.Instance = DMA2_Stream2; + hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; + hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_usart1_rx.Init.Mode = DMA_NORMAL; + hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH; + hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx); + /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); @@ -449,6 +471,25 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /* USART3 DMA Init */ + /* USART3_RX Init */ + hdma_usart3_rx.Instance = DMA1_Stream1; + hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4; + hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_usart3_rx.Init.Mode = DMA_NORMAL; + hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx); + /* USART3 interrupt Init */ HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); @@ -505,6 +546,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10|GPIO_PIN_15); + /* USART1 DMA DeInit */ + HAL_DMA_DeInit(huart->hdmarx); + /* USART1 interrupt DeInit */ HAL_NVIC_DisableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspDeInit 1 */ @@ -545,6 +589,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10); + /* USART3 DMA DeInit */ + HAL_DMA_DeInit(huart->hdmarx); + /* USART3 interrupt DeInit */ HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 9c5f27c..e7b7766 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -58,6 +58,8 @@ extern CAN_HandleTypeDef hcan1; extern CAN_HandleTypeDef hcan2; extern I2C_HandleTypeDef hi2c1; +extern DMA_HandleTypeDef hdma_usart1_rx; +extern DMA_HandleTypeDef hdma_usart3_rx; extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart3; /* USER CODE BEGIN EV */ @@ -201,6 +203,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f4xx.s). */ /******************************************************************************/ +/** + * @brief This function handles DMA1 stream1 global interrupt. + */ +void DMA1_Stream1_IRQHandler(void) +{ + /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */ + + /* USER CODE END DMA1_Stream1_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart3_rx); + /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */ + + /* USER CODE END DMA1_Stream1_IRQn 1 */ +} + /** * @brief This function handles CAN1 RX0 interrupts. */ @@ -271,6 +287,20 @@ void USART3_IRQHandler(void) /* USER CODE END USART3_IRQn 1 */ } +/** + * @brief This function handles DMA2 stream2 global interrupt. + */ +void DMA2_Stream2_IRQHandler(void) +{ + /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */ + + /* USER CODE END DMA2_Stream2_IRQn 0 */ + HAL_DMA_IRQHandler(&hdma_usart1_rx); + /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */ + + /* USER CODE END DMA2_Stream2_IRQn 1 */ +} + /** * @brief This function handles CAN2 RX0 interrupts. */ diff --git a/Makefile b/Makefile index 6061dae..9a70037 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Thu Jun 23 11:54:27 CEST 2022] +# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Fri Jun 24 05:32:32 CEST 2022] ########################################################################################################################## # ------------------------------------------------ diff --git a/ams-slave.ioc b/ams-slave.ioc index b39f2fc..b8ef07a 100644 --- a/ams-slave.ioc +++ b/ams-slave.ioc @@ -14,6 +14,29 @@ CAN2.CalculateTimeBit=2000 CAN2.CalculateTimeQuantum=125.0 CAN2.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Prescaler,BS1,BS2 CAN2.Prescaler=2 +Dma.Request0=USART1_RX +Dma.Request1=USART3_RX +Dma.RequestsNb=2 +Dma.USART1_RX.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.USART1_RX.0.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.USART1_RX.0.Instance=DMA2_Stream2 +Dma.USART1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART1_RX.0.MemInc=DMA_MINC_ENABLE +Dma.USART1_RX.0.Mode=DMA_NORMAL +Dma.USART1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART1_RX.0.PeriphInc=DMA_PINC_DISABLE +Dma.USART1_RX.0.Priority=DMA_PRIORITY_HIGH +Dma.USART1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode +Dma.USART3_RX.1.Direction=DMA_PERIPH_TO_MEMORY +Dma.USART3_RX.1.FIFOMode=DMA_FIFOMODE_DISABLE +Dma.USART3_RX.1.Instance=DMA1_Stream1 +Dma.USART3_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE +Dma.USART3_RX.1.MemInc=DMA_MINC_ENABLE +Dma.USART3_RX.1.Mode=DMA_NORMAL +Dma.USART3_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE +Dma.USART3_RX.1.PeriphInc=DMA_PINC_DISABLE +Dma.USART3_RX.1.Priority=DMA_PRIORITY_LOW +Dma.USART3_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode File.Version=6 GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false @@ -21,16 +44,17 @@ Mcu.CPN=STM32F412RET6 Mcu.Family=STM32F4 Mcu.IP0=CAN1 Mcu.IP1=CAN2 -Mcu.IP10=USART6 -Mcu.IP2=I2C1 -Mcu.IP3=NVIC -Mcu.IP4=RCC -Mcu.IP5=SYS -Mcu.IP6=TIM3 -Mcu.IP7=USART1 -Mcu.IP8=USART2 -Mcu.IP9=USART3 -Mcu.IPNb=11 +Mcu.IP10=USART3 +Mcu.IP11=USART6 +Mcu.IP2=DMA +Mcu.IP3=I2C1 +Mcu.IP4=NVIC +Mcu.IP5=RCC +Mcu.IP6=SYS +Mcu.IP7=TIM3 +Mcu.IP8=USART1 +Mcu.IP9=USART2 +Mcu.IPNb=12 Mcu.Name=STM32F412R(E-G)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC0 @@ -71,6 +95,8 @@ NVIC.CAN1_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.CAN2_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.CAN2_RX1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.CAN2_SCE_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.DMA1_Stream1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true +NVIC.DMA2_Stream2_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:1\:0\:true\:false\:true\:false\:false\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true @@ -183,7 +209,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=Makefile ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CAN1_Init-CAN1-false-HAL-true,4-MX_CAN2_Init-CAN2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_USART2_UART_Init-USART2-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USART6_UART_Init-USART6-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CAN1_Init-CAN1-false-HAL-true,4-MX_CAN2_Init-CAN2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_USART1_UART_Init-USART1-false-HAL-true,7-MX_USART2_UART_Init-USART2-false-HAL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_DMA_Init-DMA-false-HAL-true,10-MX_TIM3_Init-TIM3-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true RCC.CortexFreq_Value=16000000 RCC.DFSDMFreq_Value=16000000 RCC.FamilyName=M @@ -212,8 +238,9 @@ TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 TIM3.IPParameters=Channel-PWM Generation4 CH4,Period,Pulse-PWM Generation4 CH4 TIM3.Period=500 TIM3.Pulse-PWM\ Generation4\ CH4=0 -USART1.BaudRate=115200 -USART1.IPParameters=VirtualMode,BaudRate +USART1.BaudRate=57600 +USART1.IPParameters=VirtualMode,BaudRate,OverSampling +USART1.OverSampling=UART_OVERSAMPLING_8 USART1.VirtualMode=VM_ASYNC USART2.BaudRate=250000 USART2.IPParameters=VirtualMode,BaudRate