@hctdqz 我也是苦于lv2啊
Tristan_C 发布的最佳帖子
-
【飞凌 OK113i-C 全志T113-i开发板】3.开发环境准备和搭建
3.开发环境准备和搭建
这次就来准备搭建一下T113i的开发环境,其实对于初入门的Linux开发者而言,开发环境的搭建真的也是一大课题,有时候甚至要耗费相当多的时间搭建环境,配置环境,配置工具等等。因此这部分是否能方便快捷,至少能顺利搭建也成了一大关键。而我也算是作为初入门的Linux开发者,本次也难免要经历这个过程。
Linux的开发环境一般使用Linux机器进行开发编译等工作,这个Linux机器可以是实体机,也可以是虚拟机,飞凌官方已经将虚拟机和整个开发环境,包括需要用到的一些工具等都打包起来了,很方便。但现在Windows已经支持WSL,之前熟悉其它Linux芯片开发的时候也尝试过,也是非常方便,不用额外再增加安装虚拟机了,因此这次也打算尝试一下。本机已经安装了如下的Ubuntu-20.04版本
下面先登录该WSL,然后在Home文件夹下新建forlinx文件夹
然后将源码拷贝如该文件夹
此后进行MD5校验,并于上述文件夹中的sdk_md5sum.txt原始MD5进行对比
没问题就可以进行解压了
解压完成
解压完成可以看到如下文件信息
进行sdk配置
开始内核全编译
提示了这个错误
这个可能是包没有安装好
还是不行,按照提示安装另一个
然后接着编译
然后开始打包
提示最终打包成功,并在out文件中生成img镜像文件
从宿主机的文件资源管理器中也能看到最新生成的镜像文件
由此编译打包成功。
还可以尝试编译一下内核
这里也能看到其编译使用的工具链情况
toolchain_archivedir=/home/forlinx/OK113i-linux-sdk/build/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz
编译成功
编译完会在/home/forlinx/OK113i-linux-sdk/out/t113_i/OK113i/longan/路径下生成 boot.img
boot.img 可用于在线单独更新内核,用户需将其从虚拟机中拷贝到 OK113i 板卡/home 路径下,之后执行:dd if=/home/boot.img of=/dev/mmcblk0p4 conv=fsync
完成之后,重启板卡,即替换内核
注意单独编译内核只针对内核源码进行编译,影响驱动,适用于仅修改内核时进行编译执行./build.sh clean可以清除所有中间文件。但不影响源文件,包括已经有改动的源文件。
总结:看起来sdk在解包出来之后,整个编译的过程还是非常的顺利的,这个也得益于sdk的设计和打包。
-
【XR806开发板试用】+ 开箱及环境搭建
开箱及开发环境准备
一、开箱
很感谢极术和全志给与评测的机会,对于初学者来讲能有机会体验也是很幸运。收到第一时间开箱,实物如下。评估版采用成品模块+测试底板的方式,其中,模块采用XR806AF2L,采用QFN32封装芯片,使用PCB天线,做成模块也非常适合直接商用。模块板载一颗高频40MHz晶振,未使用32KHz低频晶振,应该是使用了内部的RC。模块上的器件比绍,集成度还是非常高的,模块体积尺寸看起来还可以做得更小。
底板则除了XR806之外,包含供电系统,并增加了USB接口,接了一片CP2102做USB转串口。外接两颗按钮和一颗LED,并将空闲管脚引出
作为评估版,基本功能已经够用。
下面看下主芯片XR806
这是21变全志发布的芯片,是一款基于安谋科技的STAR-MC1处理器来研发设计的支持WiFi和BLE的高集成度无线MCU,目前已经支持鸿蒙系统和Free RTOS系统。
下图为其芯片内部框图
芯片最高主频可达160MHz,内置SIP 288KB SRAM,SIP 160KB Code ROM,以及2MB的XIP Flash
二、开发环境准备
下面来准备一下开发环境
产品目前支持Linux环境开发,因此我也选择改方式,当然也是我第一次尝试Linux环境的arm开发。工具采用如下组合:
Win11 + WSL2 + gcc-arm+VSC
其中win11和WSL2的安装不做记录了,按照win11的操作在应用商店即可。下面记录gcc-arm和xr806的sdk安装。注意:以下操作有可能需要sudo权限,记录中不一定完全体现
1.源码sdk
下载和解压安装,使用如下命令下载:
wget https://bbs.aw-ol.com/assets/uploads/files/1693988430633-xr806_sdk.tar.gz
然后解压:
tar xvf 1693988430633-xr806_sdk.tar.gz
2.gcc-arm
下载gcc-arm工具链
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
同样是压缩文件需要解压,可以把压缩包放置到用户文件下的tools
tar xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C ~/tools/
如果没有tools,可能得创建mkdir一下
3.更改gcc.mk中的gcc-arm的路径
代码编译前需要在“gcc.mk”中设置正确的GCC 交叉编译工具链路径,进入sdk安装路径
并使用vim打开gcc.mk,然后将CC_DIR更改为如下路径
4.应用开发示例
接下来就可以使用代码编译和镜像创建了,以 hello_demo 工程为例复制默认配置文件到顶层目录(不切换工程可不要此步骤)
$ cp project/demo/hello_demo/gcc/defconfig .config
检查SDK 基础配置,如工程名、芯片型号、高频晶振、板级配置是否正确
$ make menuconfig
清理,切换工程时需要
$ make build_clean
编译代码并生成镜像文件,生成的镜像文件为“out/xr_system.img”
$ make build(建议使用make build -j 加速编译),编译通过如下
在sdk安装文件夹下,有一个out文件夹,生成的镜像目标文件就在此处,可以查看生成的相关文件。
然后我们就可以进行程序烧写,将开发板通过USB接到PC,并打开phoenixMC.exe,找到对应的镜像文件,并选择正确的端口号,点击右上角的升级固件即可开始下载。
下载成功之后,在PC端打开串口调试助手,选择正确的COM号和波特率,即可看到hello word例程打印的如下信息了。
需要注意的是,如果在下载的过程中提示如下错误
可以通过重新安装CP2102的最新版本驱动,连接如下:
https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip下面来增加VSC的支持
VSC的按爪个不赘述了,按照安装
然后在扩展插件中搜索WSL,并安装
安装完成就可以点击左下角
或者Ctrl+Shift+p
点击连接到WSL了
然后在终端中,cd进入到sdk所在路径
输入code . 即可打开sdk文件夹了
至此环境搭建完成。
-
【XR806开发板试用】+ 通过网络控制led并上报按键状态
通过网络控制led并上报按键状态
本次做一个手机通过mqtt服务器控制板子上的LED亮灭,板子也可以将按钮状态变化通过mqtt服务器上报给手机的功能
硬件上,从原理图看,LED接到了PA21,高电平点亮。
按键则时接到了PA11,并接了一个上拉电阻。
因此,设计上就可以通过按键上升沿中断,作为按键按下一次的事件,然后本地取反一次LED灯,并publish灯的状态给手机端,同时,会subscribe订阅灯的状态,接收手机端publish过来的LED控制数据。而手机端则可以publish控制数据,其中0作为关灯,发送1作为开灯,同时也subscribe订阅板子publish上来的LED状态数据。
Mqtt的服务器使用自行搭建的emqx broker
下面就开始整代码。首先拷贝mqtt demo代码默认配置
cp project/demo/hello_demo/gcc/defconfig .config
然后先make build_clean将之前的代码清掉
然后使用vim打开mqtt的main.c代码先定义LED和key的io引脚
再进行引脚的初始化,初始化中进行了LED亮灭2次闪烁,表示初始化成功。定义按键引脚为上升沿中断,中断中取反LED的亮灭状态,并更新led_state的值。
然后在main函数中调用初始化。
下面进行mqtt服务器相关参数的配置,如下,这里定义了两个topic,分别是MQTT_DEMO_TOPIC和MQTT_DEMO_PUB_TOPIC,前者订阅LED的状态,以控制LED的亮灭,后者则可上报按钮状态。HOST_NAME为mqtt服务器主机的ip地址或者域名
初始化 mqtt
Mqtt连接
订阅以及订阅的消息回调,其中在消息回调中,判断接收到的消息是字符0还是字符1,并进行响应的LED亮灭操作。
发布则是进行对应主题的发布操作
接下去就是mqtt主处理功能函数,其中主要是维持mqtt连接,并根据本地的按键控制的LED状态是否改变,决定是否publish上报改状态
最后就是主函数初始化硬件、功能和网络,并启动mqtt主进程了。
编译,下载运行
使用mobaxterm打开端口终端,可以看到如下打印信息
Wlan的wifi ssid和password是通过命令行command line的方式进行配置的
我们需要使用的主要是上面的三条,分别是
配置ssid:net ap set ssid ssid_example
配置password:net ap set psk psk_example
使能启动连接:net ap enable
连接wifi并成功连接mqtt服务器
此时mqtt broker服务器上也就能看到开发板设备连接上了
打开手机的MQTTool工具app(iPhone)
点击connect
就可以在emqx上看到对应的手机设备连接了
App切换到subscribe选项卡,输入 KEY/STATE 订阅主题,并点击Subscribe订阅该主题
轻按开发板上的按钮,可以看到板载的LED亮灭切换
同时串口终端中输出对应的信息
而在手机端的app上,切换到subscr选项卡,就可以看到每按一次按键,开发板publish发不上来的消息了
再切换到Publish选项卡,输入 LED/STATE 内容作为publish发布的主题
此时在Message框中输入1,并点击publish,就可以看到灯亮起
而输入0并点击publish发布,则看到灯灭
同时,开发板在收到上述的两次publish主题消息之后,还会在串口终端上打印如下内容。
在emqx上可以看到完整的主题
以及订阅方了
至此,小制作实现了LED和按钮的功能,并通过mqtt,实现手机与板子之间的状态上报和控制信息下行。
Tristan_C 发布的最新帖子
-
【飞凌 OK113i-C 全志T113-i开发板】5.GPIO的控制
我的第一个控制:LED点亮
前面搭建完了开发环境了,下面可以尝试别的简单方法,跑一下板载的外部资源,控制一个LED亮灭(通常称电灯实验)是一个比较常见的板载资源测试功能之一。下面来尝试一下控制板子上的下面这颗用户的LED灯。
从图中可以看出,D1这颗LED灯接在了PG11引脚上,通过R1电阻接到VCC电源进行限流,并使用CQA34N00这颗N沟道MOS管进行控制,而控制引脚PG11接了2K的电阻进行上拉。给出厂的板子上电,这颗LED保持常亮。
下面通过文件操作的方法控制一下这个LED灯
首先进行一下引脚编号的计算。
根据 #define PIN_NO(port, line) (((port) - 'A') * 0x20 + (line))进行计算
其中 port 为 gpio 端口,line 为该 gpio 对应引脚,((port)-'A')代表 ASCII 码相减。
如这颗LED的引脚 PG11对应的 pin 引脚编号为IN_NO('G',11)=(0x47-0x41)*0x20+11=(71-65)*32+11=107。
也就是说,这颗LED的引脚实际使用编号就为203.
然后登录一下板子的系统,通过如下命令查看文件GPIO,同时也进入到GPIO文件夹中,方便后续测试操作。
可以看到已经有了export和unexport
接下去使用
Echo 203 > /sys/class/gpio/export
进行引脚导出命令,就能看到多出了gpio203文件夹
进入gpio203文件夹,看看内含文件
其中,direction为gpio的输入输出方向配置,value则为输入输出的值了。可以配置前者为输出,后者为1和0分别控制led的亮和灭了。
使用
echo "out" > /sys/class/gpio/gpio203/direction
将引脚的方向设置为输出,并使用
cat /sys/class/gpio/gpio203/direction
查看上面的设置输出是否成功正确。
这时候板载的这颗LED状态就熄灭了,因为默认的value值从哪读取来看应该为0
接下去就可以通过写value文件的内容为1和0,分别控制LED灯的亮和灭了。
设备树那边也定义了一个T113-i核心板上的板载LED,这颗LED默认也就是作为Linux核心板的“心跳”功能使用的。
在sys/class下面
可以发现有一个heartbeat的文件夹,并可以发现其里面的如下的文件
其中控制brightness文件内容即可控制这颗LED的亮灭状态了,也就是写1和0分别就可以控制其亮和灭的状态。
还可以从板子设备树的具体文件夹具体文件中的leds中找到对应的引脚定义,可以暗道使用引脚就是PG16,GPIO_ACTIVE_HIGH指定了其点亮的电平为高电平。
以上就是通过设备树中的gpio和leds来控制核心板和底板上的led的亮灭状态功能了。
确认可执行文件的权限并更新
然后通过sftp,传给开发板的home/my_test路径下,并通过ls命令确认
执行,输入对应的引脚编号就可以看到翻转三次了
其主要实现代码为
输入引脚编号
Export引脚到文件
设置方向为out
翻转三次
最后还需要unexport
-
【飞凌 OK113i-C 全志T113-i开发板】4.WiFi和以太网络的使用
WiFi和以太网络的使用
飞凌这块t113-t开发板,板载了一块WiFi+蓝牙的模块,以及千兆一台网络,出厂已经支持了WiFi驱动,且在之前的实验中已经打开了wifi模块的功能,并手动扫描链接了AP热点,这次我们就来通过配置文件的方式,让开发板上电自动链接指定的AP热点,这样就不用每次还要使用串口进行登录了。
确认wpa_supplicant的支持
开启
配置wifi
更改配置
保存之后确认配置
udhcpc -i wlan0启动链接,之后ping一下路由器,说明网络链接通了
另外,板子上面配置了一个千兆的 一台网口,通过ifconfig可以找到其设备为eth0。
使用vim打开下面的文件,更改箭头所指的ip和网关地址为路由器地址。
改成如下值
通过cat文件内容确认
执行 ip addr flush dev eth0,然后ifdown -a和ifup -a指令重新启停配置,配置文件才能生效。
Ifconfig确认ip配置
然后就可以成功ping路由器
在路由器上面也能看到该设备的信息
这时候使用Mobaxterm就可以链接上开发板
默认登录名为root
另外,还可以使用sftp服务,而Mobaxterm已经集成了该服务工具,传输文件非常方便
OK113i-S 开发板预装了 lighttpdweb 服务器,并且系统启动时已经自动启动了 lighttpd 服务,在浏览器中输入开发板的 IP 地址即可浏览开发板 webserver 中的网页 -
【飞凌 OK113i-C 全志T113-i开发板】3.开发环境准备和搭建
3.开发环境准备和搭建
这次就来准备搭建一下T113i的开发环境,其实对于初入门的Linux开发者而言,开发环境的搭建真的也是一大课题,有时候甚至要耗费相当多的时间搭建环境,配置环境,配置工具等等。因此这部分是否能方便快捷,至少能顺利搭建也成了一大关键。而我也算是作为初入门的Linux开发者,本次也难免要经历这个过程。
Linux的开发环境一般使用Linux机器进行开发编译等工作,这个Linux机器可以是实体机,也可以是虚拟机,飞凌官方已经将虚拟机和整个开发环境,包括需要用到的一些工具等都打包起来了,很方便。但现在Windows已经支持WSL,之前熟悉其它Linux芯片开发的时候也尝试过,也是非常方便,不用额外再增加安装虚拟机了,因此这次也打算尝试一下。本机已经安装了如下的Ubuntu-20.04版本
下面先登录该WSL,然后在Home文件夹下新建forlinx文件夹
然后将源码拷贝如该文件夹
此后进行MD5校验,并于上述文件夹中的sdk_md5sum.txt原始MD5进行对比
没问题就可以进行解压了
解压完成
解压完成可以看到如下文件信息
进行sdk配置
开始内核全编译
提示了这个错误
这个可能是包没有安装好
还是不行,按照提示安装另一个
然后接着编译
然后开始打包
提示最终打包成功,并在out文件中生成img镜像文件
从宿主机的文件资源管理器中也能看到最新生成的镜像文件
由此编译打包成功。
还可以尝试编译一下内核
这里也能看到其编译使用的工具链情况
toolchain_archivedir=/home/forlinx/OK113i-linux-sdk/build/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz
编译成功
编译完会在/home/forlinx/OK113i-linux-sdk/out/t113_i/OK113i/longan/路径下生成 boot.img
boot.img 可用于在线单独更新内核,用户需将其从虚拟机中拷贝到 OK113i 板卡/home 路径下,之后执行:dd if=/home/boot.img of=/dev/mmcblk0p4 conv=fsync
完成之后,重启板卡,即替换内核
注意单独编译内核只针对内核源码进行编译,影响驱动,适用于仅修改内核时进行编译执行./build.sh clean可以清除所有中间文件。但不影响源文件,包括已经有改动的源文件。
总结:看起来sdk在解包出来之后,整个编译的过程还是非常的顺利的,这个也得益于sdk的设计和打包。
-
【飞凌 OK113i-C 全志T113-i开发板】2.一些有用的常用的命令测试
一些有用的常用的命令测试
一、系统信息查询
可以查询板子的内核信息、CPU处理器信息、环境变量等
二、CPU频率
从上面的系统信息查询到,这是一颗具有两个ARMv7结构A7内核的处理器,主频最高1.2GHz
可以通过命令查看当前支持的频率以及目前所使用主频
还可以通过命令更改所使用的频率
三、内部温度的测试
这个测试主要是针对芯片内部的温度传感器,一般可以用于芯片内部的一些温度监控等。输入命令之后,可以看到,当前室温下,芯片温度达到了30度左右。
四、执行DDR的带宽测试
五、板载RTC测试
开发板上带了一颗RTC芯片,PCF8563,I2C接口,并带有一颗备用电池,给RTC芯片用,掉电时可以保持时间走时,开发板在发货时已经附送了一颗CR2032纽扣电池
可以通过如下指令读取当前RTC的时间
通过date -s命令设置时间,并使用hwclock -u -w将时间同步给RTC芯片
然后再通过hwclock -u -r可以看到时间已经在更新走时,若断电再重新上电也是最新的时间了。
六、按键测试
底板上有 8 个按键,其中侧边有 5 个按键
VOL+、VOL-、MENU、ENTER、HOME 的测试,键码
分别为 115、114、139、28、172,分别对应 PCB 丝印 K3、K4、K5、K6、K7;另外,丝印 K1 对应一个用户按键,键码为 148。K2 为 reset 按键,K3 为 FEL 按键,用于烧录程序
可以使用fltest_keytest进行板载按键的测试,按键的按下和释放
七、核心板载LED控制
核心板上有一颗LED接到了T113i的GPIO上
可以通过命令方式进行控制
首先可以使用cat /sys/class/leds/heartbeat/trigger查看当前的出发方式,可以看到出厂默认的是heart心跳出发的方式,也就是利用时钟进行一定 频率的闪烁
通过
echo none > /sys/class/leds/heartbeat/trigger
可以将其停止心跳模式,然后通过
echo 1 > /sys/class/leds/heartbeat/brightness
和
echo 0 > /sys/class/leds/heartbeat/brightness
分别手动控制其亮和灭了。也就是向文件写入1亮起,写入0熄灭,或者写入下面的heart则进入心跳模式。
再用echo heartbeat > /sys/class/leds/heartbeat/trigger又可以恢复心跳状态。
这次主要是利用官方的文档,使用命令行的方式,进行板载的一些资源和常用命令的测试,作为一个放入们的使用者而言,通过这个方式来熟悉硬件,熟悉系统,熟悉开发的资源还是有非常大的帮助的,飞凌也在开发板的资料中,提供了飞航丰富的相关测试命令,结合丰富的板载资源,可以很方便进行熟悉测试和使用。测试没有完全做完,后面将搭建具体的开发环境,并使用代码测试相关的功能。
-
【飞凌 OK113i-C 全志T113-i开发板】1.开箱
【飞凌 OK113i-C 全志T113-i开发板】1.开箱
首先还是真心感谢飞凌嵌入式,能给予这次测评的机会,作为一个Linux涉足未深的入门者来说,申请通过的时候还是非常惊喜,因为从开始申请就在期待。说起来收到有些天了,但一直忙于工作,没来得及拿起这块板子,今天得空拿出来开始用了。说实话,一眼看到包装,没看到现在各种开发板华丽的外壳,但却感受到沉甸甸的分量,给我的感觉是,这个体积,这个分量它总不会差!
打开之后
拆开静电袋包装,板子的真面目终于见到了。板子的做工还是非常好,接口可以说很丰富了,布局也相对合理。
可以看得出来,这块开发板的设计还是非常用心的,采用核心板+底板的结构形式,基于全志T113-i处理器设计开发,处理器为ARM Cortex-A7, RISCV, HiFi4 DSP多核异构架构,主频1.2GHz,核心板有两种规格,分别是512MB DDR3L内存加8GB eMMC版本和256MB DDR3L内存加256MB SPI Nand版本,这次使用的是后者。OK113i-S开发板将核心板的功能接口资源丰富、提供多种外设接口,如网卡、CPU内置音频Codec、ADC、TF Card、LVDS、RGB、WIFI、4G等功能接口,非常丰富。非常适合嵌入式Linux的控制类,音视频类、网关等应用。
其实最令我欣喜的是板子上面直接预留了USB转串口的电路,这样只需要标准的USB线就可以使用串口连接,而省去翻找带USB转串口功能的模块的麻烦,这点要大大点赞。
而作为开发板,飞凌官方则提供了相当丰富的资源,包括网卡驱动、LCD、4G网络、USB摄像头、SD卡,以及常用的UART、SPI、PWM等等外设。
尝试使用电源给板子上电之后,各指示灯陆续亮起
使用Type-C线连接电脑和开发板之后,就可以在电脑的设备管理器中看到对应设备的端口了。
此时打开mobaxterm,新建session,选择Serial方式
指定前面设备管理器中发现的串口号,并选择串口配置如下
串口设置:波特率 115200、数据位 8、停止位 1、无校验位、无流控制。
点击ok创建连接,登录时,串口终端登陆为 root 用户,无密码。
输入ls和ls -l,即可看到如下信息了
接下来还可以使用CoreMark 测试A7内核的性能。首先可以使用
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
指定T113i为高性能模式,然后使用coremark命令开始测试,最后输出如下
这样板子就开始跑通了。接下去就可以好好体验一把具体的开发。
-
有没有大神帮忙看看xr806的http的get接口获取数较大的适合会容易出现下面问题
有没有大神帮忙看看,附件的代码,在执行之后,会出现获取的内容后半段是乱码的情况
试用xr806芯片,开发板,采用example里面的httpc例程,适当修改如下,主要功能就是通过天气接口,获取天气json数据,然后调用cjson接口解析/* * Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * 3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include "kernel/os/os.h" #include "common/framework/platform_init.h" #include "net/wlan/wlan.h" #include "common/framework/net_ctrl.h" #include "net/HTTPClient/HTTPCUsr_api.h" #include "mbedtls/mbedtls.h" #include "cjson/cJSON.h" #define DEMO_TEST_FUNC_TIME 1 #define DEMO_TEST_FUNC_WEATHER 2 #define DEMO_TEST_FUNC DEMO_TEST_FUNC_WEATHER #define HTTPC_DEMO_THREAD_STACK_SIZE (16 * 1024) /* ssl need more stack */ static OS_Thread_t httpc_demo_thread; #if (DEMO_TEST_FUNC == DEMO_TEST_FUNC_WEATHER) # define HTTPC_DEMO_URL "http://t.weather.sojson.com/api/weather/city/101210101" #else # define HTTPC_DEMO_URL "http://quan.suning.com/getSysTime.do" #endif static HTTPParameters httpc_demo_param; char httpc_demo_buf[8192] = {0}; static void httpc_demo_download(char *url, int use_ssl) { uint32_t download_len = 0; INT32 recv_len = 0; int32_t ret; uint32_t download_time = 0; memset(&httpc_demo_param, 0, sizeof(httpc_demo_param)); memcpy(httpc_demo_param.Uri, url, strlen(url)); httpc_demo_param.nTimeout = 30; //timeout 30s for every get download_time = OS_GetTicks(); memset(httpc_demo_buf, 0, sizeof(httpc_demo_buf)); while (1) { ret = HTTPC_get(&httpc_demo_param, httpc_demo_buf, sizeof(httpc_demo_buf), &recv_len); if (ret != HTTP_CLIENT_SUCCESS) { break; } download_len += recv_len; printf("%.*s", sizeof(httpc_demo_buf), httpc_demo_buf); printf("\n\nhttp get return value: %d, len=%u\n\n", ret, download_len); } if (ret == HTTP_CLIENT_EOS) { download_time = OS_GetTicks() - download_time; printf("\n\n\ndownload complete, download_len %d, time %ds\n\n\n", download_len, download_time/1000); cJSON* cjson = cJSON_Parse(httpc_demo_buf);//将JSON字符串转换成JSON结构体 if(cjson == NULL) //判断转换是否成功 { printf("cjson error...\n\n"); } else { printf("%s\n\n",cJSON_Print(cjson));//打包成功调用cJSON_Print打印输出 #if (DEMO_TEST_FUNC == DEMO_TEST_FUNC_WEATHER) char * city = cJSON_GetObjectItem(cjson,"city")->valuestring; char * temp = cJSON_GetObjectItem(cjson,"wendu")->valuestring; char * humi = cJSON_GetObjectItem(cjson,"shidu")->valuestring; printf("城市: %s\n",city); printf("温度:%s\n",temp); printf("湿度:%s\n",humi); #else char * time_1 = cJSON_GetObjectItem(cjson,"sysTime1")->valuestring; char * time_2 = cJSON_GetObjectItem(cjson,"sysTime2")->valuestring; printf("time_1: %s\n\n",time_1); printf("time_2: %s\n\n",time_2); #endif } } else { printf("\n\ndownload error, ret=%d\n", ret); } } static void httpc_demo_fun(void *arg) { while(1) { httpc_demo_download(HTTPC_DEMO_URL, 0); OS_MSleep(5000); } OS_ThreadDelete(&httpc_demo_thread); } static void net_cb(uint32_t event, uint32_t data, void *arg) { uint16_t type = EVENT_SUBTYPE(event); switch (type) { case NET_CTRL_MSG_NETWORK_UP: if (!OS_ThreadIsValid(&httpc_demo_thread)) { OS_ThreadCreate(&httpc_demo_thread, "httpc_demo_thread", httpc_demo_fun, (void *)NULL, OS_THREAD_PRIO_APP, HTTPC_DEMO_THREAD_STACK_SIZE); } break; case NET_CTRL_MSG_NETWORK_DOWN: break; default: break; } } int main(void) { observer_base *net_ob; platform_init(); printf("httpc demo start\n\n"); printf("use these commands to connect ap:\n\n"); printf("1. config ssid and password : net sta config ssid password\n"); printf("2. enable sta to connect ap : net sta enable\n\n"); /* create an observer to monitor the net work state */ net_ob = sys_callback_observer_create(CTRL_MSG_TYPE_NETWORK, NET_CTRL_MSG_ALL, net_cb, NULL); if (net_ob == NULL) return -1; if (sys_ctrl_attach(net_ob) != 0) return -1; return 0; }
配网之后,拉取http数据,出现了后半段乱码的情形
判了一小段时间更是出现了heap问题
但我看这个heap已经开到了200多KB了,应该不至于这么快出现问题
请大神们帮忙把把关,把把脉,感激不尽!
-
【XR806开发板试用】+ 通过网络控制led并上报按键状态
通过网络控制led并上报按键状态
本次做一个手机通过mqtt服务器控制板子上的LED亮灭,板子也可以将按钮状态变化通过mqtt服务器上报给手机的功能
硬件上,从原理图看,LED接到了PA21,高电平点亮。
按键则时接到了PA11,并接了一个上拉电阻。
因此,设计上就可以通过按键上升沿中断,作为按键按下一次的事件,然后本地取反一次LED灯,并publish灯的状态给手机端,同时,会subscribe订阅灯的状态,接收手机端publish过来的LED控制数据。而手机端则可以publish控制数据,其中0作为关灯,发送1作为开灯,同时也subscribe订阅板子publish上来的LED状态数据。
Mqtt的服务器使用自行搭建的emqx broker
下面就开始整代码。首先拷贝mqtt demo代码默认配置
cp project/demo/hello_demo/gcc/defconfig .config
然后先make build_clean将之前的代码清掉
然后使用vim打开mqtt的main.c代码先定义LED和key的io引脚
再进行引脚的初始化,初始化中进行了LED亮灭2次闪烁,表示初始化成功。定义按键引脚为上升沿中断,中断中取反LED的亮灭状态,并更新led_state的值。
然后在main函数中调用初始化。
下面进行mqtt服务器相关参数的配置,如下,这里定义了两个topic,分别是MQTT_DEMO_TOPIC和MQTT_DEMO_PUB_TOPIC,前者订阅LED的状态,以控制LED的亮灭,后者则可上报按钮状态。HOST_NAME为mqtt服务器主机的ip地址或者域名
初始化 mqtt
Mqtt连接
订阅以及订阅的消息回调,其中在消息回调中,判断接收到的消息是字符0还是字符1,并进行响应的LED亮灭操作。
发布则是进行对应主题的发布操作
接下去就是mqtt主处理功能函数,其中主要是维持mqtt连接,并根据本地的按键控制的LED状态是否改变,决定是否publish上报改状态
最后就是主函数初始化硬件、功能和网络,并启动mqtt主进程了。
编译,下载运行
使用mobaxterm打开端口终端,可以看到如下打印信息
Wlan的wifi ssid和password是通过命令行command line的方式进行配置的
我们需要使用的主要是上面的三条,分别是
配置ssid:net ap set ssid ssid_example
配置password:net ap set psk psk_example
使能启动连接:net ap enable
连接wifi并成功连接mqtt服务器
此时mqtt broker服务器上也就能看到开发板设备连接上了
打开手机的MQTTool工具app(iPhone)
点击connect
就可以在emqx上看到对应的手机设备连接了
App切换到subscribe选项卡,输入 KEY/STATE 订阅主题,并点击Subscribe订阅该主题
轻按开发板上的按钮,可以看到板载的LED亮灭切换
同时串口终端中输出对应的信息
而在手机端的app上,切换到subscr选项卡,就可以看到每按一次按键,开发板publish发不上来的消息了
再切换到Publish选项卡,输入 LED/STATE 内容作为publish发布的主题
此时在Message框中输入1,并点击publish,就可以看到灯亮起
而输入0并点击publish发布,则看到灯灭
同时,开发板在收到上述的两次publish主题消息之后,还会在串口终端上打印如下内容。
在emqx上可以看到完整的主题
以及订阅方了
至此,小制作实现了LED和按钮的功能,并通过mqtt,实现手机与板子之间的状态上报和控制信息下行。
-
【XR806开发板试用】+ 开箱及环境搭建
开箱及开发环境准备
一、开箱
很感谢极术和全志给与评测的机会,对于初学者来讲能有机会体验也是很幸运。收到第一时间开箱,实物如下。评估版采用成品模块+测试底板的方式,其中,模块采用XR806AF2L,采用QFN32封装芯片,使用PCB天线,做成模块也非常适合直接商用。模块板载一颗高频40MHz晶振,未使用32KHz低频晶振,应该是使用了内部的RC。模块上的器件比绍,集成度还是非常高的,模块体积尺寸看起来还可以做得更小。
底板则除了XR806之外,包含供电系统,并增加了USB接口,接了一片CP2102做USB转串口。外接两颗按钮和一颗LED,并将空闲管脚引出
作为评估版,基本功能已经够用。
下面看下主芯片XR806
这是21变全志发布的芯片,是一款基于安谋科技的STAR-MC1处理器来研发设计的支持WiFi和BLE的高集成度无线MCU,目前已经支持鸿蒙系统和Free RTOS系统。
下图为其芯片内部框图
芯片最高主频可达160MHz,内置SIP 288KB SRAM,SIP 160KB Code ROM,以及2MB的XIP Flash
二、开发环境准备
下面来准备一下开发环境
产品目前支持Linux环境开发,因此我也选择改方式,当然也是我第一次尝试Linux环境的arm开发。工具采用如下组合:
Win11 + WSL2 + gcc-arm+VSC
其中win11和WSL2的安装不做记录了,按照win11的操作在应用商店即可。下面记录gcc-arm和xr806的sdk安装。注意:以下操作有可能需要sudo权限,记录中不一定完全体现
1.源码sdk
下载和解压安装,使用如下命令下载:
wget https://bbs.aw-ol.com/assets/uploads/files/1693988430633-xr806_sdk.tar.gz
然后解压:
tar xvf 1693988430633-xr806_sdk.tar.gz
2.gcc-arm
下载gcc-arm工具链
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
同样是压缩文件需要解压,可以把压缩包放置到用户文件下的tools
tar xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C ~/tools/
如果没有tools,可能得创建mkdir一下
3.更改gcc.mk中的gcc-arm的路径
代码编译前需要在“gcc.mk”中设置正确的GCC 交叉编译工具链路径,进入sdk安装路径
并使用vim打开gcc.mk,然后将CC_DIR更改为如下路径
4.应用开发示例
接下来就可以使用代码编译和镜像创建了,以 hello_demo 工程为例复制默认配置文件到顶层目录(不切换工程可不要此步骤)
$ cp project/demo/hello_demo/gcc/defconfig .config
检查SDK 基础配置,如工程名、芯片型号、高频晶振、板级配置是否正确
$ make menuconfig
清理,切换工程时需要
$ make build_clean
编译代码并生成镜像文件,生成的镜像文件为“out/xr_system.img”
$ make build(建议使用make build -j 加速编译),编译通过如下
在sdk安装文件夹下,有一个out文件夹,生成的镜像目标文件就在此处,可以查看生成的相关文件。
然后我们就可以进行程序烧写,将开发板通过USB接到PC,并打开phoenixMC.exe,找到对应的镜像文件,并选择正确的端口号,点击右上角的升级固件即可开始下载。
下载成功之后,在PC端打开串口调试助手,选择正确的COM号和波特率,即可看到hello word例程打印的如下信息了。
需要注意的是,如果在下载的过程中提示如下错误
可以通过重新安装CP2102的最新版本驱动,连接如下:
https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip下面来增加VSC的支持
VSC的按爪个不赘述了,按照安装
然后在扩展插件中搜索WSL,并安装
安装完成就可以点击左下角
或者Ctrl+Shift+p
点击连接到WSL了
然后在终端中,cd进入到sdk所在路径
输入code . 即可打开sdk文件夹了
至此环境搭建完成。