Merge branch 'prepare_for_master' of https://gitlink.org.cn/hc0014/xiuos into prepare_for_master
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
SRC_FILES := rs485_test.c
|
||||
|
||||
|
||||
include $(KERNEL_ROOT)/compiler.mk
|
||||
@@ -0,0 +1,84 @@
|
||||
0.该测试在Ubiquitous中测试通过(将驱动中静态的收发操作在测试文件中实现),在APP_Framework的测试中BusFind,BusFindDriver,BusFindDevice可找到相应的设备,但无法通过其进行读写等操作
|
||||
|
||||
```
|
||||
// APP_Framework/Applications/main.c
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <transform.h>
|
||||
#include <bus.h>
|
||||
#define RS485_UART_BUS "uart5"
|
||||
#define RS485_UART_DRV "uart5_drv"
|
||||
#define RS485_UART_DEV "uart5_dev5"
|
||||
|
||||
void Test485(void)
|
||||
{
|
||||
/*
|
||||
485的驱动,使用UART5,在connect_uart.c中添加UART5的初始化,添加UART5的Kconfig,borad.c中使用InstallConsole用uart5串口正常输出控制台信息;在app_famework中加入app_test的485测试用例后出现
|
||||
|
||||
HardFault_Handler.
|
||||
mepc :000f448
|
||||
mcause:0000007
|
||||
mtval :200100d4
|
||||
|
||||
报错,控制台停止运行,最后将Test485用例摘出放置main.c中,发现将PrivOpen编译进bin就会报错(没有实际执行)
|
||||
|
||||
试了试busfind,bus,bus_drv,bus_dev都能找到,但是BusDevWriteData(dev, &write_param)编译进去后无法运行(OS无法起来/没有实际执行);Busdevclose导致程序崩溃
|
||||
|
||||
Test 485 start
|
||||
[ERR][x_free] Freeing a unallocated address.
|
||||
HardFault_Handler.
|
||||
mepc :0000012
|
||||
mcause:0000002
|
||||
mtval :0000000
|
||||
|
||||
在Ubiquitous/XiZi_IIoT/board/ch32v307vct6/third_party_driver/uart/test测试中
|
||||
可以通过485串口正常输出接收
|
||||
|
||||
*/
|
||||
|
||||
KPrintf("Test 485 start\n");
|
||||
struct Bus *bus;
|
||||
struct HardwareDev *dev;
|
||||
struct Driver *drv;
|
||||
char test_str[] = "Hello AIIT!\r\n";
|
||||
/* find the serial bus pointer */
|
||||
bus = BusFind(RS485_UART_BUS);
|
||||
if (NONE == bus)
|
||||
{
|
||||
KPrintf("BusFind %s failed\n", RS485_UART_BUS);
|
||||
return;
|
||||
}
|
||||
/* find the serial driver pointer */
|
||||
drv = BusFindDriver(bus, RS485_UART_DRV);
|
||||
if (NONE == drv)
|
||||
{
|
||||
KPrintf("BusFindDriver %s failed\n", RS485_UART_DRV);
|
||||
return;
|
||||
}
|
||||
/* find the serial device pointer */
|
||||
dev = BusFindDevice(bus, RS485_UART_DEV);
|
||||
if (NONE == dev)
|
||||
{
|
||||
KPrintf("BusFindDevice %s failed\n", RS485_UART_DEV);
|
||||
return;
|
||||
}
|
||||
struct BusBlockWriteParam write_param;
|
||||
write_param.pos = 0;
|
||||
write_param.buffer = (void *)test_str;
|
||||
write_param.size = sizeof(test_str) - 1;
|
||||
|
||||
// BusDevWriteData(dev, &write_param);
|
||||
// BusDevClose(dev);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
PRIV_SHELL_CMD_FUNCTION(Test485, a 485 test sample, PRIV_SHELL_CMD_MAIN_ATTR);
|
||||
```
|
||||
|
||||
|
||||
1.make BOARD=ch32v307vct6 menuconfig中配置UART相关参数 ch32v307vct6 feature ---> Enable UART5 --->
|
||||
|
||||
2.编译后将其烧录至开发板上,连接485转USB硬件至主机,主机使用串口工具打开执行test_rs485命令,运行485收发测试。
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright (c) 2020 AIIT XUOS Lab
|
||||
* XiUOS is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file rs485_test.c
|
||||
* @brief test ch32v307 485
|
||||
* @version 1.0
|
||||
* @author AIIT XUOS Lab
|
||||
* @date 2024-03-14
|
||||
*/
|
||||
#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);
|
||||
Reference in New Issue
Block a user