2016-08-31 02:52 AM
Hello,
I am currently working on a project to communicate with a Bluetooth module (BT121), to do that I use the STM32F407 eval board. Here is my configuration : // Initialize the UART3, huart3 huart3.Instance = USART_SERIAL; huart3.Init.BaudRate = USART_SERIAL_BAUDRATE; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS; huart3.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart3); After that I added in void HAL_UART_MspInit(UART_HandleTypeDef* huart) the following code : __HAL_RCC_GPIOB_CLK_ENABLE() __USART3_CLK_ENABLE(); /**USART3 GPIO Configuration PB11 ------> USART3_RX PB10 ------> USART3_TX PB14 ------> USART3_RTS PB13 ------> USART3_CTS */ //Rx and Tx pins GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; //GPIO_PULLUP; // GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //RTS and CTS pins GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*♯♯-3- Configure the NVIC for UART */ /* NVIC for USARTx */ HAL_NVIC_SetPriority(USART3_IRQn, 0, 1); HAL_NVIC_EnableIRQ(USART3_IRQn); And the interrupt handler : void USART3_IRQHandler(void) { uint32_t isrflags = READ_REG(huart3.Instance->SR); uint32_t cr1its = READ_REG(huart3.Instance->CR1); uint32_t cr3its = READ_REG(huart3.Instance->CR3); uint32_t errorflags = 0x00U; uint32_t dmarequest = 0x00U; /* If no error occurs */ errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); if(errorflags == RESET) { /* UART in mode Receiver -------------------------------------------------*/ if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) { __HAL_UART_CLEAR_FLAG(&huart3, UART_IT_RXNE); // Save the data in the buffer StringLoop[rx_index++] = (uint8_t)(huart3.Instance->DR & (uint16_t)0x01FF); if(--huart3.RxXferCount == 0) { __HAL_UART_DISABLE_IT(&huart3, UART_IT_RXNE); /* Check if a transmit process is ongoing or not */ if(huart3.State == HAL_UART_STATE_BUSY_TX_RX) { huart3.State = HAL_UART_STATE_BUSY_TX; } else { /* Disable the UART Parity Error Interrupt */ __HAL_UART_DISABLE_IT(&huart3, UART_IT_PE); /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ __HAL_UART_DISABLE_IT(&huart3, UART_IT_ERR); huart3.State = HAL_UART_STATE_READY; } while (HAL_UART_GetState(&huart3) != HAL_UART_STATE_READY) { } } } } /* UART in mode Transmitter ------------------------------------------------*/ if(((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)) { UART_Transmit_IT(&huart3); //return; } /* UART in mode Transmitter end --------------------------------------------*/ if(((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)) { UART_EndTransmit_IT(&huart3); //return; } This code is working because I can communicate but at some point RTS pin from STM32F4 stays high, I checked and a parity error flag is reported and when I check my uart registers I have: SR ====>0x08012331 DR ====>0x08012335 BRR====>0x08012339 CR1 ====>0x0801233D CR2 ====>0x00000000 CR3 ====>0x00000000 GTPR ====>0x00000000 If you have an idea on this issue please help me. PS : I add an image of the logic analyser. Thank you. #stm32f4 #usart2016-08-31 09:59 AM
Himbumb_kumb.friz,
I recommend that you check this that may be hlepful for your case. -Hannibal-2016-09-01 12:32 AM
Hi Hannibal,
Thanks for the reply, I checked the thread and so far I think I do not have the same problem also I do not have an ''overrun error''. In my case it looks like when I have my issue the uart is in a weird mode when you see the register state it doesn't make any sense. Fritz2016-09-01 09:59 AM
Hi
After checking the I/O configuration and pins on datasheet, you would chech the exter,nal module circuit and connection with the Eval board. Keep the manual/datasheet in your hand.one other point, are you using CAN ? because it might be sharing the same pin with USART. If it is the case you would make the remapping like described in some threads around.-Hannibal-2016-09-06 03:15 AM
Hi,
I checked everything and I still have my issue. Also Hannibal the CAN is not used in my application. If someone has some ideas feel free to share. Thanks in advance,