Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,464 changes: 1,464 additions & 0 deletions bsp/gd32/arm/gd32405rg/.config

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions bsp/gd32/arm/gd32405rg/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
compile_commands*
*.uvguix.*
EventRecorderStub.*
12 changes: 12 additions & 0 deletions bsp/gd32/arm/gd32405rg/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
mainmenu "RT-Thread Configuration"

BSP_DIR := .

RTT_DIR := ../../../..

PKGS_DIR := packages

source "$(RTT_DIR)/Kconfig"
osource "$PKGS_DIR/Kconfig"
rsource "../libraries/Kconfig"
rsource "board/Kconfig"
107 changes: 107 additions & 0 deletions bsp/gd32/arm/gd32405rg/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# GD32405RG BSP说明

## 简介

GD32405RG是-兆易创新推出的一款GD32F4XX系列的MCU,最高主频高达168M。参考GD32F407V-START开发板BSP

开发板外观如下图所示(仅芯片,没有开发板图片,下图为GD32407V-START开发板):

![board](figures/board.jpg)

该开发板常用 **板载资源** 如下:

- GD32405RGT6,主频 168MHz,1024KB FLASH ,128KB RAM + 64KB TCMRAM (其他F4 BSP的RAM存在问题,实际的RAM布局应该像我这样)
![memrey map](README_assets/image.png)

- 常用接口:USB 接口

- 调试接口:DAP-LINK

## 外设支持

本 BSP 目前对外设的支持情况如下:

| **片上外设** | **支持情况** | **备注** |
| :----------- | :----------: | :------------------------------ |
| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...81 |
| UART | 支持 | UART0 - UART5 |
| I2C | 支持 | I2C1 |
| SPI | 支持 | SPI0 -  SPI2 |
| SPI FLASH | 支持 | |
| ADC | 支持 | ADC0 - ADC2 |
| **扩展模块** | **支持情况** | **备注** |
| 暂无 | 暂不支持 | 暂不支持 |

## 使用说明

使用说明分为如下两个章节:

- 快速上手

本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。

- 进阶使用

本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。

### 快速上手

本 BSP 为开发者提供 MDK5 工程,并且支持 GCC 开发环境,也可使用RT-Thread Studio开发,IAR/MDK4未做修改,如果您使用IAR/MDK4需要做一些简单修改。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。

#### 硬件连接

使用数据线连接开发板到 PC,使用USB转TTL模块连接PA2(MCU TX)和PA3(MCU RX),打开电源开关。

#### 编译下载

双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。

> 工程默认配置使用 DAP-Link 仿真器下载程序,在通过 DAP-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板

#### 运行结果

下载程序成功之后,系统会自动运行,LED 闪烁。

连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息:

```bash
\ | /
- RT - Thread Operating System
/ | \ 4.0.4 build Jan 9 2021
2006 - 2021 Copyright by rt-thread team
msh >
```

### 进阶使用

此 BSP 默认只开启了 GPIO 和 串口0的功能,如果需使用高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下:

1. 在 bsp 下打开 env 工具。

2. 输入`menuconfig`命令配置工程,配置好之后保存退出。

3. 输入`pkgs --update`命令更新软件包。

4. 输入`scons --target=mdk5` 命令重新生成工程,或者使用Scons构建

## 注意事项

1. 该BSP使用的外部高速时钟为8MHz,PLL倍频到200MHz,请根据实际情况进行时钟配置。
board/SConscript中,请根据实际情况修改HXTAL_VALUE:
```python
CPPDEFINES = ['GD32F405', 'HXTAL_VALUE=8000000U']
```
board/board.c中,根据实际情况修改`system_clock_8M_200M`实现:
```c
void rt_hw_board_init()
{
/* config system clock HSE 8M to 200M */
system_clock_8M_200M();

```

## 联系人信息

维护人:

- [ShiHongchao](https://gitee.com/shi-hongchao), 邮箱:<hongchao.shi@foxmail.com> 或者 <shi.hc@outlook.com>
Binary file added bsp/gd32/arm/gd32405rg/README_assets/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions bsp/gd32/arm/gd32405rg/RTE/_rt-thread/RTE_Components.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* UVISION generated file: DO NOT EDIT!
* Generated by: uVision version 5.42.0.0
*
* Project: 'template'
* Target: 'rt-thread'
*/

#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H


/*
* Define the Device Header File:
*/
#define CMSIS_device_header "gd32f4xx.h"



#endif /* RTE_COMPONENTS_H */
15 changes: 15 additions & 0 deletions bsp/gd32/arm/gd32405rg/SConscript
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# for module compiling
import os
Import('RTT_ROOT')
from building import *

cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)

for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(d, 'SConscript'))

Return('objs')
77 changes: 77 additions & 0 deletions bsp/gd32/arm/gd32405rg/SConstruct
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import os
import sys
import rtconfig

if os.getenv('RTT_ROOT'):
RTT_ROOT = os.getenv('RTT_ROOT')
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../..')

sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
try:
from building import *
except:
print('Cannot found RT-Thread root directory, please check RTT_ROOT')
print(RTT_ROOT)
exit(-1)

def bsp_pkg_check():
import subprocess

check_paths = [
os.path.join("packages", "gd32-arm-cmsis-latest"),
os.path.join("packages", "gd32-arm-series-latest")
]

need_update = not all(os.path.exists(p) for p in check_paths)

if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...")
print("===============================================================================")
exit(1)

RegisterPreBuildingAction(bsp_pkg_check)

TARGET = 'rtthread.' + rtconfig.TARGET_EXT

DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)

if rtconfig.PLATFORM in ['iccarm']:
env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
env.Replace(ARFLAGS = [''])
env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')

Export('env')
Export('RTT_ROOT')
Export('rtconfig')

SDK_ROOT = os.path.abspath('./')

if os.path.exists(SDK_ROOT + '/libraries'):
libraries_path_prefix = SDK_ROOT + '/libraries'
else:
libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'

SDK_LIB = libraries_path_prefix
Export('SDK_LIB')

# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)

# include drivers with specific build directory
drivers_objs = SConscript(os.path.join(libraries_path_prefix, 'gd32_drivers', 'SConscript'),
variant_dir='build/libraries/gd32_drivers',
duplicate=0)
objs.extend(drivers_objs)

# make a building
DoBuilding(TARGET, objs)
15 changes: 15 additions & 0 deletions bsp/gd32/arm/gd32405rg/applications/SConscript
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from building import *
import os

cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd]

group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)

list = os.listdir(cwd)
for item in list:
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
group = group + SConscript(os.path.join(item, 'SConscript'))

Return('group')
137 changes: 137 additions & 0 deletions bsp/gd32/arm/gd32405rg/applications/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-08-20 BruceOu first implementation
*/

#include <stdio.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

/* defined the LED2 pin: PB5 */
#define LED2_PIN GET_PIN(B, 5)

int main(void)
{
int count = 1;

/* set LED2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);

while (count++)
{
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_thread_mdelay(500);
}

return RT_EOK;
}

#ifdef BSP_USING_HWTIMER
/* hwtimer callback function */
static rt_err_t hwtimer_test_cb(rt_device_t dev, rt_size_t size)
{
rt_kprintf("this is hwtimer timeout callback fucntion!\n");
rt_kprintf("tick is :%d !\n", rt_tick_get());

return 0;
}

#define HWTIMER_DEV_NAME "timer13"

/* hwtimer test */
static void hwtimer_test(void)
{
rt_err_t ret = RT_EOK;
rt_hwtimerval_t timeout_s; /* 定时器超时值 */
rt_device_t hw_dev = RT_NULL; /* 定时器设备句柄 */
rt_hwtimer_mode_t mode; /* 定时器模式 */
rt_uint32_t freq = 10000; /* 计数频率 */

/* 查找定时器设备 */
hw_dev = rt_device_find(HWTIMER_DEV_NAME);
if (hw_dev == RT_NULL)
{
rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME);
return;
}

/* 以读写方式打开设备 */
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME);
return;
}

/* 设置超时回调函数 */
rt_device_set_rx_indicate(hw_dev, hwtimer_test_cb);

/* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */
rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
/* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/
mode = HWTIMER_MODE_PERIOD;
ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
if (ret != RT_EOK)
{
rt_kprintf("set mode failed! ret is :%d\n", ret);
return;
}

/* 设置定时器超时值为5s并启动定时器 */
timeout_s.sec = 5; /* 秒 */
timeout_s.usec = 0; /* 微秒 */
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
rt_kprintf("set timeout value failed\n");
return;
}
}
MSH_CMD_EXPORT(hwtimer_test, hwtimer test);
#endif //BSP_USING_HWTIMER

#ifdef BSP_USING_PWM

/* pwm test */
static void pwm_test(void)
{
rt_err_t ret = RT_EOK;
struct rt_device_pwm *pwm2 = RT_NULL, *pwm8 = RT_NULL, *pwm1 = RT_NULL, *pwm4 = RT_NULL;
rt_uint32_t period = 1000; /* 周期 */
rt_uint32_t pulse = 500; /* 占空比 */

/* 查找PWM设备 */
pwm2 = (struct rt_device_pwm *)rt_device_find("pwm2");
if (pwm2 == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!\n", "pwm2");
return;
}
rt_pwm_set(pwm2, 3, period, pulse);
rt_pwm_enable(pwm2, 3);
rt_pwm_set(pwm2, 4, period, pulse);
rt_pwm_enable(pwm2, 4);

pwm8 = (struct rt_device_pwm *)rt_device_find("pwm8");
rt_pwm_set(pwm8, 2, period, pulse);
rt_pwm_enable(pwm8, 2);

pwm1 = (struct rt_device_pwm *)rt_device_find("pwm1");
rt_pwm_set(pwm1, 3, period, pulse);
rt_pwm_enable(pwm1, 3);

pwm4 = (struct rt_device_pwm *)rt_device_find("pwm4");
rt_pwm_set(pwm4, 1, period, pulse);
rt_pwm_enable(pwm4, 1);
rt_pwm_set(pwm4, 2, period, pulse);
rt_pwm_enable(pwm4, 2);
}
MSH_CMD_EXPORT(pwm_test, pwm test);
#endif // BSP_USING_PWM
Loading
Loading