From 000d1d74d4aebbd8af90c9a7c9359d8ae19da9fb Mon Sep 17 00:00:00 2001 From: Third_flow <1696137481@qq.com> Date: Wed, 1 Sep 2021 23:49:06 +0800 Subject: [PATCH] bsp UART --- bsp/gpio.c | 10 +++++ bsp/uart.c | 117 +++++++++++++++++++++++++++++++++++++++-------------- bsp/uart.h | 5 +-- 3 files changed, 99 insertions(+), 33 deletions(-) diff --git a/bsp/gpio.c b/bsp/gpio.c index 9f0c868..3a5abd2 100644 --- a/bsp/gpio.c +++ b/bsp/gpio.c @@ -113,6 +113,16 @@ static void open(void * dev_obj,void *handle) #endif break; } + + switch(bsp_base->dev_type&0x10) { + case UART_DEV: +#if defined (STM32F40_41xxx) + // f4 +#elif defined (STM32F10X_XL) || (STM32F10X_MD) + gpio_info->gpio_arg.GPIO_Mode = GPIO_Mode_AF_PP; +#endif + break; + } /* open the clock */ GPIO_RCC_PeriphClockEnable(gpio_info->gpio_clock); diff --git a/bsp/uart.c b/bsp/uart.c index 9a31a45..834dc1a 100644 --- a/bsp/uart.c +++ b/bsp/uart.c @@ -22,8 +22,12 @@ */ /* Includes ------------------------------------------------------------------*/ +#include "gpio.h" +#include "bsp.h" #include "uart.h" +extern u32 TIME; + static void open(void * dev_obj); static int8_t write(void * dev_obj,void * data); static int8_t read(void * dev_obj,void * data); @@ -32,31 +36,38 @@ static void close(void * dev_obj); /** * uart1 : tx pa9 rx pa10 */ - static UART_T G_UART_GROUP[UART_GROUP_NUM] = { - UART1, { - {//tx pa9 - PA9, - 0 - }, - {//rx pa10 - PA10, - 0 + UART1, + // GPIO_PIN_T + { + { //tx pa9 + UART_DEV, + { + {PA9,0}, + }, + 1, + }, + { //rx pa10 + PIN_UP, + { + {PA10,0}, + }, + 1, + }, }, - + RCC_APB2Periph_USART1, + USART1, + { + 9600, + USART_WordLength_8b, + USART_StopBits_1, + USART_Parity_No, + USART_Mode_Tx | USART_Mode_Rx, + USART_HardwareFlowControl_None, + } }, - RCC_APB2Periph_USART1, - USART1, - { - 9600, - USART_WordLength_8b, - USART_StopBits_1, - USART_Parity_No, - USART_Mode_Tx | USART_Mode_Rx, - USART_HardwareFlowControl_None, - } }; /** @@ -64,6 +75,7 @@ static UART_T G_UART_GROUP[UART_GROUP_NUM] = * @param dev_obj. * @retval None */ + void uart_init(void *dev_obj) { ((UART_OPR_T *)dev_obj)->open = open; @@ -77,22 +89,44 @@ void uart_init(void *dev_obj) * @param device obj. * @retval None */ + static void open(void * dev_obj) { UART_PIN_NAME_T pin_name = TX; GPIO_OPR_T kgpio; - /* open the clock */ - RCC_APB2PeriphClockCmd(G_UART_GROUP[(uint32_t)dev_obj].uart_clock,ENABLE); + GPIO_INFO_T kgpio_info; + /* open the clock + UART1 RCC_APB2PeriphClockCmd + UART2 RCC_APB1PeriphClockCmd + UART3 RCC_APB1PeriphClockCmd + */ + switch((uint32_t)dev_obj) { + case 0: + case 6: + RCC_APB2PeriphClockCmd(G_UART_GROUP[(uint32_t)dev_obj].uart_clock,ENABLE); + break; + case 1: + case 2: + case 3: + case 4: + case 5: + RCC_APB1PeriphClockCmd(G_UART_GROUP[(uint32_t)dev_obj].uart_clock,ENABLE); + break; + default: + RCC_APB1PeriphClockCmd(G_UART_GROUP[(uint32_t)dev_obj].uart_clock,ENABLE); + } + /* init uart pins*/ - gpio_init(&kgpio); + gpio_opr_init(&kgpio); for(;pin_name <= RX;pin_name++) { - kgpio.open(&(G_UART_GROUP[(uint32_t)dev_obj].uart_gpio[pin_name].pin)); + kgpio.open(&(G_UART_GROUP[(uint32_t)dev_obj].uart_bsp[pin_name]), &kgpio_info); } /* init uart*/ USART_Init(G_UART_GROUP[(uint32_t)dev_obj].uart_x,&G_UART_GROUP[(uint32_t)dev_obj].uart_arg); USART_Cmd(G_UART_GROUP[(uint32_t)dev_obj].uart_x,ENABLE); + } /** @@ -108,7 +142,6 @@ static int8_t write(void * dev_obj,void * data) USART_SendData(G_UART_GROUP[(uint32_t)dev_obj].uart_x,*((uint16_t *)data)); while(!USART_GetFlagStatus(G_UART_GROUP[(uint32_t)dev_obj].uart_x,USART_FLAG_TC)); result_state = 1; - return result_state; } @@ -117,12 +150,36 @@ static int8_t write(void * dev_obj,void * data) * @param device obj. * @retval opr state */ -static int8_t read(void * dev_obj,void * data) -{ - int8_t result_state = 0; - +static int8_t read(void * dev_obj,void *data) +{ + int8_t result_state = 0; + u32 calTIme = TIME; + u8 *result = (u8*)data; + USART_ClearFlag(USART1, USART_FLAG_RXNE); + while (USART_GetFlagStatus(G_UART_GROUP[(uint32_t)dev_obj].uart_x, USART_FLAG_RXNE) == RESET) + { + if (TIME - calTIme > 1000) + { + /*overtime no data*/ + return result_state; + } + } + calTIme = TIME; + while(1) { + /*receive data within 20 ticks*/ + if (TIME - calTIme > 20) break; + if (USART_GetFlagStatus(G_UART_GROUP[(uint32_t)dev_obj].uart_x, USART_FLAG_RXNE) == SET) + { + /*update start point*/ + calTIme = TIME; + *result = (u8)USART_ReceiveData(G_UART_GROUP[(uint32_t)dev_obj].uart_x); + USART_ClearFlag(G_UART_GROUP[(uint32_t)dev_obj].uart_x, USART_FLAG_RXNE); + ++result_state; + ++result; + } + } return result_state; } @@ -133,5 +190,5 @@ static int8_t read(void * dev_obj,void * data) */ static void close(void * dev_obj) { - + } diff --git a/bsp/uart.h b/bsp/uart.h index ba0f079..a6a6f1b 100644 --- a/bsp/uart.h +++ b/bsp/uart.h @@ -26,7 +26,6 @@ #define _UART_H #define G_UART extern - /* Includes ------------------------------------------------------------------*/ #if defined (STM32F40_41xxx) #include "stm32f4xx.h" @@ -76,7 +75,7 @@ typedef enum typedef struct { UART_NAME_T uart_name; /*!< uart name */ - GPIO_PIN_T uart_gpio[RX+1]; /*!< uart pins */ + BSP_INFO_T uart_bsp[RX+1]; /*!< uart bsp */ uint32_t uart_clock; /*!< RCC clock */ USART_TypeDef* uart_x; /*!< uart x */ USART_InitTypeDef uart_arg; /*!< uart config */ @@ -110,7 +109,7 @@ typedef struct /** @defgroup UART_Exported_Functions * @{ */ -G_UART void uart_init(void *dev_obj); +extern void uart_init(void *dev_obj); /** * @} */ -- Gitee