移植并验证:can驱动485驱动;未验证:USB驱动

This commit is contained in:
hyl
2024-03-12 16:05:17 +08:00
parent 814a742260
commit 1e6f366843
32 changed files with 5420 additions and 19 deletions
@@ -1,6 +1,6 @@
menuconfig BSP_USING_UART1
bool "Enable UART1"
default y
default n
if BSP_USING_UART1
config SERIAL_BUS_NAME_1
string "serial bus name"
@@ -15,7 +15,7 @@ menuconfig BSP_USING_UART1
menuconfig BSP_USING_UART2
bool "Enable UART2"
default y
default n
if BSP_USING_UART2
config SERIAL_BUS_NAME_2
string "serial bus name"
@@ -42,3 +42,18 @@ menuconfig BSP_USING_UART4
string "serial bus device name"
default "uart4_dev4"
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
default y
if BSP_USING_UART5
config SERIAL_BUS_NAME_5
string "serial bus name"
default "uart5"
config SERIAL_DRV_NAME_5
string "serial bus driver name"
default "uart5_drv"
config SERIAL_5_DEVICE_NAME_0
string "serial bus device name"
default "uart5_dev5"
endif
@@ -1,4 +1,4 @@
SRC_FILES := connect_uart.c
SRC_DIR := test
include $(KERNEL_ROOT)/compiler.mk
@@ -325,6 +325,28 @@ void UART4_IRQHandler(void)
}
#endif
#ifdef BSP_USING_UART5
struct SerialDriver serial_driver_5;
struct SerialHardwareDevice serial_device_5;
#define TxSize5 100
uint16_t RxBuffer5[TxSize5] = { 0 };
uint16_t TxCnt5 = 0, RxCnt5 = 0;
void USART5_IRQHandler(void) __attribute__((interrupt()));
void USART5_IRQHandler(void)
{
if (USART_GetITStatus(UART5, USART_IT_RXNE) != RESET) {
RxBuffer5[RxCnt5++] = UART_ReceiveData(UART5);
if (RxCnt5 == 100) {
USART_ITConfig(UART5, USART_IT_RXNE, DISABLE);
}
}
}
#endif
int InitHwUart(void)
{
x_err_t ret = EOK;
@@ -519,5 +541,69 @@ int InitHwUart(void)
USART_Cmd((USART_TypeDef*)serial_cfg_4.hw_cfg.serial_register_base, ENABLE);
#endif
#ifdef BSP_USING_UART5
static struct SerialBus serial_bus_5;
memset(&serial_bus_5, 0, sizeof(struct SerialBus));
memset(&serial_driver_5, 0, sizeof(struct SerialDriver));
memset(&serial_device_5, 0, sizeof(struct SerialHardwareDevice));
static struct SerialCfgParam serial_cfg_5;
memset(&serial_cfg_5, 0, sizeof(struct SerialCfgParam));
static struct SerialDevParam serial_dev_param_5;
memset(&serial_dev_param_5, 0, sizeof(struct SerialDevParam));
serial_driver_5.drv_done = &drv_done;
serial_driver_5.configure = &SerialDrvConfigure;
serial_device_5.hwdev_done = &hwdev_done;
serial_cfg_5.data_cfg = data_cfg_init;
serial_cfg_5.hw_cfg.serial_register_base = (uint32)UART5;
serial_cfg_5.hw_cfg.serial_irq_interrupt = UART5_IRQn;
serial_driver_5.private_data = (void*)&serial_cfg_5;
serial_dev_param_5.serial_work_mode = SIGN_OPER_INT_RX;
serial_device_5.haldev.private_data = (void*)&serial_dev_param_5;
ret = BoardSerialBusInit(&serial_bus_5, &serial_driver_5, SERIAL_BUS_NAME_5, SERIAL_DRV_NAME_5);
if (EOK != ret) {
KPrintf("InitHwUart 5 uarths error ret %u\n", ret);
return ERROR;
}
ret = BoardSerialDevBend(&serial_device_5, (void*)&serial_cfg_5, SERIAL_BUS_NAME_5, SERIAL_5_DEVICE_NAME_0);
if (EOK != ret) {
KPrintf("InitHwUart 5 uarths error ret %u\n", ret);
return ERROR;
}
GPIO_InitTypeDef gpio_init_struct_5;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
gpio_init_struct_5.GPIO_Pin = GPIO_Pin_12;
gpio_init_struct_5.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init_struct_5.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &gpio_init_struct_5);
gpio_init_struct_5.GPIO_Pin = GPIO_Pin_2;
gpio_init_struct_5.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init_struct_5.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &gpio_init_struct_5);
USART_InitTypeDef usart_init_struct_5;
usart_init_struct_5.USART_BaudRate = 9600;
usart_init_struct_5.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart_init_struct_5.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
usart_init_struct_5.USART_WordLength = USART_WordLength_8b;
usart_init_struct_5.USART_StopBits = USART_StopBits_1;
usart_init_struct_5.USART_Parity = USART_Parity_No;
USART_Init((USART_TypeDef*)serial_cfg_5.hw_cfg.serial_register_base, &usart_init_struct_5);
USART_Cmd((USART_TypeDef*)serial_cfg_5.hw_cfg.serial_register_base, ENABLE);
#endif
return ret;
}
@@ -0,0 +1,4 @@
SRC_FILES := rs485_test.c
include $(KERNEL_ROOT)/compiler.mk
@@ -0,0 +1,97 @@
#include "shell.h"
#include "ch32v30x.h"
#include "ch32v30x_usart.h"
#include "connect_uart.h"
// UART5发送数据
static void UART5_SendData(uint8_t data)
{
// 等待发送缓冲区为空
while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET)
{
}
// 发送数据
USART_SendData(UART5, data);
}
// UART5接收数据
static uint8_t UART5_ReceiveData(void)
{
// 等待接收缓冲区非空
while (USART_GetFlagStatus(UART5, USART_FLAG_RXNE) == RESET)
{
}
// 读取接收数据
return USART_ReceiveData(UART5);
}
static void UART5_SendString(const char *buffer)
{
size_t len = strlen(buffer);
for (size_t i = 0; i < len; i++)
{
if (buffer[i] != '\r' || buffer[i] != '\n')
{
UART5_SendData(buffer[i]);
}
}
}
static void UART5_ReceiveString(char *buffer, size_t bufferSize)
{
size_t i = 0;
while (i < bufferSize - 1)
{
char receivedChar = UART5_ReceiveData();
if (receivedChar == '\n')
{
// 收到回车或换行符,表示字符串接收完毕
break;
}
buffer[i] = receivedChar;
i++;
}
buffer[i] = '\0'; // 在字符串末尾添加空字符,表示字符串结束
while (USART_GetFlagStatus(UART5, USART_FLAG_RXNE) != RESET)
{
char dummy = USART_ReceiveData(UART5);
(void)dummy; // 避免编译器警告
}
}
int test_rs485(int argc, char *argv[])
{
KPrintf("485 Test\r\n");
char receiveBuffer[100];
char *sendString = " hello aiit 485\r\n";
int n = 10;
UART5_SendString(sendString);
while (n--)
{
// 接收字符串
UART5_ReceiveString(receiveBuffer, sizeof(receiveBuffer));
KPrintf("%s\r\n", receiveBuffer);
if (receiveBuffer[0] == 0xfd)
{
UART5_SendString(sendString);
}
else
{
USART_ClearFlag(UART5, USART_FLAG_TC);
UART5_SendString(receiveBuffer);
}
}
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
test_rs485, test_rs485, test rs485);