air001研究笔记.基于arduino快速开发简单项目

一、air001芯片简介

air001是厂商合宙推出的一款tssop封装的mcu芯片。支持swd与串口烧录,多面向简单的功能简单类别的电子产品,因为官方文档齐全上手简易,所以也特别适合非专业爱好者乃至于幼儿编程。芯片内置资源:AIR001芯片数据手册1.0.4.pdf

  • arm Comtex-m0内核架构,内置集成32kB的字节寻址flash以及4kB ram,工作最高主频48Mhz,内置rc振荡器也支持外部晶振时钟

  • 供电支持1.7-5.5v的宽范围供电与io口,io数量18个,但有些io需要被复用为串口下载或者swd仿真,实际无法全部使用为gpio
    在这里插入图片描述

  • 带一个1Mhz采样率12bit分11路adc外设,9外部2内部,内部可用于实现温度传感器

  • 3通道DMA

  • 硬件CRC校验

  • 9个定时器,1个16bit高级定时器,4个16bit通用定时器,2个看门狗定时器,1个systick定时器,1个低功耗定时器

  • 带2个uart跟1个iic跟2个spi通信外设,iic支持100k\400k速率。

  • 2个硬件比较器

二、使用的开发板

1.开发板上下图片
在这里插入图片描述

2.官方开发板图片
在这里插入图片描述

三、开发环境

1.更推荐只是想diy不涉及商业应用的新手使用arduino平台作为开发环境

2.建议商业级应用使用keil作为开发环境

四、基于arduino的开发环境

1.工具准备

  • air官方的文档地址

  • air官方应用文档地址

  • usb转ttl串口收发器(如果是合宙官方的开发板自带usb转ttl串口收发器,所以不需要准备转串口工具)
    在这里插入图片描述

  • arduino IDE网址

  • 开发板原理图

  • 开发板3D点位图

2.烧录与下载

  • 合宙官方提供了完整的开发文档,可以多看看那些
  • arduino IDE下载完了之后会给自身安装插件以及驱动,耐心等待以及一路next就好。
  • 软件准备完毕之后,把下面合宙官方的测试代码复制进去
void setup() {// put your setup code here, to run once:pinMode(PB_0, OUTPUT);Serial.begin(115200);Serial.printf("Hello, Air001. \n");
}void loop() {// put your main code here, to run repeatedly:static int count = 0;if (count % 2 == 0) {digitalWrite(PB_0, HIGH);} else {digitalWrite(PB_0, LOW);}Serial.printf("This is NO.%d print. \n", count);count++;delay(1000);
}
  • 然后先按住板上的"boot"按钮,再给开发板插上电,再松开按钮,这样芯片就进入了串口烧录模式。值得注意的是,我的开发板不板载usb转ttl芯片,所以需要外置转串口工具,但是转串口工具的引脚"RX、TX"会反灌开发板电压,导致air001进入串口烧录模式失败,所以转串口工具不要先插电脑。

  • 插上usb转ttl串口工具,将转串口工具的’RX’连接开发板的’TX’,将转串口工具的’TX’连接开发板的’RX’,将转串口工具的’GND’连接开发板的’GND’(合宙官方开发板免去这个步骤)

  • 设置arduino ide,如下图
    在这里插入图片描述

  • 当然,里面的设置不会跟我的一模一样,比如第二步就因为串口收发器插入了电脑不同的端口导致有所不同,所以先在设备管理器看看自己新加入设备在哪个端口上。还有一个情况是,转串口工具是需要下载驱动安装的,这个自己去找卖给自己的usb转ttl工具的商家要,目前常用的芯片一般也就是两类:CH34x、cp210x。而第三步里软件不会直接就有“Air001 Dev chip”的选项,而是“air001”的选项,想要有“Air001 Dev chip”的选项必须先选择“air001”然后“OK”确定后软件就会开始下载支持插件以及SDK,下载完之后就会跟我图片展现的一致出现“Air001 Dev chip”的选项

  • 点击arduino IDE的upload按钮开始编译以及下载
    在这里插入图片描述

  • 烧录成功后就按下rst按钮即可复位芯片,当然也有可能复位失败的情况,复位失败就直接拔掉芯片的供电再插回去也可以复位。

  • 打开串口监视器
    在这里插入图片描述

  • 选择串口监视器的波特率为115200,如果设置完后发现乱码那就重新拔插一下供电或者再重复一遍烧录流程
    在这里插入图片描述

3.到上面的这一步就已经可以开始愉快的电子diy之旅。下面我会演示点亮一块0.96寸oled屏幕

  • 这个屏幕是普通的0.96寸oled屏幕,控制芯片为SSD1306,四线iic通信,兼容3.3v\5v的一块显示屏。

  • 将开发板的PA5\PA6连接到显示屏的SCL\SDA(PA5—SDA, PA6—SCL),显示屏的VCC以及GND也要记得接上开发板。
    在这里插入图片描述

  • 将下面的代码复制进编辑器并按上文的编译烧录流程走一遍

#include <Arduino.h>
#include <U8g2lib.h>U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ PA_6, /* data=*/ PA_5, /* reset=*/ U8X8_PIN_NONE);void setup() {u8g2.begin();u8g2.home();pinMode(PB_0, OUTPUT);Serial.begin(115200);Serial.printf("Hello, Air001. \n");
}void loop() {u8g2.firstPage();do {u8g2.setFont(u8g2_font_ncenB10_tr);u8g2.drawStr(10,10,"Hello World!");u8g2.drawStr(10,30,"And air001!");} while ( u8g2.nextPage() );Serial.printf("Hello, Air001. \n");delay(1000);  
}
  • 编译烧录完毕后按下reset按钮,等一会就可以看到显示屏显示了字体出来。
    在这里插入图片描述

  • 可以看到,虽然显示屏有数据出来,但是刷新速度太慢,这个时候可以提高系统的频率,来提高刷新率。如下面图片选择的是:使用内部振荡器时钟,工作频率为48Mhz,当然如果自己使用的开发板带外部晶振也可选择使用"HSE ***,HCLK ***"
    在这里插入图片描述

  • 我这里演示了0.96寸oled显示屏点亮,事实上显示屏是diy中非常重要的一个功能,很多的diy设计都会需要用到显示屏显示一些运行中的数据或者用显示屏加按键实现人机交互。使用串口做数据监控离不开电脑,所以uart串口除却用于其他器件的通信外一般用于代码debug以及打log。

  • 我已经演示了uart串口、oled显示、gpio控制,这三个掌握了已经可以说是掌握了diy设计要求能力的80%。一些功能复杂、代码繁复、高速、有时序要求的设计就不是arduino开发平台能搞得定的了。我对arduino的期待就是小于1000行的代码设计可以使用arduino平台做开发,如果超过就不应该使用arduino做设计开发。当然我上面讨论的是diy设计,如果是属于消费电子以及工控领域,无论如何都不应该使用arduino做开发,而是使用keil或者iar做编译,vscode做编辑的方式。商业开发要求代码稳定可移植而且工程师要对代码中的任何一个库以及环节尽可能的了然于胸(完全了解肯定是不可能的),否则就等着一个bug搞一个月最后也搞不出来项目流产。嵌入式技术总体分为单片机以及linux领域,fpga、dsp开发也在嵌入式开发中有涉及到,专业的嵌入式工程师应该在前期抓住一个领域死磕并涉猎硬件,再然后把自己的知识面扩展到其他的方面并挑一个行业扎根深入。嵌入式是很大的一个领域不能够三天打鱼两天晒网也不能东捞一网西下一笼,广但是精很重要。

五、其他常用外设示例

在合宙的应用官网上有很多的应用实例以及api手册,其中api手册很重要,因为一些arduino的常用api其实air001并没有很好的适配,所以使用官方的api开发时非常有必要的。

1、adc示例

#include <Arduino.h>void setup() {pinMode(PA_7, INPUT_ANALOG);//初始化adc,通道7Serial.begin(115200);//初始化串口Serial.printf("Hello, Air001. \n");
}void loop() {float volt = 3.3;char buffer[7] = {0};volt = analogRead(PA_7)/1024.0*3.3;//12bit的dac为什么是1024?因为合宙官方貌似底层驱动库做了处理。Serial.print("PA7---adc0_in7 : voltal=");//Serial.printf似乎合宙官方没有实现支持浮点,只能人工转换了buffer[0] = (int)(volt/10)%10 + '0';//十位buffer[1] = (int)volt%10 + '0';//个位buffer[2] = '.';buffer[3] = (int)(volt*10)%10 + '0';buffer[4] = (int)(volt*100)%10 + '0';buffer[5] = (int)(volt*1000)%10 + '0';buffer[6] = '\0';Serial.printf("%sV\n", buffer);delay(1000);  
}

在这里插入图片描述

2、pwm示例

#include <Arduino.h>void setup() {//不要改变下面函数的书写顺序,在48Mhz运行时钟下最低分辨率为2bit,最快速度为12Mhz,实测波形完整性50%占空比下ok,但是芯片内部貌似使用内部时钟时时钟质量会变化也就是斜率变斜导致占空比输出的波形劣化pinMode(PA_0, OUTPUT);analogWriteResolution(2);//设置占空比的分母2^2 = 4analogWriteFrequency(12000000);//12MhzanalogWrite(PA_0, 4/2);//设置占空比的分子以及输出端口
}void loop() {delay(1000);  
}

在这里插入图片描述

3、iic示例

略,建议看官方的例子更加详细。–> iic例子

六、LuatOS系统开发与air001

目前air001并没有支持合宙官方的LuatOS嵌入式系统,估计是受限于紧缺的ram以及flash资源。虽然遗憾,但是我想可以使用osal做系统开发。osal是一个基于事件的前后台操作系统(不是异步也不是实时操作系统),把轮询的系统框架伪装成实时系统开发以获得更好的移植性,以及更低的资源消耗,osal一般用于蓝牙开发。值得注意,osal依旧是一个前后台系统。

七、移植osal系统进air001芯片

  • 这个章节我会演示osal系统运行进air001中,但是值得注意的是,arduino硬件平台使用的是前后台代码架构(也可以放弃arduino平台本身的架构转而使用freeRTOS或者RT-thread做内核从而获得实时性,同时还可以继续使用arduino丰富的开发库,但是这样做在我眼中arduino就失去了简易的意义,还不如直接基于rt-thread、freeRtos做开发,这样就能够使用基于其上的编辑、编译开发工具链),而osal也是一个前后台系统,在前后台系统之上再搭一个前后台系统是为了更好的移植性以及可读性,arduino为了简易性考虑只给出两个函数:
    void setup() {}; void loop() {};

绝大多数情况下就这样的架构是很够用的,把功能函数封装,在loop()中循环,但是在某些时候有更高要求的情况不够用。通过牺牲简易性来换取代码架构的简洁与部分可维护性是允许的,毕竟复杂的项目不能期待能够在两个函数体内就搞定。虽然是这样说,但是在arduino上引入osal架构还是一种没什么太大意义的东西,但是讲了嵌入式开发的基本却不讲系统总感觉缺了什么。

  • 下面给出了osal移植进arduino的模板例程
  • 使用osal运行串口例程

移植osal移植搞不定头文件识别的问题。看样子arduino这个ide真的整不出骚活。只能这样了,例程我放在下面,欢迎动手能力强的能把完整的osal移植进arduino里面
例程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能小程序环境配置流程

App 与智能小程序 在用户使用 App 扫描小程序的二维码或者点击设备&#xff0c;尝试进入小程序时&#xff0c;系统会对 App 当前环境与小程序所需运行环境进行比对&#xff0c;确定环境配置兼容后&#xff0c;App 才能启动并运行小程序。 比对规则中&#xff0c;主要涉及&…

Redis分布式系统:集群

"还不如留给花园&#xff0c;多一瞬色彩~" 当我们聊到“集群”这一个词&#xff0c;我们脑中构想出的画面&#xff0c;一定是多台机器&#xff0c;构成的分布式系统&#xff0c;这可以被称为一个“集群”。其实&#xff0c;在前篇的哨兵机制下&#xff0c;奇数个监控…

【算法小记】——机器学习中的概率论和线性代数,附线性回归matlab例程

内容包含笔者个人理解&#xff0c;如果错误欢迎评论私信告诉我 线性回归matlab部分参考了up主DR_CAN博士的课程 机器学习与概率论 在回归拟合数据时&#xff0c;根据拟合对象&#xff0c;可以把分类问题视为一种简答的逻辑回归。在逻辑回归中算法不去拟合一段数据而是判断输入…

git使用指南——以gitlab为例

注册gitlab 自行注册 新建项目 选择新建一个空白的项目 上传项目 clone项目地址到本地 执行完之后&#xff0c;会在目录下生成如下内容&#xff1a;进入里面&#xff0c;选择.git&#xff0c;要上传的内容&#xff08;资料或代码复制到该目录下&#xff09;&#xff1a;…

【MATLAB源码-第123期】基于matlab的SSK(空间位移键控)调制和QSSK(正交空间位移键控)调制误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. SSK&#xff08;空间位移键控&#xff09;&#xff1a; - 基本原理&#xff1a;SSK是一种MIMO&#xff08;多输入多输出&#xff09;系统中的调制技术。它通过选择性地激活不同的发送天线来传输信息。在每个时间槽&…

Nuxt2.x Error页面返回自定义请求状态码

一、问题描述 最近接到一个需求&#xff0c;针对Nuxt2.x的一个项目进行SEO优化&#xff0c;需要对404页面的状态进行修改&#xff0c;将404页面的请求状态码改为301&#xff0c;而不是404&#xff1a; 二、解决方案 1.几种无效尝试 &#xff08;1&#xff09;layouts下的err…

多家头部企业宣布「启动鸿蒙原生应用开发」,你看好鸿蒙系统走向「独立」吗?

我觉得跟着国家对鸿蒙的推进&#xff0c;就知道发展前景肯定是没错的。并且现在已经走向独立道路。 华为鸿蒙是国家主推的操作系统项目&#xff0c;而之前由于美丽国的一系列制裁后。华为也终于崛起&#xff1b;在1月18号的华为鸿蒙仪式中&#xff0c;推出了HarmonyOSNEXT星空…

Java基础 - 09 Set之linkedHashSet , CopyOnWriteArraySet

LinkedHashSet和CopyOnWriteArraySet都是Java集合框架提供的特殊集合类&#xff0c;他们在特定场景下有不同的用途和特点。 LinkedHashSet是Java集合框架中的一种实现类&#xff0c;它继承自HashSet并且保持插入顺序。它使用哈希表来存储元素&#xff0c;并使用链表来维护插入…

Git学习笔记(第3章):Git常用命令

目录 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地库状态 3.4 添加暂存区 3.5 提交本地库 3.6 历史版本 3.7 修改文件 3.8 版本穿梭 小结 命令 作用 git config --global user.name 用户名 设置用户签名 git config --global user.email 邮箱 设置用户签名 …

全国各城市绿地及绿化面积数据,shp/excel格式,2020-2022年

基本信息. 数据名称: 全国各城市绿地及绿化面积数据 数据格式: Shp、excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名称4city_dm城市…

【python】python实现代码雨【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现模…

Linux大老都是怎么记住这么多命令的?

今天给大家带来的是面试/实际工作中经常用到的Linux相关操作命令: 一. vi/vim编辑器 ---->文本编辑器 作用&#xff1a;创建文件&#xff0c;编辑文件&#xff0c;查看文件 格式&#xff1a;vi/vim 文件的名字 解析&#xff1a;如果该文件不存在&#xff0c;vi就会创建该…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【QML COOK】- 012-在QML中使用OpenGL渲染

本文是参照了两个文章编写的。 一是QML的例子&#xff1a;Scene Graph - OpenGL Under QML | Qt Quick 6.6.1 二是关于SceneGraph的介绍&#xff1a;Qt Quick Scene Graph | Qt Quick 6.2.11 这里我提取一下重点方便大家理解。 一个QML程序只能用一种计算机图形接口。不能有…

基于SpringBoot Vue美食网站系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

测试工程师必看!测试用例设计全解析,让你彻底掌握

测试工程师在入行时&#xff0c;都会接触到一个名词——测试用例&#xff0c;都知道测试用例是干什么用的&#xff0c;提到设计测试用例的方法&#xff0c;大部分测试工程师都会侃侃而谈&#xff1a;等价类法、边界值法、判定表法、正交分解法……这些方法说起来都如数家珍&…

揭秘大数据时代的内存数据存储、数据缓存:redis缓存框架!

介绍&#xff1a;Redis 是一个开源的、基于内存的数据存储系统&#xff0c;它也可以持久化数据到硬盘上。Redis 以其高性能、高可靠性和丰富的数据结构支持而著称&#xff0c;在现代应用程序中被广泛用作数据库、缓存和消息中间件。 主要特点&#xff1a; 键值存储&#xff1a;…

Unity工程没有创建.sln文件,导致打开C#文件无法打开解决方案

最近又开始折腾些Unity的小项目&#xff0c;重新遇到一些常见的小问题 点击报错文件 却没有打开文件 于是查看了下打开Window->Package Manager 选择Unity Registry 搜索Visual Studio Editor&#xff0c;发现并没有安装 同理&#xff0c;也可以安装VSCode的插件 问题解决了…

.NET集成IdGenerator生成分布式全局唯一ID

前言 生成分布式唯一ID的方式有很多种如常见的有UUID、Snowflake&#xff08;雪花算法&#xff09;、数据库自增ID、Redis等等&#xff0c;今天我们来讲讲.NET集成IdGenerator生成分布式全局唯一ID。 分布式ID是什么&#xff1f; 分布式ID是一种在分布式系统中生成唯一标识符…

实用的SQLite数据库可视化管理工具推荐

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。今天推荐7款实用的SQLite数据库可视化管理工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个…