Merge branch 'lcd'
After Width: | Height: | Size: 56 KiB |
486
Day5/README.md
|
@ -1,4 +1,486 @@
|
|||
# 软件包和组件
|
||||
## 软件包(Software Package)
|
||||
帮助我们完成了底层驱动的编写,我们只需要使用里面提供的API就好了,帮助我们快速开发。
|
||||
RT-Thread 软件包中心:[软件包](https://packages.rt-thread.org/index.html)
|
||||
ENV Kconfig配置文件
|
||||
|
||||
## 软件包
|
||||
### 温湿度传感器——AHT10(I2C设备)
|
||||
#### 配置
|
||||
在menuconfig选择,最终在[**Kconfig这里**](board\Kconfig)使能(勾选上宏)
|
||||
1. 使能驱动AHT21(AHT10也适用,且会同时使能软件包)
|
||||
![驱动使能](image-4.png)
|
||||
2. 记得 `pkg --update`
|
||||
3. 补充rt_vsnprintf_full软件包,使kprintf可以用`%.3f`(可以按`/`搜索)
|
||||
![rt_vsnprintf_full软件包使能](image-5.png)
|
||||
4. 还是要记得 `pkg --update`
|
||||
|
||||
wifi join Dong abcd07691234
|
||||
使用直接驱动的[这个ath10.c](packages\aht10-latest\aht10.c)就行了
|
||||
|
||||
#### AHT10样例代码
|
||||
``` c
|
||||
#include <board.h>
|
||||
#include <rtthread.h>
|
||||
#include <drv_gpio.h>
|
||||
#include "aht10.h"
|
||||
|
||||
// AHT挂载的总线名字
|
||||
#define AHT10_I2C_BUS "i2c3"
|
||||
|
||||
// 创建AHT线程时待用
|
||||
#define THREAD_PRIORITY 25
|
||||
#define THREAD_STACK_SIZE 2048
|
||||
#define THREAD_TIMESLICE 5
|
||||
|
||||
// AHT线程指针
|
||||
rt_thread_t AHT10 = RT_NULL;
|
||||
|
||||
// AHT测试样例
|
||||
void AHT10_Test(void *parameter)
|
||||
{
|
||||
// AHT设备指针
|
||||
aht10_device_t Dev = RT_NULL;
|
||||
|
||||
// Humi:湿度值,Temp:温度值
|
||||
float Humi, Temp;
|
||||
|
||||
// 初始化设备
|
||||
Dev = aht10_init(AHT10_I2C_BUS);
|
||||
if (Dev == RT_NULL)
|
||||
{
|
||||
rt_kprintf("AHT10_init Fail");
|
||||
return;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
// 读取温湿度值
|
||||
Humi = aht10_read_humidity(Dev);
|
||||
Temp = aht10_read_temperature(Dev);
|
||||
|
||||
// 没有下载rt_vsprintf_full软件包的时候
|
||||
rt_kprintf("Humi: %d.%d\n", (int)Humi, (int)(Humi * 10) % 10);
|
||||
rt_kprintf("Temp: %d.%d\n", (int)Temp, (int)(Temp * 10) % 10);
|
||||
|
||||
// 配合rt_vsnprintf_full软件包使用
|
||||
// rt_kprintf("Humi: %f, Temp: %f\n", Humi, Temp);
|
||||
|
||||
rt_thread_mdelay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void AHT10_Creat_Thread(void)
|
||||
{
|
||||
// 创建线程
|
||||
AHT10 = rt_thread_create("AHT10", AHT10_Test, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
|
||||
// 创建成功就启动
|
||||
if (AHT10 != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(AHT10);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("AHT10_Thread Create Fail");
|
||||
}
|
||||
}
|
||||
// 导出Shell命令
|
||||
MSH_CMD_EXPORT(AHT10_Creat_Thread, This Function will creat a AHT10 thread.);
|
||||
```
|
||||
### MQTT协议(搭配阿里云)
|
||||
#### 原理
|
||||
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于**发布-订阅**模式的消息传输**协议**(基于TCP/IP?),适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在**物联网**应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。如果有设备需要获取某个传感器的消息,只需要**订阅这个主题**就好了。
|
||||
#### 运行框架
|
||||
**Client**:客户端,即我们使用的设备。
|
||||
|
||||
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
|
||||
|
||||
- 发布应用消息给其它相关的客户端。
|
||||
- 订阅以请求接受相关的应用消息。
|
||||
- 取消订阅以移除接受应用消息的请求。
|
||||
- 从服务端断开连接。
|
||||
|
||||
**Server**:服务端
|
||||
|
||||
作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
|
||||
|
||||
- 接受来自客户端的网络连接。
|
||||
- 接受客户端发布的应用消息。
|
||||
- 处理客户端的订阅和取消订阅请求。
|
||||
- 转发应用消息给符合条件的已订阅客户端。
|
||||
|
||||
**Topic Name**:主题名
|
||||
|
||||
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
|
||||
|
||||
**Subscription**: 订阅
|
||||
|
||||
订阅相应的主题名来获取对应的信息。
|
||||
|
||||
**Publish**:发布
|
||||
|
||||
在对应主题上发布新的消息。
|
||||
|
||||
![MQTT运行框架](https://assets.emqx.com/images/a6baf485733448bc9730f47bf1f41135.png)
|
||||
**参考链接**:[MQTT 协议入门:基础知识和快速教程](https://www.emqx.com/zh/blog/the-easiest-guide-to-getting-started-with-mqtt)
|
||||
|
||||
#### 阿里云搭建
|
||||
|
||||
平台:[https://www.aliyun.com/product/iot/iot_instc_public_cn](https://www.aliyun.com/product/iot/iot_instc_public_cn)
|
||||
|
||||
1. **控制管理台** → **注册登录** → 公共实例 → (左栏)设备管理 → 产品 → 创建产品(名称随便,其它默认)→
|
||||
2. Topic 类列表 → 自定义 Topic → 将get的权限改为“发布和订阅”
|
||||
3. 功能定义 → 前往编辑草稿 → 添加自定义功能(标识符发布时要用,步长即精度)→ 发布上线
|
||||
4. 创建设备(产品选择之前创建的)
|
||||
5. 打开RW007(网络连接),注意修改对应数字
|
||||
![alt text](image-6.png)
|
||||
6. menuconfig 阿里云软件包配置相应名称密码(在对应**产品**页顶端,**设备**页**MQTT连接参数**点击“查看”),同时**使能下方sample**(图中没标出)
|
||||
![阿里云软件包配置相应名称密码](MQTT配置3.png)
|
||||
7. `pkg --update`
|
||||
8. 把此处[packages\ali-iotkit-v3.0.2\ports\wrapper.c](packages\ali-iotkit-v3.0.2\ports\wrapper.c)的`RT_WEAK`改为`rt_weak`
|
||||
#### MQTT样例
|
||||
1. 以下代码实现拼接,`DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME`分别替代两个`%s`
|
||||
``` c
|
||||
const char *fmt = "/sys/%s/%s/thing/event/property/post";
|
||||
//...
|
||||
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
|
||||
```
|
||||
1. 这个报错不用管`E/[RW007]: The wifi Stage 1 status 0 0 0 1`
|
||||
2. 编译、运行、输入`wifi join wifiname wifisecret`
|
||||
3. 在阿里云网页日志服务可以查看发送的消息
|
||||
4. 在阿里云网页对应设备Topic列表可以发布消息(msh中可以收到)
|
||||
5. 发现运行时,shell命令用不了了,因为样例导出的命令用shell线程去跑
|
||||
6. 要把导出的封装为线程,即加入以下内容且把`mqtt_example_main()`的参数改为`void *parameter`
|
||||
|
||||
``` c
|
||||
#define THREAD_PRIORITY 25
|
||||
#define THREAD_STACK_SIZE 4096
|
||||
#define THREAD_TIMESLICE 5
|
||||
|
||||
rt_thread_t MQTT_Thread = RT_NULL;
|
||||
|
||||
void MQTT_Creat_Thread(void)
|
||||
{
|
||||
MQTT_Thread = rt_thread_create("MTQQ_Thread", mqtt_example_main, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
|
||||
|
||||
if (MQTT_Thread != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(MQTT_Thread);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("MQTT Thread Create Failed!\n");
|
||||
}
|
||||
|
||||
}
|
||||
MSH_CMD_EXPORT(MQTT_Creat_Thread, create a MQTT_Thread);
|
||||
```
|
||||
## 组件
|
||||
可以独立开发、测试、测试、部署和维护的软件单元
|
||||
*与软件包关系: 组件如手脚,软件包如工具,都可以选择是否使用*
|
||||
|
||||
### 文件系统
|
||||
用板载的W25Q64(Flash)来学习
|
||||
#### 文件系统定义
|
||||
DFS, Device File System, RTT提供的虚拟文件系统组件
|
||||
#### 文件系统架构
|
||||
统一**根目录**用`/`表示,可以挂载目录、文件,允许不同目录下的**同名文件**
|
||||
![目录与文件图](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/filesystem/figures/fs-dir.png)
|
||||
POSIX:一个协议,统一api名称,使代码可以在不同的操作系统中跑
|
||||
ELM FATFS 文件系统:常用,RomFS系统:只读 (下文继续介绍)
|
||||
![文件系统框架图](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/filesystem/figures/fs-layer.png)
|
||||
#### 文件系统种类
|
||||
| 类型 | 特点 |
|
||||
| - | - |
|
||||
| FatFS | 小型嵌入式设备,兼容微软,有良好的硬件无关性,RTT最常用,如:elm_fat |
|
||||
| RomFS | 挂载根目录,只读 |
|
||||
| DevFS | 设备文件系统,开启后设备在`/dev`虚拟成文件,可用read、write接口 |
|
||||
| UFFS | 图文开发,用于Nand Flash,快、资源消耗少、免费 |
|
||||
| NFS | 网络文件系统,用于网络连接操作另一台设备 |
|
||||
#### POSIX接口层
|
||||
一个协议,统一api名称,使代码可以在不同的操作系统中跑
|
||||
**4个重要接口**
|
||||
![POSIX](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/filesystem/figures/fs-mg.png)
|
||||
文件描述符:fd(file descriptor),对应一个文件,可能多对一(把我们找到需要的文件)
|
||||
还有:
|
||||
``` c
|
||||
int rename(const char *old, const char *new); //重命名
|
||||
int stat(const char *file, struct stat *buf); //取得状态
|
||||
int unlink(const char *pathname); //删除文件
|
||||
```
|
||||
#### 目录管理
|
||||
目录常用api
|
||||
![目录常用api图](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/filesystem/figures/fs-dir-mg.png)
|
||||
#### 文件系统启动流程
|
||||
| 名称 | 补充 |
|
||||
| - | - |
|
||||
| filesystemtable | 记录所用的文件系统 |
|
||||
| filesystem_operation_table | 记录操作函数如何实现(如open,close……)|
|
||||
|相关锁 | 如fd的互斥锁等 |
|
||||
|
||||
![alt text](image.png)
|
||||
|
||||
### FAL (搭配SFUD驱动使用)
|
||||
#### SFUD
|
||||
**[SFUD](https://github.com/armink/SFUD)**:(Serial Flash Universal Driver) 串行 **Flash 通用驱动库**,如:sfud_get_device()、sfud_read()、sfud_erase()、sfud_write()等函数接口帮助我们能够**实现对不同Flash的读写**。
|
||||
#### FAL
|
||||
**Fal组件**:(Flash Abstraction Layer) Flash 抽象层
|
||||
调用SFUD,**将Flash分区,创建块设备**,文件系统要在块设备上搭建
|
||||
[FAL 框架图](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/fal/fal)
|
||||
#### FAL API
|
||||
[**FAL API详细链接**](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/fal/fal_api)
|
||||
![FAL API图](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/fal/figures/fal-api.png)
|
||||
#### FAL 初始化流程
|
||||
W25Q64→注册为spi20设备,挂载到spi2总线上(**SPI设备**)→*通过SFUD驱动*`rt_sfud_flash_probe()`→跟一个命名为"W25Q64"的SPI_FLASH设备进行绑定(**SPI_FLASH设备**)→*通过FAL抽象层*→对SPI_FLASH设备进行分区,将对应分区注册为BLK(块)设备(**BLK设备**)→对BLK设备格式化
|
||||
![初始化流程图](image-3.png)
|
||||
**分区表**
|
||||
|
||||
| (不用管) | 分区名称 | 位置 | 偏移量 | 大小 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
|
||||
![分区表](image-2.png)
|
||||
|
||||
[文件系统操作样例代码](Day5\filesystem.c)
|
||||
|
||||
### DFS结合FAL配置W25Q64
|
||||
![DFS结合FAL配置W25Q64](image-1.png)
|
||||
1. 开启板上外设
|
||||
|
||||
![文件系统开关1](文件系统开关1.png)
|
||||
|
||||
2. 配置自动挂载
|
||||
|
||||
![文件系统开关2](文件系统开关2.png)yw
|
||||
|
||||
3. 配置Component组件
|
||||
|
||||
![文件系统开关3](文件系统开关3.png)
|
||||
|
||||
4. 配置DFS
|
||||
|
||||
![文件系统开关4](文件系统开关4.png)
|
||||
|
||||
5. 配置elmFat
|
||||
|
||||
![文件系统开关5](文件系统开关5.png)
|
||||
因为WiFi和flash挂在同一个spi下
|
||||
所以需要先关闭WiFi,在main函数加以下代码
|
||||
计算引脚 CS:90 (F-A)*16 + 10 = 90
|
||||
``` c
|
||||
#define WIFI_CS GET_PIN(F, 10)
|
||||
void WIFI_CS_PULL_DOWM(void)
|
||||
{
|
||||
rt_pin_mode(WIFI_CS, PIN_MODE_OUTPUT);
|
||||
rt_pin_write(WIFI_CS, PIN_LOW);
|
||||
}
|
||||
INIT_BOARD_EXPORT(WIFI_CS GET_PIN);
|
||||
```
|
||||
## 我的实践
|
||||
### 读取传感器数据,上传到阿里云
|
||||
(合并头两个代码),拼接字符串时我用了`sprintf`,其实应该也可以样例原有的`HAL_Snprintf`的
|
||||
``` c
|
||||
#include "rtthread.h"
|
||||
#include "dev_sign_api.h"
|
||||
#include "mqtt_api.h"
|
||||
#include <board.h>
|
||||
#include <drv_gpio.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "aht10.h"
|
||||
|
||||
char DEMO_PRODUCT_KEY[IOTX_PRODUCT_KEY_LEN + 1] = {0};
|
||||
char DEMO_DEVICE_NAME[IOTX_DEVICE_NAME_LEN + 1] = {0};
|
||||
char DEMO_DEVICE_SECRET[IOTX_DEVICE_SECRET_LEN + 1] = {0};
|
||||
|
||||
void *HAL_Malloc(uint32_t size);
|
||||
void HAL_Free(void *ptr);
|
||||
void HAL_Printf(const char *fmt, ...);
|
||||
int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN + 1]);
|
||||
int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN + 1]);
|
||||
int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN]);
|
||||
uint64_t HAL_UptimeMs(void);
|
||||
int HAL_Snprintf(char *str, const int len, const char *fmt, ...);
|
||||
|
||||
// AHT挂载的总线名字
|
||||
#define AHT10_I2C_BUS "i2c3"
|
||||
|
||||
// AHT设备指针
|
||||
aht10_device_t Dev = RT_NULL;
|
||||
|
||||
// Humi:湿度值,Temp:温度值
|
||||
float Humi, Temp;
|
||||
|
||||
|
||||
#define EXAMPLE_TRACE(fmt, ...) \
|
||||
do { \
|
||||
HAL_Printf("%s|%03d :: ", __func__, __LINE__); \
|
||||
HAL_Printf(fmt, ##__VA_ARGS__); \
|
||||
HAL_Printf("%s", "\r\n"); \
|
||||
} while(0)
|
||||
|
||||
static void example_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
|
||||
{
|
||||
iotx_mqtt_topic_info_t *topic_info = (iotx_mqtt_topic_info_pt) msg->msg;
|
||||
|
||||
switch (msg->event_type) {
|
||||
case IOTX_MQTT_EVENT_PUBLISH_RECEIVED:
|
||||
/* print topic name and topic message */
|
||||
EXAMPLE_TRACE("Message Arrived:");
|
||||
EXAMPLE_TRACE("Topic : %.*s", topic_info->topic_len, topic_info->ptopic);
|
||||
EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload);
|
||||
EXAMPLE_TRACE("\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int example_subscribe(void *handle)
|
||||
{
|
||||
int res = 0;
|
||||
const char *fmt = "/%s/%s/user/get";
|
||||
char *topic = NULL;
|
||||
int topic_len = 0;
|
||||
|
||||
topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
|
||||
topic = HAL_Malloc(topic_len);
|
||||
if (topic == NULL) {
|
||||
EXAMPLE_TRACE("memory not enough");
|
||||
return -1;
|
||||
}
|
||||
memset(topic, 0, topic_len);
|
||||
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
|
||||
|
||||
res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL);
|
||||
if (res < 0) {
|
||||
EXAMPLE_TRACE("subscribe failed");
|
||||
HAL_Free(topic);
|
||||
return -1;
|
||||
}
|
||||
|
||||
HAL_Free(topic);
|
||||
return 0;
|
||||
}
|
||||
|
||||
char tmp[256];
|
||||
void tmp_payload(void)
|
||||
{
|
||||
// 读取温湿度值
|
||||
Humi = aht10_read_humidity(Dev);
|
||||
Temp = aht10_read_temperature(Dev);
|
||||
sprintf(tmp, "{\"params\":{\"temperature\":%.2f,\"humidity\":%.2f}}", Temp, Humi);
|
||||
rt_kprintf("\n%f %f tmp:%s\n",Humi,Temp,tmp);
|
||||
return;
|
||||
}
|
||||
static int example_publish(void *handle)
|
||||
{
|
||||
|
||||
|
||||
tmp_payload();
|
||||
int res = 0;
|
||||
const char *fmt = "/sys/%s/%s/thing/event/property/post";
|
||||
// /k1lyriw1yGj/${deviceName}/user/get
|
||||
char *topic = NULL;
|
||||
int topic_len = 0;
|
||||
char *payload = tmp;
|
||||
// strcpy(payload,tmp_payload());
|
||||
rt_kprintf("payload:%s\n",payload);
|
||||
topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
|
||||
topic = HAL_Malloc(topic_len);
|
||||
if (topic == NULL) {
|
||||
EXAMPLE_TRACE("memory not enough");
|
||||
return -1;
|
||||
}
|
||||
memset(topic, 0, topic_len);
|
||||
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
|
||||
|
||||
res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
|
||||
if (res < 0) {
|
||||
EXAMPLE_TRACE("publish failed, res = %d", res);
|
||||
HAL_Free(topic);
|
||||
return -1;
|
||||
}
|
||||
|
||||
HAL_Free(topic);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void example_event_handle(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
|
||||
{
|
||||
EXAMPLE_TRACE("msg->event_type : %d", msg->event_type);
|
||||
}
|
||||
|
||||
static void mqtt_example_main(void *parameter)
|
||||
{
|
||||
void *pclient = NULL;
|
||||
int res = 0;
|
||||
int loop_cnt = 0;
|
||||
iotx_mqtt_param_t mqtt_params;
|
||||
|
||||
HAL_GetProductKey(DEMO_PRODUCT_KEY);
|
||||
HAL_GetDeviceName(DEMO_DEVICE_NAME);
|
||||
HAL_GetDeviceSecret(DEMO_DEVICE_SECRET);
|
||||
|
||||
EXAMPLE_TRACE("mqtt example");
|
||||
|
||||
memset(&mqtt_params, 0x0, sizeof(mqtt_params));
|
||||
|
||||
mqtt_params.handle_event.h_fp = example_event_handle;
|
||||
|
||||
pclient = IOT_MQTT_Construct(&mqtt_params);
|
||||
if (NULL == pclient) {
|
||||
EXAMPLE_TRACE("MQTT construct failed");
|
||||
return ;
|
||||
}
|
||||
|
||||
res = example_subscribe(pclient);
|
||||
if (res < 0) {
|
||||
IOT_MQTT_Destroy(&pclient);
|
||||
return ;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
if (0 == loop_cnt % 20) {
|
||||
example_publish(pclient);
|
||||
}
|
||||
|
||||
IOT_MQTT_Yield(pclient, 200);
|
||||
|
||||
loop_cnt += 1;
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
#define THREAD_PRIORITY 25
|
||||
#define THREAD_STACK_SIZE 4096
|
||||
#define THREAD_TIMESLICE 5
|
||||
|
||||
rt_thread_t MQTT_Thread = RT_NULL;
|
||||
|
||||
void MQTT_Creat_Thread(void)
|
||||
{
|
||||
|
||||
// 初始化设备
|
||||
Dev = aht10_init(AHT10_I2C_BUS);
|
||||
if (Dev == RT_NULL)
|
||||
{
|
||||
rt_kprintf("AHT10_init Fail");
|
||||
return;
|
||||
}
|
||||
|
||||
MQTT_Thread = rt_thread_create("MTQQ_Thread", mqtt_example_main, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
|
||||
|
||||
if (MQTT_Thread != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(MQTT_Thread);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("MQTT Thread Create Failed!\n");
|
||||
}
|
||||
|
||||
}
|
||||
MSH_CMD_EXPORT(MQTT_Creat_Thread, create a MQTT_Thread);
|
||||
```
|
||||
|
||||
[更多参考官方文档链接](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem?id=%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86)
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
//记得在menuconfig中开启支持旧版本功能(Support legacy version)
|
||||
#include <board.h>
|
||||
#include <rtthread.h>
|
||||
#include <drv_gpio.h>
|
||||
#include <dfs_posix.h>//需要添加软件包进这里
|
||||
|
||||
//定义要写入的内容
|
||||
char String[] = "Hello, RT-Thread.Welcom to RSOC!";
|
||||
|
||||
//定义接受文件内容的缓冲区
|
||||
char buffer[100] = {};
|
||||
|
||||
void FileSystem_Test(void *parameter)
|
||||
{
|
||||
//文件描述符
|
||||
int fd;
|
||||
|
||||
//用只写方式打开文件,如果没有该文件,则创建一个文件
|
||||
fd = open("/fal/FileTest.txt", O_WRONLY | O_CREAT);
|
||||
|
||||
//如果打开成功
|
||||
if (fd >= 0)
|
||||
{
|
||||
//写入文件
|
||||
write(fd, String, sizeof(String));
|
||||
|
||||
rt_kprintf("Write done.\n");
|
||||
|
||||
//关闭文件
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("File Open Fail.\n");
|
||||
}
|
||||
|
||||
//用只读方式打开文件
|
||||
fd = open("/fal/FileTest.txt", O_RDONLY);
|
||||
|
||||
if (fd>= 0)
|
||||
{
|
||||
//读取文件内容
|
||||
rt_uint32_t size = read(fd, buffer, sizeof(buffer));
|
||||
|
||||
if (size < 0)
|
||||
{
|
||||
rt_kprintf("Read File Fail.\n");
|
||||
return ;
|
||||
}
|
||||
|
||||
//输出文件内容
|
||||
rt_kprintf("Read from file test.txt : %s \n", buffer);
|
||||
|
||||
//关闭文件
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("File Open Fail.\n");
|
||||
}
|
||||
}
|
||||
//导出命令
|
||||
MSH_CMD_EXPORT(FileSystem_Test, FileSystem_Test);
|
||||
|
||||
static void readdir_sample(void)
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent *d;
|
||||
|
||||
/* 打开 / dir_test 目录 */
|
||||
dirp = opendir("/fal");
|
||||
if (dirp == RT_NULL)
|
||||
{
|
||||
rt_kprintf("open directory error!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 读取目录 */
|
||||
while ((d = readdir(dirp)) != RT_NULL)
|
||||
{
|
||||
rt_kprintf("found %s\n", d->d_name);
|
||||
}
|
||||
|
||||
/* 关闭目录 */
|
||||
closedir(dirp);
|
||||
}
|
||||
}
|
||||
/* 导出到 msh 命令列表中 */
|
||||
MSH_CMD_EXPORT(readdir_sample, readdir sample);
|
||||
|
||||
/*
|
||||
#define WIFI_CS GET_PIN(F, 10)
|
||||
void WIFI_CS_PULL_DOWM(void)
|
||||
{
|
||||
rt_pin_mode(WIFI_CS, PIN_MODE_OUTPUT);
|
||||
rt_pin_write(WIFI_CS, PIN_LOW);
|
||||
}
|
||||
INIT_BOARD_EXPORT(WIFI_CS GET_PIN);
|
||||
*/
|
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 219 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 167 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 53 KiB |
|
@ -2,14 +2,8 @@ from building import *
|
|||
import os
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
# src = Glob('*.c')
|
||||
src = [
|
||||
'main.c',
|
||||
]
|
||||
CPPPATH = [cwd]
|
||||
|
||||
if GetDepend(['PKG_USING_RTDUINO']) and not GetDepend(['RTDUINO_NO_SETUP_LOOP']):
|
||||
src += ['arduino_main.cpp']
|
||||
src = Glob('*.c')
|
||||
|
||||
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
|
||||
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-07-08 Nino the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <board.h>
|
||||
|
||||
#include <drv_lcd.h>
|
||||
|
||||
void app_lcd_string(void){
|
||||
lcd_clear(WHITE);
|
||||
|
||||
/* set the background color and foreground color */
|
||||
lcd_set_color(WHITE, BLACK);
|
||||
|
||||
/* show some string on lcd */
|
||||
lcd_show_string(10, 69, 16, "Hello, RT-Thread!");
|
||||
lcd_show_string(10, 69 + 16, 24, "RT-Thread");
|
||||
lcd_show_string(10, 69 + 16 + 24, 32, "RT-Thread");
|
||||
|
||||
/* draw a line on lcd */
|
||||
lcd_draw_line(0, 69 + 16 + 24 + 32, 240, 69 + 16 + 24 + 32);
|
||||
rt_kprintf("string lcd\n");
|
||||
}
|
||||
|
||||
void app_lcd_circle(void){
|
||||
/* draw a concentric circles */
|
||||
lcd_draw_point(120, 194);
|
||||
for (int i = 0; i < 46; i += 4)
|
||||
{
|
||||
lcd_draw_circle(120, 194, i);
|
||||
}
|
||||
rt_kprintf("circle lcd\n");
|
||||
}
|
||||
|
||||
void app_lcd_clean(void){
|
||||
lcd_clear(WHITE);
|
||||
rt_kprintf("clean lcd\n");
|
||||
}
|
||||
|
||||
MSH_CMD_EXPORT(app_lcd_string, show string on LCD);
|
||||
MSH_CMD_EXPORT(app_lcd_circle, show circle on LCD);
|
||||
MSH_CMD_EXPORT(app_lcd_clean, clean LCD);
|
|
@ -1,24 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2024, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-08 Li ZhenHong first version
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
/* put your setup code here, to run once: */
|
||||
Serial.begin();
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
/* put your main code here, to run repeatedly: */
|
||||
Serial.println("Hello Arduino!");
|
||||
delay(800);
|
||||
}
|
|
@ -1,69 +0,0 @@
|
|||
# stm32f407-rt-spark 开发板的Arduino生态兼容说明
|
||||
|
||||
## 1 RTduino - RT-Thread的Arduino生态兼容层
|
||||
|
||||
stm32f407-rt-spark 开发板已经完整适配了[RTduino软件包](https://github.com/RTduino/RTduino),即RT-Thread的Arduino生态兼容层。用户可以按照Arduino的编程习惯来操作该BSP,并且可以使用大量Arduino社区丰富的库,是对RT-Thread生态的极大增强。更多信息,请参见[RTduino软件包说明文档](https://github.com/RTduino/RTduino)。
|
||||
|
||||
### 1.1 如何开启针对本BSP的Arduino生态兼容层
|
||||
|
||||
Env 工具下敲入 menuconfig 命令,或者 RT-Thread Studio IDE 下选择 RT-Thread Settings:
|
||||
|
||||
```Kconfig
|
||||
Hardware Drivers Config --->
|
||||
Onboard Peripheral Drivers --->
|
||||
[*] Compatible with Arduino Ecosystem (RTduino)
|
||||
```
|
||||
|
||||
## 2 Arduino引脚排布
|
||||
|
||||
更多引脚布局相关信息参见 [pins_arduino.c](pins_arduino.c) 和 [pins_arduino.h](pins_arduino.h)。
|
||||
|
||||
![Rt-spark_Rtduino_Pin_Map.drawio](Rt-spark_Rtduino_Pin_Map.drawio.png)
|
||||
|
||||
| Arduino引脚编号 | STM32引脚编号 | 5V容忍 | 备注 |
|
||||
| ------------------- | --------- | ---- | ------------------------------------------------------------------------- |
|
||||
| 0 (D0) | GET_PIN(A, 10) | 是 | Serial-RX,默认被RT-Thread的UART设备框架uart1接管 |
|
||||
| 1 (D1) | GET_PIN(A, 9) | 是 | Serial-TX,默认被RT-Thread的UART设备框架uart1接管 |
|
||||
| 2 (D2) | GET_PIN(A, 8) | 是 | |
|
||||
| 3 (D3) | GET_PIN(B, 10) | 是 | PWM2-CH3,默认被RT-Thread的PWM设备框架pwm2接管 |
|
||||
| 4 (D4) | GET_PIN(A, 1) | 是 | |
|
||||
| 5 (D5) | GET_PIN(B, 14) | 是 | |
|
||||
| 6 (D6) | GET_PIN(B, 11) | 是 | PWM2-CH4,默认被RT-Thread的PWM设备框架pwm2接管 |
|
||||
| 7 (D7) | GET_PIN(B, 15) | 是 | |
|
||||
| 8 (D8) | GET_PIN(F, 15) | 是 | |
|
||||
| 9 (D9) | GET_PIN(E, 11) | 是 | PWM1-CH2,默认被RT-Thread的PWM设备框架pwm1接管 |
|
||||
| 10 (D10) | GET_PIN(E, 13) | 是 | PWM1-CH3,默认被RT-Thread的PWM设备框架pwm1接管 |
|
||||
| 11 (D11) | GET_PIN(D, 12) | 是 | PWM4-CH1,默认被RT-Thread的PWM设备框架pwm4接管 |
|
||||
| 12 (D12) | GET_PIN(D, 10) | 是 | |
|
||||
| 13 (D13) | GET_PIN(D, 8) | 是 | |
|
||||
| 14 (D14) | GET_PIN(E, 14) | 是 | |
|
||||
| 15 (D15) | GET_PIN(E, 12) | 是 | |
|
||||
| 16 (D16) | GET_PIN(E, 15) | 是 | |
|
||||
| 17 (D17) | GET_PIN(D, 9) | 是 | |
|
||||
| 18 (D18) | GET_PIN(G, 2) | 是 | |
|
||||
| 19 (D19) | GET_PIN(B, 2) | 是 | |
|
||||
| 20 (D20) | GET_PIN(G, 0) | 是 | |
|
||||
| 21 (D21) | GET_PIN(A, 0) | 是 | |
|
||||
| 22 (D22) | GET_PIN(G, 5) | 是 | SSPI1-SCK,默认被RT-Thread的SPI设备框架sspi1接管|
|
||||
| 23 (D23) | GET_PIN(G, 3) | 是 | SSPI1-MISO,默认被RT-Thread的SPI设备框架sspi1接管 |
|
||||
| 24 (D24) | GET_PIN(G, 1) | 是 | SSPI1-MOSI,默认被RT-Thread的SPI设备框架sspi1接管 |
|
||||
| 25 (D25) | GET_PIN(G, 7) | 是 | I2C1-SCL,默认被RT-Thread的I2C设备框架i2c1接管 |
|
||||
| 26 (D26) | GET_PIN(D, 7) | 是 | I2C1-SDA,默认被RT-Thread的I2C设备框架i2c1接管 |
|
||||
| 27 (D27) | GET_PIN(B, 6) | 是 | I2C2-SCL,默认被RT-Thread的I2C设备框架i2c2接管 |
|
||||
| 28 (D28) | GET_PIN(B, 7) | 是 | I2C2-SDA,默认被RT-Thread的I2C设备框架i2c2接管 |
|
||||
| 29 (D29) | GET_PIN(G, 6) | 是 | |
|
||||
| 30 (D30) | GET_PIN(G, 4) | 是 | |
|
||||
| 31 (D31) | GET_PIN(A, 2) | 是 | Serial2-TX,默认被RT-Thread的UART设备框架uart2接管 |
|
||||
| 32 (D32) | GET_PIN(A, 3) | 是 | Serial2-RX,默认被RT-Thread的UART设备框架uart2接管 |
|
||||
| 33 (D33) | GET_PIN(F, 12) | 是 | 板载用户R_LED |
|
||||
| 34 (D34) | GET_PIN(F, 11) | 是 | 板载用户B_LED |
|
||||
| 35 (D35) | GET_PIN(B, 0) | 是 | 板载蜂鸣器 |
|
||||
| 36 (D36) | GET_PIN(C, 5) | 是 | 板载按键KEY_UP |
|
||||
| 37 (D37) | GET_PIN(C, 1) | 是 | 板载按键KEY_DOWM |
|
||||
| 38 (D38) | GET_PIN(C, 0) | 是 | 板载按键KEY_LEFT |
|
||||
| 39 (D39) | GET_PIN(C, 4) | 是 | 板载按键KEY_RIGHT |
|
||||
| 40 (A0) | GET_PIN(F, 6) | 是 | ADC3-CH4,默认被RT-Thread的ADC设备框架adc3接管 |
|
||||
| 41 (A1) | GET_PIN(F, 7) | 是 | ADC3-CH5,默认被RT-Thread的ADC设备框架adc3接管 |
|
||||
| 42 (A2) | GET_PIN(F, 4) | 是 | ADC3-CH14,默认被RT-Thread的ADC设备框架adc3接管 |
|
||||
| 43 (A3) | GET_PIN(F, 5) | 是 | ADC3-CH15,默认被RT-Thread的ADC设备框架adc3接管 |
|
||||
| 44 (DAC0) | GET_PIN(A, 4) | 否 | DAC1-CH1,默认被RT-Thread的DAC设备框架dac1接管 |
|
Before Width: | Height: | Size: 1.9 MiB |
|
@ -1,9 +0,0 @@
|
|||
from building import *
|
||||
|
||||
cwd = GetCurrentDir()
|
||||
src = Glob('*.c') + Glob('*.cpp')
|
||||
inc = [cwd]
|
||||
|
||||
group = DefineGroup('RTduino-pinout', src, depend = ['PKG_USING_RTDUINO'], CPPPATH = inc)
|
||||
|
||||
Return('group')
|
|
@ -1,69 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2024, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-10 Li ZhenHong first version
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "pins_arduino.h"
|
||||
#include <drv_gpio.h>
|
||||
|
||||
/*
|
||||
* {Arduino Pin, RT-Thread Pin [, Device Name, 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(A, 10), "uart1"}, /* Serial-RX */
|
||||
{D1, GET_PIN(A, 9), "uart1"}, /* Serial-TX */
|
||||
{D2, GET_PIN(A, 8)},
|
||||
{D3, GET_PIN(B, 10), "pwm2", 3}, /* PWM */
|
||||
{D4, GET_PIN(A, 1)},
|
||||
{D5, GET_PIN(B, 14)},
|
||||
{D6, GET_PIN(B, 11), "pwm2", 4}, /* PWM */
|
||||
{D7, GET_PIN(B, 15)},
|
||||
{D8, GET_PIN(F, 15)},
|
||||
{D9, GET_PIN(E, 11), "pwm1", 2}, /* PWM */
|
||||
{D10, GET_PIN(E, 13), "pwm1", 3}, /* PWM */
|
||||
{D11, GET_PIN(D, 12), "pwm4", 1}, /* PWM */
|
||||
{D12, GET_PIN(D, 10)},
|
||||
{D13, GET_PIN(D, 8)},
|
||||
{D14, GET_PIN(E, 14)},
|
||||
{D15, GET_PIN(E, 12)},
|
||||
{D16, GET_PIN(E, 15)},
|
||||
{D17, GET_PIN(D, 9)},
|
||||
{D18, GET_PIN(G, 2)},
|
||||
{D19, GET_PIN(B, 2)},
|
||||
{D20, GET_PIN(G, 0)},
|
||||
{D21, GET_PIN(A, 0)},
|
||||
{D22, GET_PIN(G, 5), "sspi1"}, /* SOFT-SPI-SCK */
|
||||
{D23, GET_PIN(G, 3), "sspi1"}, /* SOFT-SPI-MISO */
|
||||
{D24, GET_PIN(G, 1), "sspi1"}, /* SOFT-SPI-MOSI */
|
||||
{D25, GET_PIN(G, 7), "i2c4"}, /* I2C-SCL (Wire) */
|
||||
{D26, GET_PIN(D, 7), "i2c4"}, /* I2C-SDA (Wire) */
|
||||
{D27, GET_PIN(B, 6), "i2c5"}, /* I2C-SCL (Wire) */
|
||||
{D28, GET_PIN(B, 7), "i2c5"}, /* I2C-SDA (Wire) */
|
||||
{D29, GET_PIN(G, 6)}, /* SPI-SS */
|
||||
{D30, GET_PIN(G, 4)},
|
||||
{D31, GET_PIN(A, 2), "uart2"}, /* Serial2-TX */
|
||||
{D32, GET_PIN(A, 3), "uart2"}, /* Serial2-RX */
|
||||
{D33, GET_PIN(F, 12)}, /* On-Board R_LED */
|
||||
{D34, GET_PIN(F, 11)}, /* On-Board B_LED */
|
||||
{D35, GET_PIN(B, 0)}, /* On_Board Buzzer */
|
||||
{D36, GET_PIN(C, 5)}, /* On-Board KEY_UP */
|
||||
{D37, GET_PIN(C, 1)}, /* On-Board KEY_DOWM */
|
||||
{D38, GET_PIN(C, 0)}, /* On-Board KEY_LEFT */
|
||||
{D39, GET_PIN(C, 4)}, /* On-Board KEY_RIGHT */
|
||||
{A0, GET_PIN(F, 6), "adc3", 4}, /* ADC */
|
||||
{A1, GET_PIN(F, 7), "adc3", 5}, /* ADC */
|
||||
{A2, GET_PIN(F, 4), "adc3", 14}, /* ADC */
|
||||
{A3, GET_PIN(F, 5), "adc3", 15}, /* ADC */
|
||||
{DAC0, GET_PIN(A, 4), "dac1", 1}, /* DAC */
|
||||
};
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2006-2024, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2024-04-07 Li ZhenHong first version
|
||||
*/
|
||||
|
||||
#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 D25 (25)
|
||||
#define D26 (26)
|
||||
#define D27 (27)
|
||||
#define D28 (28)
|
||||
#define D29 (29)
|
||||
#define D30 (30)
|
||||
#define D31 (31)
|
||||
#define D32 (32)
|
||||
#define D33 (33)
|
||||
#define D34 (34)
|
||||
#define D35 (35)
|
||||
#define D36 (36)
|
||||
#define D37 (37)
|
||||
#define D38 (38)
|
||||
#define D39 (39)
|
||||
#define A0 (40)
|
||||
#define A1 (41)
|
||||
#define A2 (42)
|
||||
#define A3 (43)
|
||||
#define DAC0 (44)
|
||||
|
||||
#define RTDUINO_PIN_MAX_LIMIT DAC0 /* pin number max limit check */
|
||||
|
||||
#define F_CPU 168000000L /* CPU:168MHz */
|
||||
|
||||
#define LED_BUILTIN D33 /* Default Built-in LED */
|
||||
|
||||
/* i2c4 : PD.7-SDA PG.7-SCL */
|
||||
#define RTDUINO_DEFAULT_IIC_BUS_NAME "i2c4"
|
||||
|
||||
#define SS D32 /* Chip select pin of default spi */
|
||||
/* sspi1 : PG.5-SCK PG.3-MISO PG.1-MOSI */
|
||||
#define RTDUINO_DEFAULT_SPI_BUS_NAME "sspi1"
|
||||
|
||||
/* Serial2(uart2) : PA.2-TX PA.3-RX */
|
||||
#define RTDUINO_SERIAL2_DEVICE_NAME "uart2"
|
||||
|
||||
#endif /* Pins_Arduino_h */
|
|
@ -1,85 +0,0 @@
|
|||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <board.h>
|
||||
#include <icm20608.h>
|
||||
|
||||
#define LOG_TAG "icm.app"
|
||||
#define LOG_LVL LOG_LVL_DBG
|
||||
#include <ulog.h>
|
||||
|
||||
static void icm_thread_entry(void *parameter)
|
||||
{
|
||||
icm20608_device_t dev = RT_NULL;
|
||||
const char *i2c_bus_name = "i2c2";
|
||||
int count = 0;
|
||||
rt_err_t result;
|
||||
|
||||
/* 初始化 icm20608 传感器 */
|
||||
dev = icm20608_init(i2c_bus_name);
|
||||
if (dev == RT_NULL)
|
||||
{
|
||||
LOG_E("The sensor initializes failure");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_D("The sensor initializes success");
|
||||
}
|
||||
|
||||
/* 对 icm20608 进行零值校准:采样 10 次,求取平均值作为零值 */
|
||||
result = icm20608_calib_level(dev, 10);
|
||||
if (result == RT_EOK)
|
||||
{
|
||||
LOG_D("The sensor calibrates success");
|
||||
LOG_D("accel_offset: X%6d Y%6d Z%6d", dev->accel_offset.x, dev->accel_offset.y, dev->accel_offset.z);
|
||||
LOG_D("gyro_offset : X%6d Y%6d Z%6d", dev->gyro_offset.x, dev->gyro_offset.y, dev->gyro_offset.z);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_E("The sensor calibrates failure");
|
||||
icm20608_deinit(dev);
|
||||
}
|
||||
|
||||
while (count++ < 100)
|
||||
{
|
||||
rt_int16_t accel_x, accel_y, accel_z;
|
||||
rt_int16_t gyros_x, gyros_y, gyros_z;
|
||||
|
||||
/* 读取三轴加速度 */
|
||||
result = icm20608_get_accel(dev, &accel_x, &accel_y, &accel_z);
|
||||
if (result == RT_EOK)
|
||||
{
|
||||
LOG_D("current accelerometer: accel_x%6d, accel_y%6d, accel_z%6d", accel_x, accel_y, accel_z);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_E("The sensor does not work");
|
||||
}
|
||||
|
||||
/* 读取三轴陀螺仪 */
|
||||
result = icm20608_get_gyro(dev, &gyros_x, &gyros_y, &gyros_z);
|
||||
if (result == RT_EOK)
|
||||
{
|
||||
LOG_D("current gyroscope : gyros_x%6d, gyros_y%6d, gyros_z%6d", gyros_x, gyros_y, gyros_z);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_E("The sensor does not work");
|
||||
break;
|
||||
}
|
||||
rt_thread_mdelay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
static int icm_app(void)
|
||||
{
|
||||
rt_thread_t res = rt_thread_create("icm", icm_thread_entry, RT_NULL, 1024, 20, 50);
|
||||
if(res == RT_NULL)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_thread_startup(res);
|
||||
|
||||
return RT_EOK;
|
||||
}
|
||||
MSH_CMD_EXPORT(icm_app, icm_app);
|
|
@ -1,3 +1,54 @@
|
|||
// /*
|
||||
// * Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
// *
|
||||
// * SPDX-License-Identifier: Apache-2.0
|
||||
// *
|
||||
// * Change Logs:
|
||||
// * Date Author Notes
|
||||
// * 2023-5-10 ShiHao first version
|
||||
// */
|
||||
|
||||
// #include <rtthread.h>
|
||||
// #include <rtdevice.h>
|
||||
// #include <board.h>
|
||||
|
||||
// #define DBG_TAG "main"
|
||||
// #define DBG_LVL DBG_LOG
|
||||
// #include <rtdbg.h>
|
||||
|
||||
// #include <drv_lcd.h>
|
||||
// #include <rttlogo.h>
|
||||
|
||||
// /* 配置 LED 灯引脚 */
|
||||
// #define PIN_LED_B GET_PIN(F, 11) // PF11 : LED_B --> LED
|
||||
// #define PIN_LED_R GET_PIN(F, 12) // PF12 : LED_R --> LED
|
||||
|
||||
// int main(void)
|
||||
// {
|
||||
// // lcd_clear(WHITE);
|
||||
|
||||
// // /* show RT-Thread logo */
|
||||
// // lcd_show_image(0, 0, 240, 69, image_rttlogo);
|
||||
|
||||
// // /* set the background color and foreground color */
|
||||
// // lcd_set_color(WHITE, BLACK);
|
||||
|
||||
// // /* show some string on lcd */
|
||||
// // lcd_show_string(10, 69, 16, "Hello, RT-Thread!");
|
||||
// // lcd_show_string(10, 69 + 16, 24, "RT-Thread");
|
||||
// // lcd_show_string(10, 69 + 16 + 24, 32, "RT-Thread");
|
||||
|
||||
// // /* draw a line on lcd */
|
||||
// // lcd_draw_line(0, 69 + 16 + 24 + 32, 240, 69 + 16 + 24 + 32);
|
||||
|
||||
// // /* draw a concentric circles */
|
||||
// // lcd_draw_point(120, 194);
|
||||
// // for (int i = 0; i < 46; i += 4)
|
||||
// // {
|
||||
// // lcd_draw_circle(120, 194, i);
|
||||
// // }
|
||||
// return 0;
|
||||
// }
|
||||
#include <rtthread.h>
|
||||
#include<board.h>
|
||||
#include <drv_gpio.h>
|
||||
|
@ -8,7 +59,7 @@
|
|||
#define GPIO_LED_B GET_PIN(F,11)
|
||||
#define GPIO_LED_R GET_PIN(F,12)
|
||||
|
||||
int main(void)
|
||||
int main(void)
|
||||
{
|
||||
rt_pin_mode(GPIO_LED_B, PIN_MODE_OUTPUT);
|
||||
while(1)
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
//未完成
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
|
||||
#include <drv_spi.h>
|
||||
#include <drv_gpio.h>
|
||||
|
||||
|
||||
static int spi_attach(void)
|
||||
{
|
||||
return rt_hw_spi_device_attach("spi2", "spi20", GET_PIN(B,12));
|
||||
}
|
||||
// INIT_DEVICE_EXPORT(spi_attach);
|
||||
|
||||
static int spi_transfer_one_data(void)
|
||||
{
|
||||
rt_err_t ret =RT_EOK;
|
||||
struct rt_spi_device *spi_d20 = (struct rt_spi_device *)rt_device_find("spi20");
|
||||
|
||||
struct rt_spi_configuration cfg;
|
||||
cfg.data_width = 8;
|
||||
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
|
||||
cfg.max_hz =1 *1000 *1000;
|
||||
rt_spi_configure(spi20,&cfg);
|
||||
|
||||
rt_uint8_t sendBuff = 0xDA;
|
||||
rt_uint8_t recvBuff = 0xF1;
|
||||
ret =rt_spi_transfer(spi20,&sendBuff,&recvBuff,1);
|
||||
rt_kprintf("sret = %d\n",ret);
|
||||
}
|
||||
MSH_CMD_EXPORT(spi_transfer_one_data, spi transfer one data);
|
|
@ -1,19 +0,0 @@
|
|||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
|
||||
#define LOG_TAG "drv.test"
|
||||
#define LOG_LVL LOG_LVL_DBG
|
||||
#include <ulog.h>
|
||||
|
||||
static int dev_test_app(void)
|
||||
[
|
||||
rt_device_t test_dev = rt_device_find("test_dev");
|
||||
if(test_dev == RT_NULL)
|
||||
{
|
||||
LOG_E("Cannot find test_dev");
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
rt_device_open(test_dev, RT_DEVICE_OFLAG_RDWR);
|
||||
rt_device_close(test_dev);
|
||||
]
|