diff --git a/Core/Src/main.c b/Core/Src/main.c index 5f49e19..05a9506 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -45,7 +45,8 @@ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ - +static uint8_t rx_buf[16]; +static volatile uint8_t rx_complete = 0; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -95,26 +96,46 @@ int main(void) MX_USART1_UART_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ - + /* Start UART2 reception in interrupt mode */ + HAL_UART_Receive_IT(&huart2, rx_buf, sizeof(rx_buf)); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { - HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6); - /* Heartbeat: emit tick timestamp over UART1 and blink the PB6 LED */ - int msg_len = snprintf(heartbeat_buf, sizeof(heartbeat_buf), - "PB6 heartbeat %lu\r\n", (unsigned long)HAL_GetTick()); - if (msg_len > 0) { - if (msg_len >= (int)sizeof(heartbeat_buf)) { - msg_len = (int)sizeof(heartbeat_buf) - 1; + static uint32_t last_toggle_timestamp; + if (HAL_GetTick() - last_toggle_timestamp >= 1000) { + HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6); + /* Heartbeat: emit tick timestamp over UART1 and blink the PB6 LED */ + int msg_len = snprintf(heartbeat_buf, sizeof(heartbeat_buf), + "PB6 heartbeat %lu\r\n", (unsigned long)HAL_GetTick()); + if (msg_len > 0) { + if (msg_len >= (int)sizeof(heartbeat_buf)) { + msg_len = (int)sizeof(heartbeat_buf) - 1; + } + HAL_UART_Transmit(&huart1, (uint8_t *)heartbeat_buf, (uint16_t)msg_len, + HAL_MAX_DELAY); } - HAL_UART_Transmit(&huart1, (uint8_t *)heartbeat_buf, (uint16_t)msg_len, - HAL_MAX_DELAY); + last_toggle_timestamp = HAL_GetTick(); + } + + /* Check if data received from UART2 */ + if (rx_complete) { + rx_complete = 0; + + /* Print received buffer as hex to UART1 */ + char hex_buf[64]; + int hex_len = snprintf(hex_buf, sizeof(hex_buf), "RX: "); + for (int i = 0; i < (int)sizeof(rx_buf) && hex_len < (int)sizeof(hex_buf) - 4; i++) { + hex_len += snprintf(hex_buf + hex_len, sizeof(hex_buf) - hex_len, "%02X ", rx_buf[i]); + } + hex_len += snprintf(hex_buf + hex_len, sizeof(hex_buf) - hex_len, "\r\n"); + HAL_UART_Transmit(&huart1, (uint8_t *)hex_buf, (uint16_t)hex_len, HAL_MAX_DELAY); + + /* Re-arm UART2 reception */ + HAL_UART_Receive_IT(&huart2, rx_buf, sizeof(rx_buf)); } - HAL_Delay(1000); /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ @@ -275,6 +296,18 @@ static void MX_GPIO_Init(void) /* USER CODE BEGIN 4 */ +/** + * @brief Rx Transfer completed callback + * @param huart: UART handle + * @retval None + */ +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + if (huart->Instance == USART2) { + rx_complete = 1; + } +} + /* USER CODE END 4 */ /** diff --git a/Core/Src/stm32f4xx_hal_msp.c b/Core/Src/stm32f4xx_hal_msp.c index 2d6c582..02343bb 100644 --- a/Core/Src/stm32f4xx_hal_msp.c +++ b/Core/Src/stm32f4xx_hal_msp.c @@ -108,6 +108,10 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* USART1 interrupt Init */ + HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART1_IRQn); + /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ @@ -132,6 +136,10 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /* 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 */ @@ -161,6 +169,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + /* USART1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART1_IRQn); + /* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE END USART1_MspDeInit 1 */ @@ -179,6 +190,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) */ HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); + /* USART2 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART2_IRQn); + /* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE END USART2_MspDeInit 1 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 5be1641..c024f77 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -55,7 +55,8 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ - +extern UART_HandleTypeDef huart1; +extern UART_HandleTypeDef huart2; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -198,6 +199,34 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32f4xx.s). */ /******************************************************************************/ +/** + * @brief This function handles USART1 global interrupt. + */ +void USART1_IRQHandler(void) +{ + /* USER CODE BEGIN USART1_IRQn 0 */ + + /* USER CODE END USART1_IRQn 0 */ + HAL_UART_IRQHandler(&huart1); + /* USER CODE BEGIN USART1_IRQn 1 */ + + /* USER CODE END USART1_IRQn 1 */ +} + +/** + * @brief This function handles USART2 global interrupt. + */ +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 */ diff --git a/stmf411re_test.ioc b/stmf411re_test.ioc index d265e65..a88b164 100644 --- a/stmf411re_test.ioc +++ b/stmf411re_test.ioc @@ -123,42 +123,44 @@ ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=false ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true -RCC.48MHZClocksFreq_Value=48000000 -RCC.AHBFreq_Value=48000000 +RCC.48MHZClocksFreq_Value=96000000 +RCC.AHBFreq_Value=96000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV2 RCC.APB1Freq_Value=48000000 -RCC.APB1TimFreq_Value=48000000 -RCC.APB2Freq_Value=48000000 -RCC.APB2TimFreq_Value=48000000 -RCC.CortexFreq_Value=48000000 -RCC.EthernetFreq_Value=48000000 -RCC.FCLKCortexFreq_Value=48000000 -RCC.FLatency-AdvancedSettings=FLASH_LATENCY_1 +RCC.APB1TimFreq_Value=96000000 +RCC.APB2Freq_Value=96000000 +RCC.APB2TimFreq_Value=96000000 +RCC.CortexFreq_Value=96000000 +RCC.EthernetFreq_Value=96000000 +RCC.FCLKCortexFreq_Value=96000000 +RCC.FLatency-AdvancedSettings=FLASH_LATENCY_3 RCC.FamilyName=M -RCC.HCLKFreq_Value=48000000 +RCC.HCLKFreq_Value=96000000 RCC.HSE_VALUE=8000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=48000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FLatency-AdvancedSettings,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLP,PLLQCLKFreq_Value,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,RCC_MCO1Source,RCC_MCODiv1,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FLatency-AdvancedSettings,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQCLKFreq_Value,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,RCC_MCO1Source,RCC_MCODiv1,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S RCC.LSE_VALUE=32768 RCC.LSI_VALUE=32000 -RCC.MCO1PinFreq_Value=24000000 -RCC.MCO2PinFreq_Value=48000000 -RCC.PLLCLKFreq_Value=48000000 +RCC.MCO1PinFreq_Value=48000000 +RCC.MCO2PinFreq_Value=96000000 +RCC.PLLCLKFreq_Value=96000000 RCC.PLLM=8 +RCC.PLLN=384 RCC.PLLP=RCC_PLLP_DIV4 -RCC.PLLQCLKFreq_Value=48000000 +RCC.PLLQCLKFreq_Value=96000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE2 +RCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE1 RCC.RCC_MCO1Source=RCC_MCO1SOURCE_PLLCLK RCC.RCC_MCODiv1=RCC_MCODIV_2 RCC.RTCFreq_Value=32000 RCC.RTCHSEDivFreq_Value=4000000 -RCC.SYSCLKFreq_VALUE=48000000 +RCC.SYSCLKFreq_VALUE=96000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.VCOI2SOutputFreq_Value=96000000 RCC.VCOInputFreq_Value=1000000 RCC.VCOInputMFreq_Value=500000 -RCC.VCOOutputFreq_Value=192000000 +RCC.VCOOutputFreq_Value=384000000 RCC.VcooutputI2S=48000000 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC