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

news2024/9/23 9:23:07

一、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,通道7

  Serial.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 = 4
  analogWriteFrequency(12000000);//12Mhz
  analogWrite(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.coloradmin.cn/o/1397982.html

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

相关文章

蓝桥杯-最少刷题数

&#x1f4d1;前言 本文主要是【算法】——最少刷题数的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

微前端-无界wujie

无界微前端方案基于 webcomponent 容器 iframe 沙箱&#xff0c;能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户的核心诉求。 主项目安装无界 vue2项目&#xff1a;npm i wujie-vue2 -S vue3项目…

从零开始配置vim(Windows版)

事情是这样的&#xff0c;之前linux下vim用习惯了...然后就给自己win下vscode也装了个vim插件&#xff0c;用下来还是感觉不顺手&#xff0c;并且处理太多文本时有明显卡顿&#xff0c;于是乎自己配了下win版的vim。 不过好像也并不是从零开始的...初始基础版的.vimrc有copy他们…

【正点原子STM32连载】 第四十五章 内存管理实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四…

近期学习文章

DNSlog在渗透测试中的实战技巧 - 网安隐藏源IP&#xff0c;提高溯源难度的几种方案 - 网安FreeBuf网络安全行业门户 【漏洞公告】某平台一个有意思的CSRF // SecTrain安全博客 浅谈Web源码泄漏-安全客 - 安全资讯平台 红队-C2 Server基础构建 - 先知社区FreeBuf网络安全行业…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName&#xff0c;Value}&#xff0c;其中 VarName 是 变量和 Value 其值。 例: {VarName&#xff0c;Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

C语言第三弹---数据类型和变量

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 数据类型和变量 1、数据类型介绍1.1、整型1.2、浮点型1.3、字符型1.4、布尔类型1.5、各种数据类型的长度1.5.1、sizeof操作符1.5.2、数据类型的长度1.5.3、sizeo…

无/自监督去噪(1)——一个变迁:N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络&#xff08;BSNs&#xff0c;Blind Spot Networks&#xff09;开创者3.1. N2V实际是如何训练的&#xff1f; 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

旅游项目day08

1. 旅游日记&#xff08;游记&#xff09; 后端&#xff1a;实体类&#xff0c;列表&#xff0c;查看&#xff0c;审核 前端&#xff1a;目的地明细中-游记->带范围条件查询&#xff0c;游记首页&#xff0c;【扩展】游记添加/编辑&#xff0c;【扩展】添加游记时间没登录时…

计算机安全学习笔记(V):UDP和网络扫描

User Datagram Protocol (UDP) UDP是最简单的传输协议。多个程序&#xff08;服务&#xff09;可以在主机上侦听&#xff0c;因此操作系统需要知道将流量发送到哪个程序。 在传输协议中&#xff0c;每个程序都与源和目标处的端口相关联&#xff0c;该端口显示为程序的套接字。…

Java入门——开发环境、入门程序(搭建Java开发环境、安装JDK 验证、JDK、编写代码、编译代码、运行代码)

目录 前言 搭建Java开发环境 获取JDK 安装JDK 验证JDK DOS窗口常用命令 入门程序 编写代码 编译代码、运行代码 前言 Java是美国sun公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。Java早期称为Oak(橡树)&#xf…

python里的神奇bug

都知道python里列表必须用逗号分隔开 我再给大家看个神奇的东西 import numpy as npb np.array([2, 1, 2 ,1 ,-1 ,2]); print(b) print(b.shape)b np.array([2, 1, 2 ,1 -1 ,2]); print(b) print(b.shape)结果如下 注意我下面的一个是没有逗号的&#xff0c;而且1和-1之间是…

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开…

Jvm相关知识(面试高级必备)

类的实例化顺序 先静态、先父后子 先静态&#xff1a;父静态>子静态 优先级&#xff1a;父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程&#xff1a; ①&#xff0e;父类的static代码块&#xff0c;当前类的static; ②&#xff0e;顺序执行…

python实操之网络爬虫介绍

一、什么是网络爬虫 网络爬虫&#xff0c;也可以叫做网络数据采集更容易理解。它是指通过编程向网络服务器&#xff08;web&#xff09;请求数据&#xff08;HTML表单&#xff09;&#xff0c;然后解析HTML&#xff0c;提取出自己想要的数据。 它包括了根据url获取HTML数据、解…

安捷伦E8362C网络分析仪40GHz

安捷伦E8362C网络分析仪 E8362C 是 Agilent 的 40 GHz 网络分析仪。网络分析仪是一种功能强大的仪器&#xff0c;可以以无与伦比的精度测量射频设备的线性特性。许多行业使用网络分析仪来测试设备、测量材料和监控信号的完整性。 附加功能&#xff1a; 10 MHz 至 20 GHz 123 d…

java-IO

JAVA IO - java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作. - java将IO按照方向划分为输入与输出,参照点是我们写的程序. - 输入:用来读取数据的,是从外界到程序的方向,用于获取数据. - 输出:用来写出数据的,是从程序到外界的方向,用于发送数据. java将…

Dubbo源码解析第一期:如何使用Netty4构建RPC

一、背景 早期学习和使用Dubbo的时候&#xff08;那时候Dubbo还没成为Apache顶级项目&#xff09;&#xff0c;写过一些源码解读&#xff0c;但随着Dubbo发生了翻天覆地的变化&#xff0c;那些文章早已过时&#xff0c;所以现在计划针对最新的Apache Dubbo源码来进行“阅读理解…

关于eNSP中主机/PC与USG网络不可达的解决方案

check points&#xff1a;主机防火墙、网段、接口配置、ping权限、接口安全域&#xff1b; 1、主机 确认当前在联网络的属性&#xff08;专用网络/公共网络&#xff09;&#xff0c;本机防火墙有无放通&#xff1b;检查 eNSP内防火墙 接口配置&#xff1a;IP地址是否配置到了正…

浅谈AcrelEMS-CIA机场智慧能源管平台解决方案-安科瑞 蒋静

1 概述 机场智慧能源管平台解决方案对机场范围内变电站内的高低压配电设备 、 发电机、变压器 、UPS、EPS 、广场照明 、 室内照明 、通风及排水等机电设备进行实时分布式监控和集中管理 , 实现无人值守 , 确保高速公路安全畅通 , 提高 自动化管理水平 , 降低机电设备的运行维…