mtk编译时的ole.pm相关问题

编译2503代码时发现如下的问题:

Can't locate Win32/OLE.pm in @INC (you may need to install the Win32::OLE module
) (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/p
erl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/shar
e/perl5/core_perl .) at make2.pl line 37.
BEGIN failed--compilation aborted at make2.pl line 37.

ole.pm这个文件本身是perl安装时就有的,提示找不到,肯定是路径问题。

解决需要关注两点:
1. 添加perl路径的环境变量 : PERL5LIB ,设置成perl安装后的实际lib路径
2. 因为编译脚本中有调用MSYS 下的sh.exe, 如果你本地安装过git,需要重命名或者去掉git下的sh.exe的可访问性,这样mtk的编译脚本就不会发生路径错误了。

ios xib布局使用

xib由于里面使用的数字都是参考父对象,实际上就是绝对布局。
1. 设置空间对象的长宽,设置上下左右的某一参考方向的边距
2. 设置对齐的方式,上下左右,水平或者垂直对齐。
3. 关联控件和头文件定义的对象变量,通过拖拽连线完成。

对于一些简单的页面,xib就足够好用了

关于ameba系列处理器OTA包首地址的说明

目前的代码,可以看到ota镜像的首地址是写死的:

#if WRITE_OTA_ADDR
  uint32_t ota_addr = 0x80000;
#endif

也就是ota包的首地址从512k开始。

那么,如果首地址不是写死的,那么这个地址是怎么设置的?
走读代码,发现的线索,uart_ymodem.c的567行:

flash_write_word(&ptr->flash, OFFSET_DATA, ptr->image_address);
}

其中ptf是ymodem数据对象,image_address应该就是下载工具界面中设置的值,具体细节需要在ymodem实际交互中才能确认。

电信iTV设置

封装类型:PPPoE
业务类型:其他
连接模式:桥接
IP模式:IPV4
MTU:
1500
启用VLAN: 启用
VlanID:
45
802.1p:
启用DHCP:不选
组播上行通道: 关闭
LAN端口绑定: iTV
SSID 端口绑定: 不选

需要注意的是,经过反复验证:
1. VlanID只能是45,换了别的无法正常收看,具体原因不详,可能跟每个人的光纤接入设备有关吧。
2. LAN端口绑定必须是iTV

各链接状态如下所示:

esp32 ubuntu开发环境搭建

  1. 工具链准备
    gcc及python环境准备
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-pyparsing
  1. 查看系统版本,安装相应的工具链包
cat /proc/version

64位下载:

wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

解压
设置环境变量,目前发现docker中,只有.bashrc 中生效

export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
  1. esp-idf 安装
git clone --recursive https://github.com/espressif/esp-idf.git

设置环境变量,目前发现docker中,只有.bashrc 中生效

export IDF_PATH=~/esp/esp-idf
  1. 安装依赖的 Python 软件包
python -m pip install --user -r $IDF_PATH/requirements.txt

git tips

  1. 强制放弃修改
    git reset –hard origin/master
    这个master是你当前本地仓库的分支,要根据实际情况来修改
  2. clone指定的分支
    git clone -b aaa http://bbb
    aaa是远程的分支名,bbb是仓库路径

IAR的link配置

不像STVD有详实的UI界面来配置详细的link参数,IAR无法无法细致的展现这些参数,那么如何配置这些参数呢,比如section,内存起始等。

在我们创建IAR的工程时,会生成EWSTM8目录,在目录下面的icf文件,就是默认iar工程加载的配置文件。没有的话,也可以自己修改或者从其他工程拿模板来修改。

ameba1的image tool使用

amebaz的image tool是使用uart下载的,ameba1的image tool是使用jlink下载的。

ameba1的操作

对于ameba1的image tool下载,操作方法如下:
GPIOB_0 上拉, 然后加电开机使得ameba1处理器进入烧录模式,然后image tool就可以连接和操作了。
需要注意的是,经过验证6.20c版本的jlink不行,可能更高版本的也不行。目前经过实际验证4.9版本的可以,其他版本需要自己去摸索和验证。

工具

ameba1 image tool
jlink 4.9

ameba mp bin档的制作

  1. 基线代码
    基线代码可以从官网下载或者从fae渠道获取。
    选择对应的工程基线,注意区分ameba1和amebaz系列。
    ameba1系列经实际操作,ameba1 v3.4b3 和ameba v4.0c都是可以的。
  2. 替换mp工程需要的lib库
    注意这个也是需要根据处理器的不同,找到对应的正确版本lib_wlan_mp.a。
    在默认的工程中,右键/lib/lib_wlan.a,选择option,选择 exclude from build,然后加入正确的lib_wlan_mp.a,最后重新编译就可以了。
    lib_wlan_mp.a的替换
  3. troubleshoot
    过程中遇到编译的bin开机hardfault error,和mptool无法连接的问题,经反复折腾都是基线版本的问题,无明显提示和解决方法

ameba1的mptool使用

realtek的rt8710af和rt8711af都归属于ameba1系列。

支持mptool的firmware

首先硬件的firmware必须是支持mptool的版本,支持的的版本运行时会显示如下类似的日志:

Initializing WIFI ...
RTL8195A[Driver]: The driver is for MP

日志中有mp字样的log。

连接硬件

连接时,要ameba芯片的GPIOB3脚接地,然后开机,再连接mptool,连接成功后,如下图所示:
mian
efuse
使用mptool前,注意参看工具目录下的使用手册,先进行正确的配置哦。

对应的软件和工具

支持mptool的firmware和mptool工具:
支持mptool的bin
mptool

jtag和swd接口线序

下面为J-Link接口定义:

仿真器端口 连接目标板 备注
1. VCC MCU电源VCC VCC
2. VCC MCU电源VCC VCC
3. TRST TRST Test ReSeT/ pin
4. GND GND或悬空
5. TDI TDI Test Data In pin
6. GND GND或悬空
7. TMS, SWIO TMS, SWIO JTAG:Test Mode State pin ; SWD: Data I/O pin
8. GND GND或悬空
9. TCLK, SWCLK TMS, SWCLK JTAG: Test Clock pin ; SWD: Clock pin
10. GND GND或悬空
11. RTCK RTCK
12. GND GND或悬空
13. TDO TDO Test Data Out pin|
14. GND GND或悬空
15. RESET RESET RSTIN pin|
16. GND GND或悬空
17. NC NC
18. GND GND或悬空
19. NC NC
20. GND GND或悬空

下面是管脚物理排列:
jtagswd

sshfs的安装

windows环境

sshfs客户端和dokan版本要正确,否则可能报version error。下面是验证过的2个配套版本:
1. dokan
https://github.com/dokan-dev/dokany/releases/tag/v1.0.5
2. winsshfs
https://github.com/feo-cz/win-sshfs/releases

mac环境

mac使用的底层技术和window不一样:
1. 安装

brew install Caskroom/cask/osxfuse
brew install sshfs

安装完执行sshfs命令测试一下。
2. 运行

sshfs -C -o reconnect user@hostname:remote_dir local_dir

考虑到之前已经运行过,或者挂载过,每次运行时,都清除掉,重新运行,如果是设置了只允许证书登录,则使用-o ssh_command参数指定ssh的证书,参考命令如下:

pkill -9 sshfs
umount local_dir
sshfs -o ssh_command='ssh -i key' user@hostname:remote_dir  local_dir

docker常用操作命令

创建

可以在hub.docker.com上创建一个新的repo,或者自己复制一个现有的repo.
绑定github后,也可以直接通过Dockerfile来发生成最新的镜像

查看镜像列表

docker images

查看容器列表

docker ps

查看所有的容器

docerk ps -a

查看最近创建的容器

docker ps -l

查找在指定 image 之后创建的 image 中的父 image

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)

获取镜像

docker pull name/reponame

删除

docker rm          Remove one or more containers
docker rmi         Remove one or more images

删除已经退出运行的容器

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm

删除none镜像

docker images |grep none |awk '{print $3}'|xargs docker rmi

要删除全部image的话

docker rmi $(docker images -q)

停止所有容器

停止容器,才能删除所包含的image

docker stop $(docker ps -a -q)

运行

ssh登陆:

docker run -it  username/imagename /bin/bash

ssh登陆,并挂载本地目录,默认读写权限:

docker run -it -v 宿主绝对路径:docker绝对路径 username/imagename /bin/bash

attach

docker attach --sig-proxy=false $CONTAINER_ID

detach

docker没有专用的命令,目前不能使用eixit,因为会导致主进程退出。使用ctl+p+ctl+q来detach当前的进程

查看底层信息,比如IP等

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

commit

docker commit CONTAINER_ID docker_hub用户名/镜像名:tagname

push

docker push docker_hub用户名/镜像名:tagname

其他参考

资深专家都知道的 Docker 常用命令—源英文:Top Docker Commands Any Expert Should Know
Docker之容器的创建、启动、终止、删除、迁移等
docker入门——构建镜像

STM8 IWDG看门狗的使用说明

好久不搞stm8了,但朋友请教,还是帮忙确认下。主要是确认STM8的看门狗用法和喂狗时间问题,网上大把的代码样例,但是还是要刨根问底弄清楚细节,才可以用,否则就是埋雷。

大概的调用样例代码:

#define SYS_IWDG_OPEN        IWDG_KR=0xCC;
#define SYS_IWDG_FEED        IWDG_KR=0xAA;

void SystemIWDG_Config(void)   
{
    CLK_ICKCR|=S3;
    while((CLK_ICKCR&S4)==0);
    //STM8单片机需先执行0xCC指令,即先打开IWDG模块,否则IWDG工作不正常
    IWDG_KR=0xCC;                //启动看门狗
    IWDG_KR=0x55;                //使能模块访问
    IWDG_RLR=0xFF;               //溢出时间
    IWDG_PR=0x06;                //256分频 38000/256=148HZ T=6.7ms    
    IWDG_KR=0xAA;                //装载IWDG->RLR
}

代码的解释请参见以下的网络内容:

STM8独立看门狗介绍

独立看门狗模块可以用于解决处理器因为硬件或软件的故障所发生的错误。它由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,因此即使是主时钟失效时它仍然照常工作。

  • 独立看门狗功能说明
    图24是STM8独立看门狗模块的功能框图。
    当在键寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就被启动了,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号(WDG RESET)。
    使用IWDG_PR和IWDG_RLR寄存器配置独立看门狗。IWDG_PR寄存器是用于选择驱动计数器时钟的预分频系数。每当KEY_REFRESH的数值(0xAA)写入到IWDG_KR寄存器时,独立看门狗将用IWDG_RLR的数值刷新计数器的内容,从而避免了产生看门狗的复位。
    IWDG_PR和IWDG_RLR寄存器具有写保护功能,要修改它们前,需首先在IWDG_KR寄存器写入KEY_ACCESS代码(0x55);在IWDG_KR写入0xAA将恢复写保护状态。

STM8_蜂鸣器功能图
(图24:STM8独立看门狗框图)

  • 硬件看门狗功能
    如果在IWDG_HW选择字节中使能了硬件看门狗的功能,在芯片上电时看门狗的功能被自动开启,如果软件不能及时操作键寄存器,则在计数器达到0x00时产生复位。关于选择字节的内容请参考数据手册中的说明。
  • 超时周期
    超时周期由计数器数值和时钟预分频器决定,下表列出了它们的数值。


(表26:STM8看门狗超时周期(假定计数器时钟为64kHz) )

键寄存器(IWDG_KR)

地址偏移值:0x00
复位值:未定义

STM8_键寄存器(IWDG_KR)

位7:0 KEY[7:0]:键值
软件必须在规定的时间内写入KEY_REFRESH数值,否则当计数器数值达到0时,看门狗会产生一个复位。
KEY_ENABLE数值=0xCC
写入KEY_ENABLE数值将启动IWDG。
KEY_REFRESH数值=0xAA
写入KEY_REFRESH数值将刷新IDDG。
KEY_ACCESS数值=0x55
写入KEY_ACCESS数值将允许对受保护的IWDG_PR和IWDG_RLR寄存器的操作

预分频寄存器(IWDG_PR)

地址偏移值:0x01
复位值:0x00

STM8_预分频寄存器(IWDG_PR)

位7:3 保留,必须保持为0。
位2:0 PR[2:0]:预分频系数
这些位是写保护的。它们用于指定对计数器时钟分频的分频系数。
000:分频系数=4
001:分频系数=8
010:分频系数=16
011:分频系数=32
100:分频系数=64
101:分频系数=128
110:分频系数=256
111:保留

重装载寄存器(IWDG_RLR)

地址偏移值:0x02
复位值:0xFF

STM8_重装载寄存器(IWDG_RLR)

位7:0 RL[7:0]:看门狗计数器重装载数值
这些位是写保护的(见14.2)。每次在IWDG_KR寄存器中写入0x
被传送到看门狗的计数器中,看门狗的计数器将重新从这个值开和时钟的预分频系数决定,见表26。

IWDG寄存器映像和复位数值


(表27:STM8 IWDG寄存器映像 )

 

官方手册原始内容,124页:

http://www.st.com/content/ccc/resource/technical/document/reference_manual/9a/1b/85/07/ca/eb/4f/dd/CD00190271.pdf/files/CD00190271.pdf/jcr:content/translations/en.CD00190271.pdf

本地下载备份:en.CD00190271

根据芯片手册中时钟的配置:

文章开头样例代码的看门狗最大喂狗时间大约1.725秒(38K时钟)

基于docker/虚拟机的esp32远程工作流

工作流框图

背景说明

  1. 为什么需要这套工作流–为了满足高效和灵活的开发方式
    • 因为我经常需要在公司和家里切换不同的电脑工作,所以编译环境需要在远程主机上,这样不同的工作机器都能访问相同的工作编译环境。
    • 因为esp32官方推荐的还是在linux下编译,所以最简单的就是我们的编译环境和工具链还是在linux下。但是我们日常的编码和硬件烧录还是在本地windows和mac的居多。所以就有了这一套本地环境和远程docker环境相互配合的工作流。我们可以在远程编译环境使用命令行高效编译,本地继续使用VSC等工具编码和烧录。
  2. 为什么用docker而不是虚拟机?
    • 因为docker更轻量小巧,结合hub.docker.com 用起来也更方便些,更具有灵活性。当然如果你就是喜欢用VM,也是可以的,这个流程仍然适用,只是挂载宿主的目录方式有所不同而已。
    • 使用docker另外一个好处是,你可以很方便的将你配置的开发环境通过hub.docker.com分享给需要的人。

工作流步骤

  • 选择对应的linux系统镜像创建我们的docker镜像,这里我们推荐选择ubuntu 16.04系统。
  • 启动时,我们用 -v 参数将远程宿主机的本地目录挂载进docker系统。
  • 按照官方esp32的编译环境要求,部署相应的工具链和环境。部署到我们映射的目录中,这样相关的工具和代码等都可以在宿主机里面可见,并且可访问。
  • 将挂载的目录通过samba或者sshfs共享给远程的编码机器(window或者MAC)环境,并且挂载到本地虚拟磁盘路径上。
  • 日常的编码和烧录,我们就可以像访问本都路径一样访问远程vps的开发路径。使用VSC编码,或者download tool进行开发板烧录。

docker镜像

最后,如果你对使用docker环境开发esp32感兴趣,也可以直接使用我目前在用的针对esp32的docker开发镜像。一键部署,开箱即用。

docker pull hiproz/ubuntu-esp32

参考

esp32 ubuntu开发环境搭建
docker常用操作命令
windows下实现esp32下载
sshfs的安装