USART
EC_HAL for USART
Header File
ecUSART.h
#ifndef __EC_USART_H
#define __EC_USART_H
#include <stdio.h>
#include "stm32f411xe.h"
#include "ecGPIO.h"
#include "ecRCC.h"
#define POL 0
#define INT 1
// You can modify this
#define BAUD_9600 9600
#define BAUD_19200 19200
#define BAUD_38400 38400
#define BAUD_57600 57600
#define BAUD_115200 115200
#define BAUD_921600 921600
// ********************** USART 2 (USB) ***************************
// PA_2 = USART2_TX
// PA_3 = USART2_RX
// Alternate function(AF7), High Speed, Push pull, Pull up
// APB1
// **********************************************************
// ********************** USART 1 ***************************
// PA_9 = USART1_TX (default) // PB_6 (option)
// PA_10 = USART1_RX (default) // PB_3 (option)
// APB2
// **********************************************************
// ********************** USART 6 ***************************
// PA_11 = USART6_TX (default) // PC_6 (option)
// PA_12 = USART6_RX (default) // PC_7 (option)
// APB2
// **********************************************************
// Configuration UART 1, 2 using default pins
void UART1_init(void);
void UART2_init(void);
void UART1_baud(uint32_t baud);
void UART2_baud(uint32_t baud);
// Configuration USART write & read
void USART1_write(uint8_t* buffer, uint32_t nBytes);
void USART2_write(uint8_t* buffer, uint32_t nBytes);
uint8_t USART1_read(void);
uint8_t USART2_read(void);
// Inturrupt USART1,2
uint32_t is_USART1_RXNE(void);
uint32_t is_USART2_RXNE(void);
// private functions
void USART_write(USART_TypeDef* USARTx, uint8_t* buffer, uint32_t nBytes);
void USART_init(USART_TypeDef* USARTx, uint32_t baud);
void UART_baud(USART_TypeDef* USARTx, uint32_t baud);
uint32_t is_USART_RXNE(USART_TypeDef * USARTx);
uint8_t USART_read(USART_TypeDef * USARTx);
void USART_setting(USART_TypeDef* USARTx, GPIO_TypeDef* GPIO_TX, int pinTX, GPIO_TypeDef* GPIO_RX, int pinRX, uint32_t baud);
void USART_delay(uint32_t us);
#endif
Example Code
HAL: USART example1
#include "stm32f4xx.h"
#include "ecGPIO.h"
#include "ecRCC.h"
#include "ecUART.h"
#include "ecSysTick.h"
static volatile uint8_t PC_Data = 0;
static volatile uint8_t BT_Data = 0;
uint8_t PC_string[]="Loop:\r\n";
void setup(void){
RCC_PLL_init();
SysTick_init();
// USART2: USB serial init
UART2_init();
UART2_baud(BAUD_9600);
// USART1: BT serial init
UART1_init();
UART1_baud(BAUD_9600);
}
int main(void){
setup();
printf("MCU Initialized\r\n");
while(1){
// USART Receive: Use Interrupt only
// USART Transmit: Interrupt or Polling
USART2_write(PC_string, 7);
delay_ms(2000);
}
}
void USART2_IRQHandler(){ // USART2 RX Interrupt : Recommended
if(is_USART2_RXNE()){
PC_Data = USART2_read(); // RX from UART2 (PC)
USART2_write(&PC_Data,1); // TX to USART2 (PC) Echo of keyboard typing
}
}
void USART1_IRQHandler(){ // USART2 RX Interrupt : Recommended
if(is_USART1_RXNE()){
BT_Data = USART1_read(); // RX from UART1 (BT)
printf("RX: %c \r\n",BT_Data); // TX to USART2(PC)
}
}
HAL: USART example2
#include "stm32f4xx.h"
#include "ecGPIO.h"
#include "ecRCC.h"
#include "ecUART.h"
#include "ecSysTick.h"
#define MAX_BUF 10
#define END_CHAR 13
static volatile uint8_t buffer[MAX_BUF]={0, };
static volatile uint8_t PC_string[MAX_BUF]={0, };
static volatile uint8_t PC_data = 0;
static volatile int idx = 0;
static volatile int bReceive =0;
void setup(void){
RCC_PLL_init();
SysTick_init();
// USART2: USB serial init
UART2_init();
UART2_baud(BAUD_9600);
// USART1: BT serial init
UART1_init();
UART1_baud(BAUD_9600);
}
int main(void){
setup();
printf("MCU Initialized\r\n");
while(1){
if (bReceive == 1){
printf("PC_string: %s\r\n", PC_string);
bReceive = 0;
}
}
}
void USART2_IRQHandler(){ // USART2 RX Interrupt : Recommended
if(is_USART2_RXNE()){
PC_data = USART2_read(); // RX from UART2 (PC)
USART2_write(&PC_data,1); // TX to USART2 (PC) Echo of keyboard typing
// Creates a String from serial character receive
if(PC_data != END_CHAR && (idx < MAX_BUF)){
buffer[idx] = PC_data;
idx++;
}
else if (PC_data== END_CHAR) {
bReceive = 1;
// reset PC_string;
memset(PC_string, 0, sizeof(char) * MAX_BUF);
// copy to PC_string;
memcpy(PC_string, buffer, sizeof(char) * idx);
// reset buffer
memset(buffer, 0, sizeof(char) * MAX_BUF);
idx = 0;
}
else{ // if(idx >= MAX_BUF)
idx = 0;
// reset PC_string;
memset(PC_string, 0, sizeof(char) * MAX_BUF);
// reset buffer
memset(buffer, 0, sizeof(char) * MAX_BUF); // reset buffer
printf("ERROR : Too long string\r\n");
}
}
}
Tutorial: SysTick Initiation
Last updated