瀏覽代碼

Merge pull request #433 from wangzhouwang/master

[bsp] add uart4 driver for stm32f10x bsp.
Bernard Xiong 10 年之前
父節點
當前提交
4888957d22
共有 1 個文件被更改,包括 82 次插入0 次删除
  1. 82 0
      bsp/stm32f10x/drivers/usart.c

+ 82 - 0
bsp/stm32f10x/drivers/usart.c

@@ -35,6 +35,12 @@
 #define UART3_GPIO_RX        GPIO_Pin_11
 #define UART3_GPIO           GPIOB
 
+/* USART4 */
+#define UART4_GPIO_TX        GPIO_Pin_10
+#define UART4_GPIO_RX        GPIO_Pin_11
+#define UART4_GPIO           GPIOC
+
+
 /* STM32 uart driver */
 struct stm32_uart
 {
@@ -264,6 +270,45 @@ void USART3_IRQHandler(void)
 }
 #endif /* RT_USING_UART3 */
 
+#if defined(RT_USING_UART4)
+/* UART4 device driver structure */
+struct stm32_uart uart4 =
+{
+    UART4,
+    UART4_IRQn,
+};
+struct rt_serial_device serial4;
+
+void UART4_IRQHandler(void)
+{
+    struct stm32_uart* uart;
+
+    uart = &uart4;
+
+    /* enter interrupt */
+    rt_interrupt_enter();
+    if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET)
+    {
+        rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND);
+        /* clear interrupt */
+        USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE);
+    }
+    if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET)
+    {
+        /* clear interrupt */
+        USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
+    }
+    if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_ORE) == SET)
+    {
+        stm32_getc(&serial4);
+    }
+
+    /* leave interrupt */
+    rt_interrupt_leave();
+}
+#endif /* RT_USING_UART3 */
+
+
 static void RCC_Configuration(void)
 {
 #if defined(RT_USING_UART1)
@@ -286,6 +331,14 @@ static void RCC_Configuration(void)
     /* Enable UART clock */
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
 #endif /* RT_USING_UART3 */
+
+#if defined(RT_USING_UART4)
+    /* Enable UART GPIO clocks */
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+    /* Enable UART clock */
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
+#endif /* RT_USING_UART4 */
+
 }
 
 static void GPIO_Configuration(void)
@@ -326,6 +379,18 @@ static void GPIO_Configuration(void)
     GPIO_InitStructure.GPIO_Pin = UART3_GPIO_TX;
     GPIO_Init(UART3_GPIO, &GPIO_InitStructure);
 #endif /* RT_USING_UART3 */
+
+#if defined(RT_USING_UART4)
+    /* Configure USART Rx/tx PIN */
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+    GPIO_InitStructure.GPIO_Pin = UART4_GPIO_RX;
+    GPIO_Init(UART4_GPIO, &GPIO_InitStructure);
+
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
+    GPIO_InitStructure.GPIO_Pin = UART4_GPIO_TX;
+    GPIO_Init(UART4_GPIO, &GPIO_InitStructure);
+#endif /* RT_USING_UART4 */
+
 }
 
 static void NVIC_Configuration(struct stm32_uart* uart)
@@ -393,4 +458,21 @@ void rt_hw_usart_init(void)
                           RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
                           uart);
 #endif /* RT_USING_UART3 */
+
+#if defined(RT_USING_UART4)
+    uart = &uart4;
+
+    config.baud_rate = BAUD_RATE_115200;
+
+    serial4.ops    = &stm32_uart_ops;
+    serial4.config = config;
+
+    NVIC_Configuration(&uart4);
+
+    /* register UART4 device */
+    rt_hw_serial_register(&serial4, "uart4",
+                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
+                          uart);
+#endif /* RT_USING_UART4 */
+
 }