void HAL_USART_End(HAL_USART_Serial serial) { // wait for transmission of outgoing data while (usartMap[serial]->usart_tx_buffer->head != usartMap[serial]->usart_tx_buffer->tail); // Disable the USART USART_Cmd(usartMap[serial]->usart_peripheral, DISABLE); // Switch pins to INPUT HAL_Pin_Mode(usartMap[serial]->usart_rx_pin, INPUT); HAL_Pin_Mode(usartMap[serial]->usart_tx_pin, INPUT); // Disable LIN mode USART_LINCmd(usartMap[serial]->usart_peripheral, DISABLE); // Deinitialise USART USART_DeInit(usartMap[serial]->usart_peripheral); // Disable USART Receive and Transmit interrupts USART_ITConfig(usartMap[serial]->usart_peripheral, USART_IT_RXNE, DISABLE); USART_ITConfig(usartMap[serial]->usart_peripheral, USART_IT_TXE, DISABLE); NVIC_InitTypeDef NVIC_InitStructure; // Disable the USART Interrupt NVIC_InitStructure.NVIC_IRQChannel = usartMap[serial]->usart_int_n; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure); // Disable USART Clock *usartMap[serial]->usart_apbReg &= ~usartMap[serial]->usart_clock_en; // clear any received data usartMap[serial]->usart_rx_buffer->head = usartMap[serial]->usart_rx_buffer->tail; // Undo any pin re-mapping done for this USART GPIO_PinRemapConfig(usartMap[serial]->usart_pin_remap, DISABLE); memset(usartMap[serial]->usart_rx_buffer, 0, sizeof(Ring_Buffer)); memset(usartMap[serial]->usart_tx_buffer, 0, sizeof(Ring_Buffer)); usartMap[serial]->usart_enabled = false; usartMap[serial]->usart_transmitting = false; }
/****************************************************************************** * USART1 Initialization Code Template ******************************************************************************/ void USART1__Init() { USART_InitTypeDef USART_InitStruct; #if (STRCMP($modeSelect$, USART_MODE_SYNCHRONOUS) == 1) //PUT_A_NEW_LINE_HERE USART_ClockInitTypeDef USART_ClockInitStruct; #endif #if (!STRCMP($USARTIntSet$, 0)) NVIC_InitTypeDef NVIC_InitStructure; #endif //PUT_A_NEW_LINE_HERE // // Enable peripheral clock of USART1 and GPIOA // RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //PUT_A_NEW_LINE_HERE // // USART Config // USART_InitStruct.USART_BaudRate = $baudRate$; USART_InitStruct.USART_WordLength = $dataBits$; USART_InitStruct.USART_StopBits = $stopBits$; USART_InitStruct.USART_Parity = $parityBits$; USART_InitStruct.USART_Mode = $modeSet$; USART_InitStruct.USART_HardwareFlowControl = $HardwareFlowControl$; USART_Init(USART1, &USART_InitStruct); #if ($guardTime$ != 0) //PUT_A_NEW_LINE_HERE // // Set Guard Time // USART_SetGuardTime(USART1, $guardTime$); #endif //PUT_A_NEW_LINE_HERE USART_WakeUpConfig(USART1, $WakeUpmethod$); //PUT_A_NEW_LINE_HERE #if (STRCMP($modeSelect$, USART_MODE_NORMAL) == 1) #elif (STRCMP($modeSelect$, USART_MODE_IRDA) == 1) //PUT_A_NEW_LINE_HERE // //USART IrDA Mode Config // USART_IrDAConfig(USART1, $IrDAModeSel$); USART_IrDACmd(USART1, ENABLE); #elif (STRCMP($modeSelect$, USART_MODE_DMA) == 1) //PUT_A_NEW_LINE_HERE // //USART DMA Mode Config // USART_DMACmd(USART1, $DMAReq$, ENABLE); #elif (STRCMP($modeSelect$, USART_MODE_SYNCHRONOUS) == 1) //PUT_A_NEW_LINE_HERE // // USART Synchronous Mode Config // USART_Clock_InitStruct.USART_Clock = USART_CLOCK_ENABLE; USART_Clock_InitStruct.USART_CPOL = $synClockPolSet$; USART_Clock_InitStruct.USART_CPHA = $synClockPhaseSet$; USART_Clock_InitStruct.USART_LastBit = $lastbitenable$; USART_ClockInit(USART1, &USART_Clock_InitStruct); #elif (STRCMP($modeSelect$, USART_MODE_LIN) == 1) //PUT_A_NEW_LINE_HERE // // USART LIN Mode Config // USART_LINBreakDetectLengthConfig(USART1, $LINBreakDetectLen$); USART_LINCmd(USART1, ENABLE); #elif (STRCMP($modeSelect$, USART_MODE_SMARTCARD) == 1) //PUT_A_NEW_LINE_HERE // // USART SmartCard Mode Config // USART_SmartCardCmd(USART1, ENABLE); #elif (STRCMP($NACKTrans$, ENABLE) == 1) //PUT_A_NEW_LINE_HERE USART_SmartCardNACKCmd(USART1, ENABLE); #elif (STRCMP($modeSelect$, USART_MODE_HALFDUPLEX) == 1) //PUT_A_NEW_LINE_HERE // // USART HalfDuplex Mode Config // USART_HalfDuplexCmd(USART1, ENABLE); #endif #if (!STRCMP($USARTIntSet$, 0)) //PUT_A_NEW_LINE_HERE // // Enable the USART Interrupt Function // USART_ITConfig(USART1, $USARTIntSet$, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif }
void HAL_USART_BeginConfig(HAL_USART_Serial serial, uint32_t baud, uint32_t config, void *ptr) { // Verify UART configuration, exit if it's invalid. if (!HAL_USART_Validate_Config(config)) { usartMap[serial]->usart_enabled = false; return; } usartMap[serial]->usart_enabled = false; // AFIO clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // Enable USART Clock *usartMap[serial]->usart_apbReg |= usartMap[serial]->usart_clock_en; NVIC_InitTypeDef NVIC_InitStructure; // Enable the USART Interrupt NVIC_InitStructure.NVIC_IRQChannel = usartMap[serial]->usart_int_n; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;//USART2_IRQ_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); HAL_USART_Configure_Pin_Modes(serial, config); // USART default configuration // USART configured as follow: // - BaudRate = (set baudRate as 9600 baud) // - Word Length = 8 Bits // - One Stop Bit // - No parity // - Hardware flow control disabled (RTS and CTS signals) // - Receive and transmit enabled // USART configuration USART_InitStructure.USART_BaudRate = baud; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; switch (config & SERIAL_FLOW_CONTROL) { case SERIAL_FLOW_CONTROL_CTS: USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_CTS; break; case SERIAL_FLOW_CONTROL_RTS: USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS; break; case SERIAL_FLOW_CONTROL_RTS_CTS: USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS; break; case SERIAL_FLOW_CONTROL_NONE: default: USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; break; } if (serial == HAL_USART_SERIAL2) { // USART1 supports hardware flow control, but RTS and CTS pins are not exposed USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; } switch (USART_InitStructure.USART_HardwareFlowControl) { case USART_HardwareFlowControl_CTS: HAL_Pin_Mode(usartMap[serial]->usart_cts_pin, AF_OUTPUT_PUSHPULL); break; case USART_HardwareFlowControl_RTS: HAL_Pin_Mode(usartMap[serial]->usart_rts_pin, AF_OUTPUT_PUSHPULL); break; case USART_HardwareFlowControl_RTS_CTS: HAL_Pin_Mode(usartMap[serial]->usart_cts_pin, AF_OUTPUT_PUSHPULL); HAL_Pin_Mode(usartMap[serial]->usart_rts_pin, AF_OUTPUT_PUSHPULL); break; case USART_HardwareFlowControl_None: default: break; } // Stop bit configuration. switch (config & SERIAL_STOP_BITS) { case SERIAL_STOP_BITS_1: // 1 stop bit USART_InitStructure.USART_StopBits = USART_StopBits_1; break; case SERIAL_STOP_BITS_2: // 2 stop bits USART_InitStructure.USART_StopBits = USART_StopBits_2; break; case SERIAL_STOP_BITS_0_5: // 0.5 stop bits USART_InitStructure.USART_StopBits = USART_StopBits_0_5; break; case SERIAL_STOP_BITS_1_5: // 1.5 stop bits USART_InitStructure.USART_StopBits = USART_StopBits_1_5; break; } // Data bits configuration switch (HAL_USART_Calculate_Word_Length(config, 0)) { case 8: USART_InitStructure.USART_WordLength = USART_WordLength_8b; break; case 9: USART_InitStructure.USART_WordLength = USART_WordLength_9b; break; } // Parity configuration switch (config & SERIAL_PARITY) { case SERIAL_PARITY_NO: USART_InitStructure.USART_Parity = USART_Parity_No; break; case SERIAL_PARITY_EVEN: USART_InitStructure.USART_Parity = USART_Parity_Even; break; case SERIAL_PARITY_ODD: USART_InitStructure.USART_Parity = USART_Parity_Odd; break; } // Disable LIN mode just in case USART_LINCmd(usartMap[serial]->usart_peripheral, DISABLE); // Configure USART USART_Init(usartMap[serial]->usart_peripheral, &USART_InitStructure); // LIN configuration if (config & LIN_MODE) { // Enable break detection switch(config & LIN_BREAK_BITS) { case LIN_BREAK_10B: USART_LINBreakDetectLengthConfig(usartMap[serial]->usart_peripheral, USART_LINBreakDetectLength_10b); break; case LIN_BREAK_11B: USART_LINBreakDetectLengthConfig(usartMap[serial]->usart_peripheral, USART_LINBreakDetectLength_11b); break; } } // Enable USART Receive and Transmit interrupts USART_ITConfig(usartMap[serial]->usart_peripheral, USART_IT_RXNE, ENABLE); USART_ITConfig(usartMap[serial]->usart_peripheral, USART_IT_TXE, ENABLE); usartMap[serial]->usart_config = config; if (config & SERIAL_HALF_DUPLEX) { HAL_USART_Half_Duplex(serial, ENABLE); } USART_ITConfig(usartMap[serial]->usart_peripheral, USART_IT_TC, DISABLE); // Enable the USART USART_Cmd(usartMap[serial]->usart_peripheral, ENABLE); if (config & LIN_MODE) { USART_LINCmd(usartMap[serial]->usart_peripheral, ENABLE); } usartMap[serial]->usart_enabled = true; usartMap[serial]->usart_transmitting = false; }