/** * @brief Start Bit Method to USART AutoBaudRate. * @param None * @retval None */ static void AutoBauRate_StartBitMethod(void) { /* USART enable */ USART_Cmd(USART1, ENABLE); /* Configure the AutoBaudRate method */ USART_AutoBaudRateConfig(USART1, USART_AutoBaudRate_StartBit); /* Enable AutoBaudRate feature */ USART_AutoBaudRateCmd(USART1, ENABLE); /* Wait until Receive enable acknowledge flag is set */ while(USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET) {} /* Wait until Transmit enable acknowledge flag is set */ while(USART_GetFlagStatus(USART1, USART_FLAG_TEACK) == RESET) {} /* Loop until the end of Autobaudrate phase */ while(USART_GetFlagStatus(USART1, USART_FLAG_ABRF) == RESET) {} /* If AutoBaudBate error occurred */ if (USART_GetFlagStatus(USART1, USART_FLAG_ABRE) != RESET) { /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); } else { /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); /* Wait until RXNE flag is set */ while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) {} /* Wait until TXE flag is set */ while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {} /* Send received character */ USART_SendData(USART1, USART_ReceiveData(USART1)); /* clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before efectivelly disabling the transmission) */ USART_DirectionModeCmd(USART1, USART_Mode_Tx, DISABLE); /* Check the Transfer Complete Flag */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } /* USART Disable */ USART_Cmd(USART1, DISABLE); }
/*====================================================================================================*/ uint16_t UART_AutoBaudRate( USART_TypeDef *USARTx ) { USART_AutoBaudRateConfig(USARTx, USART_AutoBaudRate_StartBit); USART_AutoBaudRateCmd(USARTx, ENABLE); while(USART_GetFlagStatus(USARTx, USART_FLAG_REACK) == RESET); while(USART_GetFlagStatus(USARTx, USART_FLAG_TEACK) == RESET); while(USART_GetFlagStatus(USARTx, USART_FLAG_ABRF) == RESET); if(USART_GetFlagStatus(USARTx, USART_FLAG_ABRE) != RESET) return ERROR; else return (uint16_t)((USARTx->BRR)&0x0000FFFF); }
/* * init_hw * Initialises hardware; pins, LEDs, sensors, etc. */ void init_hw(void) { /* Vars */ GPIO_InitTypeDef GPIO_Init_PD8, GPIO_Init_PD9; USART_InitTypeDef USART3_Init; int i = 0; /* Configure ticks to equal milliseconds (for delays) */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Catch errors using infinite loop */ while (1); } /* Easy stuff first; enable LEDs */ STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDInit(LED5); STM_EVAL_LEDInit(LED6); STM_EVAL_LEDInit(LED7); STM_EVAL_LEDInit(LED8); STM_EVAL_LEDInit(LED9); STM_EVAL_LEDInit(LED10); /* Enable USART3 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* Enable clock on GPIOD pins (for USART3) */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE); /* Configure PD8's alternate function. * GPIO_AF_7 represents function USART3. */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_7); /* Enable USART3 transmit on pin PD8 */ GPIO_Init_PD8.GPIO_Pin = GPIO_Pin_8; GPIO_Init_PD8.GPIO_Mode = GPIO_Mode_AF; GPIO_Init_PD8.GPIO_OType = GPIO_OType_PP; GPIO_Init_PD8.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_PD8.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_Init_PD8); /* Configure PD9's alternate function. * GPIO_AF_7 represents function USART3. */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_7); /* Enable USART3 receive on pin PD9 */ GPIO_Init_PD9.GPIO_Pin = GPIO_Pin_9; GPIO_Init_PD9.GPIO_Mode = GPIO_Mode_AF; GPIO_Init_PD9.GPIO_OType = GPIO_OType_PP; GPIO_Init_PD9.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_PD9.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_Init_PD9); /* Configure USART3 */ USART3_Init.USART_BaudRate = 1000000; // this is auto'd later USART3_Init.USART_WordLength = USART_WordLength_8b; USART3_Init.USART_StopBits = USART_StopBits_1; USART3_Init.USART_Parity = USART_Parity_No; USART3_Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART3_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* Initialise and enable USART3 */ USART_Init(USART3, &USART3_Init); USART_Cmd(USART3, ENABLE); /* Enable and configure automatic baud rate */ USART_AutoBaudRateCmd(USART3, ENABLE); USART_AutoBaudRateConfig(USART3, USART_AutoBaudRate_FallingEdge); /* Enable user button */ STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); /* Turn the LEDs on */ STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); STM_EVAL_LEDOn(LED5); STM_EVAL_LEDOn(LED6); STM_EVAL_LEDOn(LED7); STM_EVAL_LEDOn(LED8); STM_EVAL_LEDOn(LED9); STM_EVAL_LEDOn(LED10); /* Flash 'em a bit, shows something's happening */ for (i = 0; i < 3; i++) { wait(500); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED4); STM_EVAL_LEDToggle(LED5); STM_EVAL_LEDToggle(LED6); STM_EVAL_LEDToggle(LED7); STM_EVAL_LEDToggle(LED8); STM_EVAL_LEDToggle(LED9); STM_EVAL_LEDToggle(LED10); } }
int32_t init(USART_TypeDef * USARTxx, GPIO_TypeDef * GPIOx, uint16_t TxPin, uint16_t RxPin, int32_t baudrate) { this->USARTx = USARTxx; #if defined(USART1) if( USARTxx == USART1 ) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); } #endif #if defined(USART2) //TODO: extend #endif #if defined(GPIOA) if( GPIOx == GPIOA ) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); } #endif GPIO_PinAFConfig(GPIOx, RxPin, GPIO_AF_1); GPIO_PinAFConfig(GPIOx, TxPin, GPIO_AF_1); GPIO_InitTypeDef GPIOInit; GPIOInit.GPIO_Mode = GPIO_Mode_AF; GPIOInit.GPIO_OType = GPIO_OType_PP; GPIOInit.GPIO_Pin = RxPin | TxPin; GPIOInit.GPIO_PuPd = GPIO_PuPd_UP; GPIOInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOx,&GPIOInit); USART_InitTypeDef USARTInit; USARTInit.USART_BaudRate = (baudrate == 0 ? 115200 : baudrate);//115200;//9600; USARTInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USARTInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USARTInit.USART_Parity = USART_Parity_No; USARTInit.USART_StopBits = USART_StopBits_1; USARTInit.USART_WordLength = USART_WordLength_8b; USART_Init(USARTxx,&USARTInit); USART_Cmd(USARTxx, ENABLE); if( baudrate == 0 ) { while(true) { USART_AutoBaudRateConfig(USART1, USART_AutoBaudRate_StartBit); USART_AutoBaudRateCmd(USART1, ENABLE); /* Wait until Receive enable acknowledge flag is set */ while (USART_GetFlagStatus(USART1, USART_FLAG_REACK) == RESET){} /* Wait until Transmit enable acknowledge flag is set */ while (USART_GetFlagStatus(USART1, USART_FLAG_TEACK) == RESET){} /* Loop until the end of Autobaudrate phase */ while (USART_GetFlagStatus(USART1, USART_FLAG_ABRF) == RESET){} /* If AutoBaudRate error occurred */ if (USART_GetFlagStatus(USART1, USART_FLAG_ABRE) == RESET) { break; } } } return USARTInit.USART_BaudRate; }