[bsp][essemi] Adapt es32f369x for RTduino (#6144)

* [bsp][essemi] Adapt es32f369x for RTduino
This commit is contained in:
shiwa 2022-07-08 13:53:36 +08:00 committed by GitHub
parent c850054aee
commit 7b004d9fd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 917 additions and 86 deletions

View File

@ -2,10 +2,18 @@ Import('RTT_ROOT')
Import('rtconfig')
from building import *
cwd = os.path.join(str(Dir('#')), 'applications')
src = Glob('*.c')
src = Glob('*.c')
CPPPATH = [cwd, str(Dir('#'))]
if GetDepend(['PKG_USING_RTDUINO']) and not GetDepend(['RTDUINO_NO_SETUP_LOOP']):
src += ['arduino_main.cpp']
cwd = GetCurrentDir()
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')

View File

@ -0,0 +1,24 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-12-10 Meco Man first version
* 2022-07-07 shiwa Adapt ES32F369x
*/
#include <Arduino.h>
void setup(void)
{
/* put your setup code here, to run once: */
pinMode(LED_BUILTIN, OUTPUT);
}
void loop(void)
{
/* put your main code here, to run repeatedly: */
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(250);
}

View File

@ -0,0 +1,167 @@
# ES32F3696的Arduino生态兼容说明
## 1 RTduino - RT-Thread的Arduino生态兼容层
ES32F3696已经适配了RTduino可正常使用全部功能包含GPIO/PWM及I2C/SPI通信接口。除标准arduino uno的接口外该开发板还额外添加了4个led和一个方向键对应的GPIO方便使用。
### 1.1 使用Keil+Env
1. Env 工具下敲入 menuconfig 命令,或者 RT-Thread Studio IDE 下选择 RT-Thread Settings
```Kconfig
Hardware Drivers Config --->
Onboard Peripheral Drivers --->
[*] Support Arduino
```
2. 进入RTduino配置打开需要使用的各项配置 (SPI,I2C,Adafrui等)
```Kconfig
RT-Thread online packages --->
system packages --->
RTduino: Arduino Ecological Compatibility Layer
```
3. 使用 pkgs --update下载RTduino包
4. 使用scons --target=mdk5生成代码
### 1.2 使用RT-Thread Studio
1. 选择 文件 -> 导入 -> BSP导入
![image-20220630160208893](picture/image-20220630160208893.png)
2. 选择es32f369x的bsp路径并填写工程名称、芯片名(es32f3696lx)
![image-20220630160331334](picture/image-20220630160331334.png)
3. 打开RT-Thread Settings选择硬件开启RTduino支持
![image-20220706134522478](picture/image-20220706134522478.png)
保存后稍等片刻等待Studio下载库并完成配置
* 可能遇到的问题与解决方案
1. Unknown flag "-T"
项目->属性->C/C++构建->GNU ARM Cross C++ Linker -> General在右侧添加lds连接脚本`"${workspace_loc:/${ProjName}/drivers/linker_scripts/link.lds}"`(需要先删除原有的再添加)
![image-20220701145240404](picture/image-20220701145240404.png)
2. 启动时直接进入Fault
选择 项目->属性->C/C++构建->GNU ARM Cross C++ Complier-> Miscellaneous 在Other compiler flags 中添加` -mcpu=cortex-m3 -mthumb`
![image-20220701145153781](picture/image-20220701145153781.png)
## 2 Arduino引脚排布
该BSP遵照Arduino UNO板的引脚排列方式 ,并额外扩展了一些LED和按键
| Arduino引脚编号 | ES32引脚编号 | 备注 |
| --------------- | ------------ | ---------------- |
| D0 | PE3 | UART2 RX |
| D1 | PE2 | UART2 TX |
| D2 | PE4 | 普通IO |
| D3 | PA2 | PWM2 通道3 |
| D4 | PE5 | 普通IO |
| D5 | PA1 | PWM2 通道2 |
| D6 | PA0 | PWM2 通道1 |
| D7 | PE6 | 普通IO |
| D8 | PB8 | 普通IO |
| D9 | PB9 | 普通IO |
| D10 | PB0 | 普通IO |
| D11 | PB5 | SPI1_MOSI/普通IO |
| D12 | PB4 | SPI1_MISO/普通IO |
| D13 | PD3 | SPI1_SCK/普通IO |
| D14 | PB7 | I2C0_SDA |
| D15 | PB6 | I2C0_SCL |
| D16 | PC8 | LED4 |
| D17 | PC12 | LED5 |
| D18 | PC7 | LED6 |
| D19 | PC6 | LED7 |
| D20 | PF1 | KEY_UP |
| D21 | PF4 | KEY_DOWN |
| D22 | PF6 | KEY_LEFT |
| D23 | PF0 | KEY_RIGHT |
| D24 | PF7 | KEY_CENTER |
| A0 | PC0 | ADC |
| A1 | PC1 | ADC |
| A2 | PC2 | ADC |
| A3 | PC3 | ADC |
| A4 | PA4 | ADC |
| A5 | PA5 | ADC |
## 3 I2C总线
ES32-Arduino支持的I2C总线是i2c0。
I2C的引脚都是被RT-Thread I2C设备框架接管的不需要直接操控这两个引脚直接引用`#include <Wire.h>`Arduino官方I2C头文件即可使用。或者使用`Adafruit_I2CDevice.h`控制
## 4 SPI总线
ES32-Arduino的SPI总线是spi0总线 `SCK`、`MISO`、`MOSI`引脚是被RT-Thread SPI设备框架接管的不需要直接操控这3个引脚直接引用`#include <SPI.h>`Arduino官方SPI头文件即可使用。按照Arduino的编程标准用户需要自行控制片选信号。或者使用`Adafruit_SPIDevice.h`控制
## 5 测试说明
在applications/arduino_pinout/examples/arduino_examples.cpp文件中已经根据功能预设了一系列函数用于测试arduino各个功能,可根据测试需要取消注释对应的宏定义即可启用对应的测试。如果需要测试请将arduino_examples.cpp文件的内容覆盖到applications/arduino_main.cpp文件中
1. RTduino各功能测试
目前支持的测试如下:
| 宏定义 | 名称 | 描述 |
| ---------------------- | ------------------ | ------------------------------------------------------------ |
| ARDU_TEST_GPIO | 数字GPIO测试 | 测试数字管脚的输出功能,包括两个管脚输出高/低电平一个管脚输出一个0.5s周期的方波 |
| ARDU_TEST_PWM | 模拟PWM输出测试 | PWM功能输出测试分别在三个PWM管脚输出不同的三种占空比的方波 |
| ARDU_TEST_ADAFRUIT_I2C | AdafruitI2C测试 | 使用AdafruitI2C库发送数据测试正常可以收到不断发送的"ABtestabtest" |
| ARDU_TEST_ADAFRUIT_SPI | AdafruitSPI测试 | 使用AdafruitSPI库发送数据测试正常可收到不断的"test" |
| ARDU_TEST_I2C | I2C测试 | 通过I2C接口发送数据测试正常可收到不断的"test" |
| ARDU_TEST_SPI | SPI测试 | 通过SPI接口发送和接收数据测试正常可收到不断的"test" |
| ARDU_TEST_INT | 中断测试 | 测试外部中断,按下方向键的中键会打印相关信息 |
| ARDU_TEST_DIGITAL_READ | 数字读测试 | 不断读取各个方向键的状态,并在按下时输出信息 |
| ARDU_TEST_ADC_READ | ADC测试 | 循环读取各个ADC的数据并通过串口打印 |
| ARDU_TEST_BMI160_PKG | 第三方BMI160包测试 | 测试导入的BMI160库是否正常程序会不断读取传感器数据并通过串口打印 |
2. 第三方arduino库导入测试
用法:下载完毕后解压放到 packages\RTduino-latest\libraries\user目录下即可
需要修改一处这个库有一处函数重载歧义856行需改为Wire.requestFrom(dev->id,(uint8_t)len);
选择BMI160的库DFRobot_BMI160用于测试用keil编译时存在以下问题
1. 缺少INT8_C和UINT8_C宏定义手动添加
```c
#ifndef INT8_C
#define INT8_C(x) ((int8_t)x)
#endif
#ifndef UINT8_C
#define UINT8_C(x) ((uint8_t)x)
#endif
```
2. keil的AC5不支持类变量直接初始化目前版本的AC6编译器会报错需要修改工程文件删掉所有的 --cpp11 --c11 --gnu
解决以上问题后,能成功调用传感器获取加速度和重力等信息
如果用RT-Thread Studio编译则不存在这些问题只需修改存在歧义的问题即可直接使用
## 6 其他说明
### 1.ADC
目前ES32的ADC返回的是原始值需要计算转换为实际的电压值暂时不支持分辨率调节会出现警告信息。
### 2.对非数字IO的管脚不要调用pinMode
非数字IO的管脚在其他地方已经初始化了再次调用pinMode会使他变为普通管脚且无法再重新初始化为非数字IO的功能。即对于任意管脚可以调用pinMode使它变为数字IO管脚但这一过程不可逆原有的预设功能将会失效
### 3.SPI/I2C/UART使用
默认只开启了spi0、i2c0及uart2(默认控制台串口),如果需要使用其他的spi/i2c/uart可以在配置中启用并在初始化时指定名称即可。如果想要调整管脚信息可以使用ESCodeMaker辅助但要注意打开对应的外设。
SPI必须先调用begin才能使用其他函数
### 4.RTduino编译报错 "posix/xxx.h cannot find"
如果编译报错为 "posix/xxx.h cannot find"请更新rt-thread到最新版本从github仓库拉取最新的源码

View File

@ -0,0 +1,9 @@
from building import *
cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp')
inc = [cwd]
group = DefineGroup('Arduino', src, depend = ['PKG_USING_RTDUINO'], CPPPATH = inc)
Return('group')

View File

@ -0,0 +1,183 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-12-10 Meco Man first version
*/
#include <Arduino.h>
#include <rtthread.h>
#include <SPI.h>
#include <Wire.h>
#define ARDU_TEST_GPIO
#define ARDU_TEST_PWM
//#define ARDU_TEST_ADAFRUIT_I2C
//#define ARDU_TEST_ADAFRUIT_SPI
//#define ARDU_TEST_SPI
//#define ARDU_TEST_I2C
#define ARDU_TEST_INT
#define ARDU_TEST_DIGITAL_READ
//#define ARDU_TEST_ADC_READ
//#define ARDU_TEST_BMI160_PKG
#if defined(ARDU_TEST_ADAFRUIT_I2C) || defined(ARDU_TEST_ADAFRUIT_SPI)
#include <Adafruit_BusIO_Register.h>
#endif
#ifdef ARDU_TEST_ADAFRUIT_I2C
#include <Adafruit_I2CDevice.h>
Adafruit_I2CDevice i2c_dev(0x2D);
Adafruit_BusIO_Register i2c_reg(&i2c_dev, 0x6261, 2, 0, 2);
#endif
#ifdef ARDU_TEST_ADAFRUIT_SPI
#include "Adafruit_SPIDevice.h"
Adafruit_SPIDevice spi_dev(D10, 100000);
#endif
#ifdef ARDU_TEST_BMI160_PKG
#include "DFRobot_BMI160.h"
DFRobot_BMI160 *bmi160;
#endif
static char buf[16] = {"test"};
static char buf2[16] = {"AB"};
void test_int()
{
Serial.println("Interrupt Triggered\r\n");
}
void setup(void)
{
/* put your setup code here, to run once: */
//串口
Serial.write("Hello from Arduino\r\n");
#ifdef ARDU_TEST_GPIO //数字管脚输出
pinMode(D2, OUTPUT);
pinMode(D4, OUTPUT);
digitalWrite(D4, 1);
pinMode(D7, OUTPUT);
digitalWrite(D7, 0);
pinMode(D18, OUTPUT); //LED6
#endif
pinMode(D21, INPUT);
#ifdef ARDU_TEST_PWM //测试PWM输出
analogWriteFrequency(10);
analogWrite(D3, 80);
analogWrite(D5, 127);
analogWrite(D6, 200);
#endif
#ifdef ARDU_TEST_ADAFRUIT_I2C //ADAFRUIT I2C
i2c_dev.begin();
#endif
#ifdef ARDU_TEST_ADAFRUIT_SPI //ADAFRUIT SPI
spi_dev.begin();
#endif
#ifdef ARDU_TEST_I2C //I2C
Wire.begin();
#endif
#ifdef ARDU_TEST_SPI //SPI
SPI.begin();
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE1));
pinMode(D10, OUTPUT);
digitalWrite(D10, HIGH);
#endif
#ifdef ARDU_TEST_INT //中断输入
attachInterrupt(digitalPinToInterrupt(D24), test_int, FALLING);
#endif
#ifdef ARDU_TEST_DIGITAL_READ //数字管脚输入
pinMode(D20,INPUT);
pinMode(D21,INPUT);
pinMode(D22,INPUT);
pinMode(D23,INPUT);
#endif
#ifdef ARDU_TEST_BMI160_PKG
bmi160=new DFRobot_BMI160();
int result= bmi160->I2cInit();
if (result)
{
rt_kprintf("BMI160 Init failed.%d\r\n",result);
}
bmi160->setStepPowerMode(bmi160->stepNormalPowerMode);
#endif
}
void loop(void)
{
/* put your main code here, to run repeatedly: */
static int count = 0;
count++;
#ifdef ARDU_TEST_GPIO
digitalWrite(D2, 1);
digitalWrite(D18, 0);
#endif
delay(250);
#ifdef ARDU_TEST_GPIO
digitalWrite(D2, 0);
digitalWrite(D18, 1);
#endif
delay(250);
#ifdef ARDU_TEST_ADC_READ
int val = analogRead(A0 + count % 6);
rt_kprintf("A%d=%d\r\n", count % 6, val);
#endif
#ifdef ARDU_TEST_ADAFRUIT_I2C
i2c_dev.write((uint8_t *)buf, strlen(buf), true, (uint8_t *)buf2, 2);
i2c_reg.write((uint8_t *)buf, 4);
#endif
#ifdef ARDU_TEST_ADAFRUIT_SPI
spi_dev.beginTransactionWithAssertingCS();
spi_dev.transfer((uint8_t *)buf, strlen(buf));
spi_dev.endTransactionWithDeassertingCS();
#endif
#ifdef ARDU_TEST_I2C
Wire.beginTransmission(0x2D);
Wire.write((uint8_t *)buf, strlen(buf));
Wire.endTransmission();
#endif
#ifdef ARDU_TEST_SPI
digitalWrite(D10, LOW);
SPI.transfer((uint8_t *)buf, 4);
digitalWrite(D10, HIGH);
buf[4] = 0;
Serial.print(buf);
#endif
#ifdef ARDU_TEST_DIGITAL_READ
if (digitalRead(D20) == LOW) {
Serial.println("UP");
}
if (digitalRead(D21) == LOW) {
Serial.println("DOWN");
}
if (digitalRead(D22) == LOW) {
Serial.println("LEFT");
}
if (digitalRead(D23) == LOW) {
Serial.println("RIGHT");
}
#endif
#ifdef ARDU_TEST_BMI160_PKG
int16_t data[16]={0,0,0};
int result=bmi160->getAccelData(data);
rt_kprintf("Accel[R=%d]:%d,%d,%d\r\n",result,data[0],data[1],data[2]);
result=bmi160->getAccelGyroData(data);
rt_kprintf("Gyro [R=%d]:%d,%d,%d\r\n",result,data[0],data[1],data[2]);
#endif
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-12-10 Meco Man first version
* 2022-07-07 shiwa Adapt ES32F369x
*/
#include <Arduino.h>
#include <board.h>
#include "drv_gpio.h"
#include "pins_arduino.h"
/*
{Arduino Pin, RT-Thread Pin [, Device Name(PWM or ADC), Channel]}
[] means optional
Digital pins must NOT give the device name and channel.
Analog pins MUST give the device name and channel(ADC, PWM or DAC).
Arduino Pin must keep in sequence.
*/
const pin_map_t pin_map_table[]=
{
{D0/*, GET_PIN(E,3)*/}, /* UART2_RX */
{D1/*, GET_PIN(E,2)*/}, /* UART2_TX */
{D2, GET_PIN(E,4)}, /* GPIO0 */
{D3, GET_PIN(A,2),"pwm2",3}, /* PWM2 GP32C4T0 CH3 */
{D4, GET_PIN(E,5)}, /* GPIO1 */
{D5, GET_PIN(A,1),"pwm2",2}, /* PWM2 GP32C4T0 CH2 */
{D6, GET_PIN(A,0),"pwm2",1}, /* PWM2 GP32C4T0 CH1 */
{D7, GET_PIN(E,6)}, /* GPIO2 */
{D8, GET_PIN(B,8)}, /* GPIO3 */
{D9, GET_PIN(B,9)}, /* GPIO4 */
{D10, GET_PIN(B,0)}, /* GPIO5 */
{D11/*, GET_PIN(B,5)*/}, /* SPI0_MOSI */
{D12/*, GET_PIN(B,4)*/}, /* SPI0_MISO */
{D13/*, GET_PIN(D,3)*/}, /* SPI0_SCK */
{D14/*, GET_PIN(B,7)*/}, /* I2C0_SDA */
{D15/*, GET_PIN(B,6)*/}, /* I2C0_SCL */
{D16, GET_PIN(C,8)}, /* LED4 */
{D17, GET_PIN(C,12)}, /* LED5 */
{D18, GET_PIN(C,7)}, /* LED6 */
{D19, GET_PIN(C,6)}, /* LED7 */
{D20, GET_PIN(F,1)}, /* KEY_UP */
{D21, GET_PIN(F,4)}, /* KEY_DOWN */
{D22, GET_PIN(F,6)}, /* KEY_LEFT */
{D23, GET_PIN(F,0)}, /* KEY_RIGHT */
{D24, GET_PIN(F,7)}, /* KEY_CENTER */
{A0, GET_PIN(C,0),"adc0",0}, /* ADC0 */
{A1, GET_PIN(C,1),"adc0",1}, /* ADC0 */
{A2, GET_PIN(C,2),"adc0",2}, /* ADC0 */
{A3, GET_PIN(C,3),"adc0",3}, /* ADC0 */
{A4, GET_PIN(A,4),"adc0",4}, /* ADC0 */
{A5, GET_PIN(A,5),"adc0",5}, /* ADC0 */
};

View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-12-10 Meco Man first version
* 2022-07-07 shiwa Adapt ES32F369x
*/
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
/* pins alias. Must keep in sequence */
#define D0 (0)
#define D1 (1)
#define D2 (2)
#define D3 (3)
#define D4 (4)
#define D5 (5)
#define D6 (6)
#define D7 (7)
#define D8 (8)
#define D9 (9)
#define D10 (10)
#define D11 (11)
#define D12 (12)
#define D13 (13)
#define D14 (14)
#define D15 (15)
#define D16 (16)
#define D17 (17)
#define D18 (18)
#define D19 (19)
#define D20 (20)
#define D21 (21)
#define D22 (22)
#define D23 (23)
#define D24 (24)
#define A0 (25)
#define A1 (26)
#define A2 (27)
#define A3 (28)
#define A4 (29)
#define A5 (30)
#define F_CPU 96000000L /* CPU: 96MHz */
#define RTDUINO_DEFAULT_IIC_BUS_NAME "i2c0"
#define RTDUINO_DEFAULT_SPI_BUS_NAME "spi0"
#define LED_BUILTIN D16
#endif /* Pins_Arduino_h */

View File

@ -1,23 +1,5 @@
/*
* Change Logs:
* Date Author Notes
* 2021-04-20 liuhy the first version
*
* Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the License); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd.
*
*/
@ -39,39 +21,40 @@ struct pin_index
};
#define ES_GPIO_ADC_CH0_GPIO GPIOC
#define ES_GPIO_ADC_CH1_GPIO GPIOC
#define ES_GPIO_ADC_CH2_GPIO GPIOC
#define ES_GPIO_ADC_CH3_GPIO GPIOC
#define ES_GPIO_ADC_CH4_GPIO GPIOA
#define ES_GPIO_ADC_CH5_GPIO GPIOA
#define ES_GPIO_ADC_CH6_GPIO GPIOA
#define ES_GPIO_ADC_CH7_GPIO GPIOA
#define ES_GPIO_ADC_CH8_GPIO GPIOA
#define ES_GPIO_ADC_CH9_GPIO GPIOA
#define ES_GPIO_ADC_CH10_GPIO GPIOA
#define ES_GPIO_ADC_CH11_GPIO GPIOA
#define ES_GPIO_ADC_CH12_GPIO GPIOC
#define ES_GPIO_ADC_CH13_GPIO GPIOC
#define ES_GPIO_ADC_CH14_GPIO GPIOB
#define ES_GPIO_ADC_CH15_GPIO GPIOB
#define ES_GPIO_ADC_CH0_GPIO GPIOC
#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH1_GPIO GPIOC
#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1
#define ES_GPIO_ADC_CH2_GPIO GPIOC
#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2
#define ES_GPIO_ADC_CH3_GPIO GPIOC
#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3
#define ES_GPIO_ADC_CH4_GPIO GPIOA
#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH5_GPIO GPIOA
#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1
#define ES_GPIO_ADC_CH6_GPIO GPIOA
#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2
#define ES_GPIO_ADC_CH7_GPIO GPIOA
#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3
#define ES_GPIO_ADC_CH8_GPIO GPIOA
#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4
#define ES_GPIO_ADC_CH9_GPIO GPIOA
#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5
#define ES_GPIO_ADC_CH10_GPIO GPIOA
#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6
#define ES_GPIO_ADC_CH11_GPIO GPIOA
#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7
#define ES_GPIO_ADC_CH12_GPIO GPIOC
#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4
#define ES_GPIO_ADC_CH13_GPIO GPIOC
#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5
#define ES_GPIO_ADC_CH14_GPIO GPIOB
#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH15_GPIO GPIOB
#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1
#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1
#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2
#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3
#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1
#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2
#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3
#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4
#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5
#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6
#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7
#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4
#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5
#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0
#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1
static const struct pin_index pins[] =
{
@ -264,10 +247,6 @@ static const struct pin_index pins[] =
#define ES_PIN_GPIO_B_9 96
#define ES_PIN_GPIO_E_0 97
#define ES_PIN_GPIO_E_1 98
/* UART_TX */
#ifndef ES_UART0_TX_GPIO_FUNC
#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3
#endif
@ -683,24 +662,24 @@ static const struct pin_index pins[] =
#endif
#ifndef ES_UART2_RX_PIN
#ifdef ES_PIN_GPIO_E_3
#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3
#ifdef ES_PIN_GPIO_B_4
#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4
#endif
#endif
#ifndef ES_UART2_RX_GPIO_FUNC
#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5
#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_3
#endif
#ifndef ES_UART2_RX_GPIO_PORT
#define ES_UART2_RX_GPIO_PORT GPIOB
#define ES_UART2_RX_GPIO_PORT GPIOE
#endif
#ifndef ES_UART2_RX_GPIO_PIN
#define ES_UART2_RX_GPIO_PIN GPIO_PIN_4
#define ES_UART2_RX_GPIO_PIN GPIO_PIN_3
#endif
#ifndef ES_UART2_RX_PIN
#ifdef ES_PIN_GPIO_B_4
#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4
#ifdef ES_PIN_GPIO_E_3
#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3
#endif
#endif
@ -1758,22 +1737,6 @@ static const struct pin_index pins[] =
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
#endif
#ifndef ES_SPI0_SCK_PIN
#ifdef ES_PIN_GPIO_D_3
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3
#endif
#endif
#ifndef ES_SPI0_SCK_GPIO_FUNC
#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4
#endif
#ifndef ES_SPI0_SCK_GPIO_PORT
#define ES_SPI0_SCK_GPIO_PORT GPIOB
#endif
#ifndef ES_SPI0_SCK_GPIO_PIN
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
#endif
#ifndef ES_SPI0_SCK_PIN
#ifdef ES_PIN_GPIO_B_3
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_B_3
@ -1796,6 +1759,22 @@ static const struct pin_index pins[] =
#endif
#endif
#ifndef ES_SPI0_SCK_GPIO_FUNC
#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4
#endif
#ifndef ES_SPI0_SCK_GPIO_PORT
#define ES_SPI0_SCK_GPIO_PORT GPIOD
#endif
#ifndef ES_SPI0_SCK_GPIO_PIN
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
#endif
#ifndef ES_SPI0_SCK_PIN
#ifdef ES_PIN_GPIO_D_3
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3
#endif
#endif
#ifndef ES_SPI1_SCK_GPIO_FUNC
#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4
#endif
@ -2971,7 +2950,8 @@ static const struct pin_index pins[] =
/* GP16C2T_CH2N */
#define ES_RTT_APP_LED_PIN ES_PIN_GPIO_C_6
#endif

View File

@ -7,12 +7,25 @@ menu "Hardware Drivers Config"
bool "Enable GPIO"
select RT_USING_PIN
default y
source "drivers/ES/Kconfig"
endmenu
menu "Onboard Peripheral Drivers"
config BSP_USING_ARDUINO
bool "Support Arduino"
select PKG_USING_RTDUINO
select BSP_USING_GPIO
select BSP_USING_UART2
select BSP_USING_SPI0
select BSP_USING_I2C0
select BSP_USING_ADC0
select BSP_USING_GP32C4T0_PWM
imply RTDUINO_USING_SERVO
imply RTDUINO_USING_WIRE
imply RTDUINO_USING_SPI
imply RTDUINO_USING_ADAFRUIT
default n
config BSP_USING_SPI_FLASH
bool "Enable SPI FLASH (W25Q64 spi0)"

View File

@ -27,7 +27,7 @@
#include <es32f36xx.h>
#include "es_conf_info_cmu.h"
#include "es_conf_info_gpio.h"
#define ES32F3_SRAM_SIZE 0x18000
#define ES32F3_SRAM_END (0x20000000 + ES32F3_SRAM_SIZE)

View File

@ -107,6 +107,162 @@ static void _i2c_init(void)
#endif
}
#define _I2C_NO_START 0x1
#define _I2C_NO_STOP 0x2
int _i2c_master_req(i2c_handle_t *hperh, uint16_t dev_addr, uint32_t timeout,uint32_t req_write)
{
if (hperh->init.addr_mode == I2C_ADDR_7BIT) {
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_ADD10_MSK);
}
else {
SET_BIT(hperh->perh->CON2, I2C_CON2_ADD10_MSK);
}
MODIFY_REG(hperh->perh->CON2, I2C_CON2_SADD_MSK, dev_addr << I2C_CON2_SADD_POSS);
if (req_write)
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RD_WRN_MSK);
else
SET_BIT(hperh->perh->CON2, I2C_CON2_RD_WRN_MSK);
return OK;
}
int _i2c_wait_flag(i2c_handle_t *hperh, uint32_t flag, flag_status_t status, uint32_t timeout)
{
uint32_t tickstart = 0;
tickstart = ald_get_tick();
while (I2C_GET_FLAG(hperh, flag) == status) {
if ((timeout == 0) || ((ald_get_tick() - tickstart ) > timeout)) {
hperh->error_code |= I2C_ERROR_TIMEOUT;
return TIMEOUT;
}
}
return OK;
}
int _i2c_wait_txe(i2c_handle_t *hperh, uint32_t timeout)
{
uint32_t tickstart = ald_get_tick();
while (I2C_GET_FLAG(hperh, I2C_STAT_THTH) == RESET) {
if (I2C_GET_IT_FLAG(hperh, I2C_IT_ARLO)) {
hperh->error_code |= I2C_ERROR_ARLO;
return ERROR;
}
if (I2C_GET_IT_FLAG(hperh, I2C_IT_NACK) == SET) {
hperh->error_code |= I2C_ERROR_AF;
return ERROR;
}
if ((timeout == 0) || ((ald_get_tick() - tickstart) > timeout)) {
hperh->error_code |= I2C_ERROR_TIMEOUT;
return ERROR;
}
}
return OK;
}
int _i2c_master_send(i2c_handle_t *hperh, uint16_t dev_addr, uint8_t *buf,
uint32_t size, uint32_t timeout,uint32_t flag)
{
if (hperh->state != I2C_STATE_READY)
return BUSY;
if ((buf == NULL) || (size == 0))
return ERROR;
if ((flag&_I2C_NO_START)==0x0) //NOSTART==0
{
if (_i2c_wait_flag(hperh, I2C_STAT_BUSY, SET, 100) != OK)
return BUSY;
_i2c_master_req(hperh, dev_addr, timeout,1);
}
assert_param(IS_I2C_TYPE(hperh->perh));
__LOCK(hperh);
hperh->state = I2C_STATE_BUSY_TX;
hperh->mode = I2C_MODE_MASTER;
hperh->error_code = I2C_ERROR_NONE;
hperh->p_buff = buf;
hperh->xfer_size = size;
hperh->xfer_count = 0;
if ((flag&_I2C_NO_STOP)!=0) //NOSTOP==1
SET_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
else
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
if (size <= 0xFF) {
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, size << I2C_CON2_NBYTES_POSS);
}
else {
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, 0xFF << I2C_CON2_NBYTES_POSS);
SET_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
}
SET_BIT(hperh->perh->FCON, I2C_FCON_TXFRST_MSK);
if ((flag&_I2C_NO_START)==0x0) //NOSTART=0
SET_BIT(hperh->perh->CON2, I2C_CON2_START_MSK);
while (size > 0) {
hperh->perh->TXDATA = (*buf++);
size--;
hperh->xfer_count++;
if (_i2c_wait_txe(hperh, timeout) != OK)
goto ERROR;
if (((hperh->xfer_count % 0xFF) == 0) && (READ_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK))) {
if (_i2c_wait_flag(hperh, I2C_STAT_TCR, RESET, 10) == OK) {
if (size > 0xFF) {
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, 0xFF << I2C_CON2_NBYTES_POSS);
}
else {
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, size << I2C_CON2_NBYTES_POSS);
if ((flag&_I2C_NO_STOP)==0)
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
}
}
else {
goto ERROR;
}
}
}
if (READ_BIT(hperh->perh->CON2, I2C_CON2_AUTOEND_MSK) == SET)
goto SUCCESS;
//NOSTOP==1
if ((flag&_I2C_NO_STOP)!=0&&_i2c_wait_flag(hperh, I2C_STAT_TCR, RESET, 10) == OK)
{
goto SUCCESS;
}
if (_i2c_wait_flag(hperh, I2C_STAT_TC, RESET, 10) == OK) {
if ((flag&_I2C_NO_STOP)==0x0) //NOSTOP==0
SET_BIT(hperh->perh->CON2, I2C_CON2_STOP_MSK);
goto SUCCESS;
}
else {
goto ERROR;
}
ERROR:
SET_BIT(hperh->perh->CON2, I2C_CON2_STOP_MSK);
hperh->state = I2C_STATE_READY;
hperh->mode = I2C_MODE_NONE;
__UNLOCK(hperh);
return ERROR;
SUCCESS:
hperh->state = I2C_STATE_READY;
hperh->mode = I2C_MODE_NONE;
__UNLOCK(hperh);
return OK;
}
static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
struct rt_i2c_msg msgs[],
@ -129,7 +285,9 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
}
else
{
if (ald_i2c_master_send(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT) != 0)
uint32_t f=((msg->flags&RT_I2C_NO_START)?0x1:0)|((msg->flags&RT_I2C_NO_STOP)?0x2:0);
if (_i2c_master_send(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT,f) != 0)
{
LOG_E("i2c bus write failed,i2c bus stop!\n");
goto out;
@ -140,7 +298,7 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
ret = i;
out:
LOG_E("send stop condition\n");
//LOG_E("send stop condition\n");
return ret;
}

View File

@ -0,0 +1,170 @@
/*
* linker script for ES32F3696LT with GNU ld es32f36xx only change first 9 line
*/
/* Program Entry, set to mark it as "used" and avoid gc */
MEMORY
{
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k /* 256K flash */
RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 32K sram */
}
ENTRY(Reset_Handler)
_system_stack_size = 0x400;
SECTIONS
{
.text :
{
. = ALIGN(4);
_stext = .;
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
*(.text) /* remaining code */
*(.text.*) /* remaining code */
*(.rodata) /* read-only data (constants) */
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.gnu.linkonce.t*)
/* section information for finsh shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
/* section information for utest */
. = ALIGN(4);
__rt_utest_tc_tab_start = .;
KEEP(*(UtestTcTab))
__rt_utest_tc_tab_end = .;
/* section information for at server */
. = ALIGN(4);
__rtatcmdtab_start = .;
KEEP(*(RtAtCmdTab))
__rtatcmdtab_end = .;
. = ALIGN(4);
/* section information for initial. */
. = ALIGN(4);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
. = ALIGN(4);
PROVIDE(__ctors_start__ = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE(__ctors_end__ = .);
. = ALIGN(4);
_etext = .;
} > ROM = 0
/* .ARM.exidx is sorted, so has to go in its own output section. */
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
/* This is used by the startup in order to initialize the .data secion */
_sidata = .;
} > ROM
__exidx_end = .;
/* .data section which is used for initialized data */
.data : AT (_sidata)
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_sdata = . ;
*(.data)
*(.data.*)
*(.gnu.linkonce.d*)
PROVIDE(__dtors_start__ = .);
KEEP(*(SORT(.dtors.*)))
KEEP(*(.dtors))
PROVIDE(__dtors_end__ = .);
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
} >RAM
.stack :
{
. = ALIGN(4);
_sstack = .;
. = . + _system_stack_size;
. = ALIGN(4);
_estack = .;
} >RAM
__bss_start = .;
.bss :
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_ebss = . ;
*(.bss.init)
} > RAM
__bss_end = .;
_end = .;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
* Symbols in the DWARF debugging sections are relative to the beginning
* of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}