From a290b939808da7e2529b104c593545f4397c7029 Mon Sep 17 00:00:00 2001 From: huang <1085210385@qq.com> Date: Tue, 2 Jan 2024 11:11:35 +0800 Subject: [PATCH] uart2 --- .../XiZi_IIoT/board/ch32v307vct6/board.c | 16 +- .../third_party_driver/uart/Kconfig | 15 ++ .../third_party_driver/uart/connect_uart.c | 207 +++++++++++++----- 3 files changed, 186 insertions(+), 52 deletions(-) diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/board.c b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/board.c index 1f36ec74a..edf7ddb4a 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/board.c +++ b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/board.c @@ -57,15 +57,23 @@ static uint32_t _SysTick_Config(uint32_t ticks) /** * This function will initial your board. */ + +extern RxBuffer2; +extern uint16_t UART_ReceiveData(USART_TypeDef* USARTx); void InitBoardHardware() { - USART_Printf_Init(115200); + // USART_Printf_Init(115200); /* System Tick Configuration */ _SysTick_Config(SystemCoreClock / TICK_PER_SECOND); /* initialize memory system */ InitBoardMemory(MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); InitHwUart(); +#ifdef BSP_USING_UART1 InstallConsole("uart1", "uart1_drv", "uart1_dev1"); +#endif + // #ifdef BSP_USING_UART2 + // InstallConsole("uart2", "uart2_drv", "uart2_dev2"); + // #endif #ifdef BSP_USING_ETH InitHwEth(); @@ -78,4 +86,10 @@ void InitBoardHardware() KPrintf("board init done.\n"); KPrintf("start okernel...\n"); + while (1) { + uint16_t ans = UART_ReceiveData(USART3); + KPrintf("%d\n", ans); + for (int i = 0; i < 1000; i++) + ; + } } diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/Kconfig b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/Kconfig index 54c333882..ba809be21 100755 --- a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/Kconfig +++ b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/Kconfig @@ -12,3 +12,18 @@ menuconfig BSP_USING_UART1 string "serial bus device name" default "uart1_dev1" endif + +menuconfig BSP_USING_UART2 + bool "Enable UART2" + default y + if BSP_USING_UART2 + config SERIAL_BUS_NAME_2 + string "serial bus name" + default "uart2" + config SERIAL_DRV_NAME_2 + string "serial bus driver name" + default "uart2_drv" + config SERIAL_2_DEVICE_NAME_0 + string "serial bus device name" + default "uart2_dev2" + endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/connect_uart.c index f36a7722d..1e1dff214 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/connect_uart.c @@ -76,6 +76,7 @@ static void UartIsr(struct SerialDriver* serial_drv, struct SerialHardwareDevice static uint32 SerialInit(struct SerialDriver* serial_drv, struct BusConfigureInfo* configure_info) { + KPrintf("Serial init\n"); NULL_PARAM_CHECK(serial_drv); struct SerialCfgParam* serial_cfg = (struct SerialCfgParam*)serial_drv->private_data; // struct UsartHwCfg *serial_hw_cfg = (struct UsartHwCfg *)serial_cfg->hw_cfg.private_data; @@ -96,63 +97,63 @@ static uint32 SerialInit(struct SerialDriver* serial_drv, struct BusConfigureInf dev_param->serial_timeout = serial_cfg->data_cfg.serial_timeout; // init usart type def - GPIO_InitTypeDef GPIO_InitStructure; + // GPIO_InitTypeDef GPIO_InitStructure; - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); + // RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_Init(GPIOA, &GPIO_InitStructure); + // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + // GPIO_Init(GPIOA, &GPIO_InitStructure); - USART_InitTypeDef USART_InitStructure; - USART_InitStructure.USART_BaudRate = serial_cfg->data_cfg.serial_baud_rate; + // USART_InitTypeDef USART_InitStructure; + // USART_InitStructure.USART_BaudRate = serial_cfg->data_cfg.serial_baud_rate; - switch (serial_cfg->data_cfg.serial_data_bits) { - case DATA_BITS_8: - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - break; + // switch (serial_cfg->data_cfg.serial_data_bits) { + // case DATA_BITS_8: + // USART_InitStructure.USART_WordLength = USART_WordLength_8b; + // break; - case DATA_BITS_9: - USART_InitStructure.USART_WordLength = USART_WordLength_9b; - break; - default: - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - break; - } + // case DATA_BITS_9: + // USART_InitStructure.USART_WordLength = USART_WordLength_9b; + // break; + // default: + // USART_InitStructure.USART_WordLength = USART_WordLength_8b; + // break; + // } - switch (serial_cfg->data_cfg.serial_stop_bits) { - case STOP_BITS_1: - USART_InitStructure.USART_StopBits = USART_StopBits_1; - break; - case STOP_BITS_2: - USART_InitStructure.USART_StopBits = USART_StopBits_2; - break; - default: - USART_InitStructure.USART_StopBits = USART_StopBits_1; - break; - } + // switch (serial_cfg->data_cfg.serial_stop_bits) { + // case STOP_BITS_1: + // USART_InitStructure.USART_StopBits = USART_StopBits_1; + // break; + // case STOP_BITS_2: + // USART_InitStructure.USART_StopBits = USART_StopBits_2; + // break; + // default: + // USART_InitStructure.USART_StopBits = USART_StopBits_1; + // break; + // } - switch (serial_cfg->data_cfg.serial_parity_mode) { - case PARITY_NONE: - USART_InitStructure.USART_Parity = USART_Parity_No; - break; - case PARITY_ODD: - USART_InitStructure.USART_Parity = USART_Parity_Odd; - break; - case PARITY_EVEN: - USART_InitStructure.USART_Parity = USART_Parity_Even; - break; - default: - USART_InitStructure.USART_Parity = USART_Parity_No; - break; - } + // switch (serial_cfg->data_cfg.serial_parity_mode) { + // case PARITY_NONE: + // USART_InitStructure.USART_Parity = USART_Parity_No; + // break; + // case PARITY_ODD: + // USART_InitStructure.USART_Parity = USART_Parity_Odd; + // break; + // case PARITY_EVEN: + // USART_InitStructure.USART_Parity = USART_Parity_Even; + // break; + // default: + // USART_InitStructure.USART_Parity = USART_Parity_No; + // break; + // } - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + // USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + // USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; - USART_Init(USART1, &USART_InitStructure); - USART_Cmd(USART1, ENABLE); + // USART_Init(USART1, &USART_InitStructure); + // USART_Cmd(USART1, ENABLE); // usart_hardware_flow_rts_config(serial_cfg->hw_cfg.serial_register_base, USART_RTS_DISABLE); // usart_hardware_flow_cts_config(serial_cfg->hw_cfg.serial_register_base, USART_CTS_DISABLE); @@ -304,6 +305,7 @@ struct SerialHardwareDevice serial_device_1; void USART1_IRQHandler(void) __attribute__((interrupt())); void USART1_IRQHandler(void) { + KPrintf("uart1\n"); GET_INT_SP(); x_base level; level = DisableLocalInterrupt(); @@ -317,10 +319,50 @@ void USART1_IRQHandler(void) } #endif +#ifdef BSP_USING_UART2 +struct SerialDriver serial_driver_2; +struct SerialHardwareDevice serial_device_2; + +#define TxSize2 100 +uint16_t RxBuffer2[TxSize2] = { 0 }; +uint16_t TxCnt2 = 0, RxCnt2 = 0; + +void USART3_IRQHandler(void) __attribute__((interrupt())); +uint16_t UART_ReceiveData(USART_TypeDef* USARTx) +{ + return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF); +} + +void USART3_IRQHandler(void) +{ + if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { + RxBuffer2[RxCnt2++] = UART_ReceiveData(USART3); + + if (RxCnt2 == 100) { + USART_ITConfig(USART3, USART_IT_RXNE, DISABLE); + } + } +} +// void USART3_IRQHandler(void) +// { +// GET_INT_SP(); +// x_base level; +// level = DisableLocalInterrupt(); +// isrManager.done->incCounter(); +// EnableLocalInterrupt(level); +// UartIsr(&serial_driver_2, &serial_device_2); +// level = DisableLocalInterrupt(); +// isrManager.done->decCounter(); +// EnableLocalInterrupt(level); +// FREE_INT_SP(); +// } +#endif + int InitHwUart(void) { x_err_t ret = EOK; +#ifdef BSP_USING_UART1 static struct SerialBus serial_bus; memset(&serial_bus, 0, sizeof(struct SerialBus)); @@ -340,10 +382,8 @@ int InitHwUart(void) serial_cfg.data_cfg = data_cfg_init; -#ifdef BSP_USING_UART1 serial_cfg.hw_cfg.serial_register_base = (uint32)USART1; serial_cfg.hw_cfg.serial_irq_interrupt = USART1_IRQn; -#endif serial_driver_1.private_data = (void*)&serial_cfg; @@ -382,6 +422,71 @@ int InitHwUart(void) usart_init_struct.USART_Parity = USART_Parity_No; USART_Init((USART_TypeDef*)serial_cfg.hw_cfg.serial_register_base, &usart_init_struct); USART_Cmd((USART_TypeDef*)serial_cfg.hw_cfg.serial_register_base, ENABLE); +#endif + +#ifdef BSP_USING_UART2 + static struct SerialBus serial_bus_2; + memset(&serial_bus_2, 0, sizeof(struct SerialBus)); + + memset(&serial_driver_2, 0, sizeof(struct SerialDriver)); + + memset(&serial_device_2, 0, sizeof(struct SerialHardwareDevice)); + + static struct SerialCfgParam serial_cfg_2; + memset(&serial_cfg_2, 0, sizeof(struct SerialCfgParam)); + + static struct SerialDevParam serial_dev_param_2; + memset(&serial_dev_param_2, 0, sizeof(struct SerialDevParam)); + + serial_driver_2.drv_done = &drv_done; + serial_driver_2.configure = &SerialDrvConfigure; + serial_device_2.hwdev_done = &hwdev_done; + + serial_cfg_2.data_cfg = data_cfg_init; + + serial_cfg_2.hw_cfg.serial_register_base = (uint32)USART3; + serial_cfg_2.hw_cfg.serial_irq_interrupt = USART3_IRQn; + + serial_driver_2.private_data = (void*)&serial_cfg_2; + + serial_dev_param_2.serial_work_mode = SIGN_OPER_INT_RX; + serial_device_2.haldev.private_data = (void*)&serial_dev_param_2; + + ret = BoardSerialBusInit(&serial_bus_2, &serial_driver_2, SERIAL_BUS_NAME_2, SERIAL_DRV_NAME_2); + if (EOK != ret) { + KPrintf("InitHwUart 2 uarths error ret %u\n", ret); + return ERROR; + } + + ret = BoardSerialDevBend(&serial_device_2, (void*)&serial_cfg_2, SERIAL_BUS_NAME_2, SERIAL_2_DEVICE_NAME_0); + if (EOK != ret) { + KPrintf("InitHwUart 2 uarths error ret %u\n", ret); + return ERROR; + } + + GPIO_InitTypeDef gpio_init_struct_2; + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + // RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART3 | RCC_APB2Periph_GPIOB, ENABLE); + gpio_init_struct_2.GPIO_Pin = GPIO_Pin_10; + gpio_init_struct_2.GPIO_Speed = GPIO_Speed_50MHz; + gpio_init_struct_2.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOB, &gpio_init_struct_2); + gpio_init_struct_2.GPIO_Pin = GPIO_Pin_11; + gpio_init_struct_2.GPIO_Speed = GPIO_Speed_50MHz; + gpio_init_struct_2.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOB, &gpio_init_struct_2); + + USART_InitTypeDef usart_init_struct_2; + usart_init_struct_2.USART_BaudRate = 115200; + usart_init_struct_2.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + usart_init_struct_2.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + usart_init_struct_2.USART_WordLength = USART_WordLength_8b; + usart_init_struct_2.USART_StopBits = USART_StopBits_1; + usart_init_struct_2.USART_Parity = USART_Parity_No; + USART_Init((USART_TypeDef*)serial_cfg_2.hw_cfg.serial_register_base, &usart_init_struct_2); + USART_Cmd((USART_TypeDef*)serial_cfg_2.hw_cfg.serial_register_base, ENABLE); +#endif return ret; -} \ No newline at end of file +}