diff --git a/f4/usart/include/usart1.h b/f4/usart/include/usart1.h
new file mode 100644
index 0000000000000000000000000000000000000000..8291075445980ee2f908e8621e0a1e9379997b0a
--- /dev/null
+++ b/f4/usart/include/usart1.h
@@ -0,0 +1,9 @@
+#ifndef USART1_F4_H
+#define USART1_F4_H
+
+#include "comm.h"
+
+/* public functions */
+void usart1_init(TComm *comm_dev);
+
+#endif
diff --git a/f4/usart/include/usart2.h b/f4/usart/include/usart2.h
new file mode 100644
index 0000000000000000000000000000000000000000..fd9c29fd28d12df3369275a6b3a4f6df525e402c
--- /dev/null
+++ b/f4/usart/include/usart2.h
@@ -0,0 +1,18 @@
+#ifndef USART2_F4_H
+#define USART2_F4_H
+
+#include "usart_common.h"
+#include "comm.h"
+
+/* public functions */
+void usart2_init(TComm *comm_dev,TUSART_IRQ_Priorities *priorities);
+/* IRQ functions */
+unsigned char usart2_send_irq(unsigned char *data,unsigned int length);
+unsigned char usart2_receive_irq(unsigned int length);
+unsigned char usart2_cancel_receive_irq(void);
+/* DMA functions */
+unsigned char usart2_send_dma(unsigned char *data,unsigned int lenght);
+unsigned char usart2_receive_dma(unsigned int length);
+unsigned char usart2_cancel_receive_dma(void);
+
+#endif
diff --git a/f4/usart/include/usart_common.h b/f4/usart/include/usart_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..3e1148cef26ab1991285908be9bec2b42597eb0f
--- /dev/null
+++ b/f4/usart/include/usart_common.h
@@ -0,0 +1,14 @@
+#ifndef USART_COMMON_F4_H
+#define USART_COMMON_F4_H
+
+typedef struct
+{
+  unsigned char irq_priority;
+  unsigned char irq_subpriority;
+  unsigned char dma_rx_priority;
+  unsigned char dma_rx_subpriority;
+  unsigned char dma_tx_priority;
+  unsigned char dma_tx_subpriority;
+}TUSART_IRQ_Priorities;
+
+#endif
diff --git a/f4/usart/src/usart1.c b/f4/usart/src/usart1.c
new file mode 100644
index 0000000000000000000000000000000000000000..70304ca31394486265883f654f427a772a3b2a3c
--- /dev/null
+++ b/f4/usart/src/usart1.c
@@ -0,0 +1,7 @@
+#include "usart1.h"
+
+/* public functions*/
+void usart1_init(TComm *comm_dev)
+{
+
+}
diff --git a/f4/usart/src/usart2.c b/f4/usart/src/usart2.c
new file mode 100644
index 0000000000000000000000000000000000000000..2d9a4c2aca734d62621df44d306208dba5840cd3
--- /dev/null
+++ b/f4/usart/src/usart2.c
@@ -0,0 +1,273 @@
+#include "usart2.h"
+
+#define     USART                    USART2
+#define     USART_CLK                RCC_APB1Periph_USART2
+#define     USART_CLK_INIT           RCC_APB1PeriphClockCmd
+#define     USART_IRQn               USART2_IRQn
+#define     USART_IRQHandler         USART2_IRQHandler
+
+#define     USART_TX_PIN             GPIO_Pin_2                
+#define     USART_TX_GPIO_PORT       GPIOA 
+#define     USART_TX_GPIO_CLK        RCC_AHB1Periph_GPIOA
+#define     USART_TX_SOURCE          GPIO_PinSource2
+#define     USART_TX_AF              GPIO_AF_USART2
+
+#define     USART_RX_PIN             GPIO_Pin_3
+#define     USART_RX_GPIO_PORT       GPIOA
+#define     USART_RX_GPIO_CLK        RCC_AHB1Periph_GPIOA
+#define     USART_RX_SOURCE          GPIO_PinSource3
+#define     USART_RX_AF              GPIO_AF_USART2
+
+#define     USART_DMA                DMA1
+#define     USART_DMA_CLK            RCC_AHB1Periph_DMA1
+
+#define     USART_TX_DMA_CHANNEL     DMA_Channel_4
+#define     USART_TX_DMA_STREAM      DMA1_Stream6
+#define     USART_TX_DMA_FLAG_FEIF   DMA_FLAG_FEIF6
+#define     USART_TX_DMA_FLAG_DMEIF  DMA_FLAG_DMEIF6
+#define     USART_TX_DMA_FLAG_TEIF   DMA_FLAG_TEIF6
+#define     USART_TX_DMA_FLAG_HTIF   DMA_FLAG_HTIF6
+#define     USART_TX_DMA_FLAG_TCIF   DMA_FLAG_TCIF6
+
+#define     USART_RX_DMA_CHANNEL     DMA_Channel_4
+#define     USART_RX_DMA_STREAM      DMA1_Stream5
+#define     USART_RX_DMA_FLAG_FEIF   DMA_FLAG_FEIF5
+#define     USART_RX_DMA_FLAG_DMEIF  DMA_FLAG_DMEIF5
+#define     USART_RX_DMA_FLAG_TEIF   DMA_FLAG_TEIF5
+#define     USART_RX_DMA_FLAG_HTIF   DMA_FLAG_HTIF5
+#define     USART_RX_DMA_FLAG_TCIF   DMA_FLAG_TCIF5
+
+#define     USART_DMA_TX_IRQn        DMA1_Stream6_IRQn
+#define     USART_DMA_RX_IRQn        DMA1_Stream5_IRQn
+#define     USART_DMA_TX_IRQHandler  DMA1_Stream6_IRQHandler
+#define     USART_DMA_RX_IRQHandler  DMA1_Stream5_IRQHandler
+
+// private variables
+DMA_InitTypeDef DMA_TX_InitStructure;
+DMA_InitTypeDef DMA_RX_InitStructure;
+TComm *usart2_comm_dev;
+
+// interrupt handlers
+void USART_IRQHandler(void)
+{
+  unsigned char data;
+
+  if(USART_GetITStatus(USART, USART_IT_RXNE) != RESET)
+  {
+    USART_ClearFlag(USART,USART_FLAG_RXNE);
+    data=USART_ReceiveData(USART);
+    // call the reception function
+    if(!comm_do_irq_receive(usart2_comm_dev,data))
+      USART_ITConfig(USART, USART_IT_RXNE, DISABLE);
+  }
+  if(USART_GetITStatus(USART, USART_IT_TC) != RESET)
+  {
+    USART_ClearFlag(USART,USART_FLAG_TC);
+    if(comm_do_irq_send(usart2_comm_dev,&data))
+      USART_SendData(USART,data);
+    else
+      USART_ITConfig(USART, USART_IT_TC, DISABLE);
+  }
+  if(USART_GetITStatus(USART,USART_FLAG_ORE) != RESET)// overrun error
+  {
+    // cancel any pending reception
+    USART_ITConfig(USART, USART_IT_RXNE, DISABLE);
+    usart2_comm_dev->irq_receiving=0x00;
+  }
+  if(USART_GetITStatus(USART,USART_IT_PE) != RESET)// parity error
+  {
+    // cancel any pending reception
+    USART_ITConfig(USART, USART_IT_RXNE, DISABLE);
+    usart2_comm_dev->irq_receiving=0x00;
+  }
+}
+
+void USART_DMA_TX_IRQHandler(void)
+{
+  DMA_Cmd(USART_TX_DMA_STREAM,DISABLE);
+  DMA_ClearFlag(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF);
+  DMA_ClearITPendingBit(USART_TX_DMA_STREAM,USART_TX_DMA_FLAG_TCIF);
+  USART_DMACmd(USART, USART_DMAReq_Tx, DISABLE);
+  // call the user function
+}
+
+void USART_DMA_RX_IRQHandler(void)
+{
+  DMA_Cmd(USART_RX_DMA_STREAM,DISABLE);
+  DMA_ClearFlag(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF);
+  DMA_ClearITPendingBit(USART_RX_DMA_STREAM,USART_RX_DMA_FLAG_TCIF);
+  USART_DMACmd(USART, USART_DMAReq_Rx, DISABLE);
+  // call the user function
+}
+
+/* public functions*/
+void usart2_init(TComm *comm_dev,TUSART_IRQ_Priorities *priorities)
+{
+  GPIO_InitTypeDef GPIO_InitStructure;
+  NVIC_InitTypeDef NVIC_InitStructure;
+
+  /* Enable GPIO clock */
+  USART_CLK_INIT(USART_CLK, ENABLE);
+  USART_TX_GPIO_CLK(USART_TX_GPIO_CLK,ENABLE)
+  USART_RX_GPIO_CLK(USART_RX_GPIO_CLK,ENABLE);
+
+  /* Connect USART pins to AF7 */
+  GPIO_PinAFConfig(USART_TX_GPIO_PORT, USART_TX_SOURCE, USART_TX_AF);
+  GPIO_PinAFConfig(USART_RX_GPIO_PORT, USART_RX_SOURCE, USART_RX_AF);
+
+  /* Configure USART Tx and Rx as alternate function push-pull */
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_InitStructure.GPIO_Pin = USART_TX_PIN;
+  GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure);
+
+  GPIO_InitStructure.GPIO_Pin = USART_RX_PIN;
+  GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure);
+
+  /* configure the interrupts */
+  NVIC_InitStructure.NVIC_IRQChannel = USART_IRQn;
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = priorities->irq_priority;
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = priorities->irq_subpriority;
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+  NVIC_Init(&NVIC_InitStructure);
+
+  USART_ITConfig(USART, USART_IT_RXNE |
+                        USART_IT_ORE |
+                        USART_IT_TXE |
+                        USART_IT_CTS |
+                        USART_IT_LBD |
+                        USART_IT_IDLE |
+                        USART_IT_PE |
+                        USART_IT_ERR |
+                        USART_IT_TC, DISABLE);
+
+  /* Clear all USART interrupt flags */
+  USART_ClearFlag(USART,USART_FLAG_RXNE |
+                        USART_FLAG_ORE |
+                        USART_FLAG_TXE |
+                        USART_FLAG_CTS |
+                        USART_FLAG_LBD |
+                        USART_FLAG_IDLE |
+                        USART_FLAG_PE |
+                        USART_FLAG_TC);
+
+  /* Clear all USART interrupt pending bits */
+  USART_ClearITPendingBit(USART, USART_FLAG_RXNE |
+                                 USART_FLAG_ORE |
+                                 USART_FLAG_TXE |
+                                 USART_FLAG_CTS |
+                                 USART_FLAG_LBD |
+                                 USART_FLAG_IDLE |
+                                 USART_FLAG_PE |
+                                 USART_FLAG_TC);
+
+  // configure the DMA channels
+  if(comm_dev->use_dma)
+  {
+    /* enable the DMA clock */
+    USART_DMA_CLK(USART_DMA_CLK, ENABLE);
+    /* Configure TX DMA */
+    DMA_DeInit(USART_TX_DMA_STREAM);
+    DMA_TX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
+    DMA_TX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
+    DMA_TX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
+    DMA_TX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    DMA_TX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    DMA_TX_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    DMA_TX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(USART->DR));
+    DMA_TX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
+    DMA_TX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+    DMA_TX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    DMA_TX_InitStructure.DMA_Priority = DMA_Priority_High;
+    DMA_TX_InitStructure.DMA_Channel = USART_TX_DMA_CHANNEL;
+    DMA_TX_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
+    /* initialize DMA interrupts */
+    NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_TX_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = priorities->dma_tx_priority;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = priorities->dma_tx_subpriority;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+    DMA_ITConfig(USART_TX_DMA_STREAM,DMA_IT_TC,ENABLE);
+    DMA_ITConfig(USART_TX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE);
+
+    /* Configure RX DMA */
+    DMA_DeInit(USART_RX_DMA_STREAM);
+    DMA_RX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
+    DMA_RX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
+    DMA_RX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
+    DMA_RX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
+    DMA_RX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
+    DMA_RX_InitStructure.DMA_Mode = DMA_Mode_Normal;
+    DMA_RX_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(USART->DR));
+    DMA_RX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
+    DMA_RX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
+    DMA_RX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
+    DMA_RX_InitStructure.DMA_Priority = DMA_Priority_High;
+    DMA_RX_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL;
+    DMA_RX_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
+    /* initialize DMA interrupts */
+    NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_RX_IRQn;
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = priorities->dma_rx_priority;
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = priority->dma_rx_subpriority;
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
+    NVIC_Init(&NVIC_InitStructure);
+    DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_TC,ENABLE);
+    DMA_ITConfig(USART_RX_DMA_STREAM,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE);
+  }
+  /* Initialize the comm structure */
+  comm_dev->receive=usart2_receive;
+  comm_dev->send_irq=usart2_send_irq;
+  comm_dev->receive_irq=usart2_receive_irq;
+  comm_dev->cancel_receive_irq=usart2_cancel_receive_irq;
+  if(comm_dev->use_dma)
+  {
+    comm_dev->send_dma=usart2_send_dma;
+    comm_dev->receive_dma=usart2_receive_dma;
+    comm_dev->cancel_receive_dma=usart2_cancel_receive_dma;
+  }
+  comm_dev->irq_send_cb=0x00000000;
+  comm_dev->irq_receive_cb=0x00000000;
+  comm_dev->dma_send_cb=0x00000000;
+  comm_dev->dma_receive_cb=0x00000000;
+
+  /* initialize internal variables */
+  usart2_comm_dev=comm_dev;
+
+  /* Enable the USART2 */
+  USART_Cmd(USART, ENABLE);
+}
+
+/* IRQ functions */
+unsigned char usart2_send_irq(unsigned char *data,unsigned int length)
+{
+
+}
+
+unsigned char usart2_receive_irq(unsigned int length)
+{
+
+}
+
+unsigned char usart2_cancel_receive_irq(void)
+{
+
+}
+
+/* DMA functions */
+unsigned char usart2_send_dma(unsigned char *data,unsigned int lenght)
+{
+
+}
+
+unsigned char usart2_receive_dma(unsigned int length)
+{
+
+}
+
+unsigned char usart2_cancel_receive_dma(void)
+{
+
+}
+