HS:hi-speed 480Mbps
FS:full-speed 12Mbos
the case of the USB 2.0 standard, only Hi-Speed USB 2.0 devices run at 480 Mbps. USB 2.0 Full-Speed/USB Full Speed devices are actually 12 Mbps USB 1.1 products
每天一点点
HS:hi-speed 480Mbps
FS:full-speed 12Mbos
the case of the USB 2.0 standard, only Hi-Speed USB 2.0 devices run at 480 Mbps. USB 2.0 Full-Speed/USB Full Speed devices are actually 12 Mbps USB 1.1 products
蓝牙aoa aod,对于不熟悉具体技术的人来说,并不能很好区分其中的差别。
下面将通过两张图片,来浅显的解释这两个概念的差别:
从以上两张图,我们可以这样简单的来理解:
aoa:到达角定位,通过到达接收机的多路天线信号差来定位的方式。解算在基站侧,基站多天线接收。
aod:离开角的定位,通过离开发射机的多路天线信号差来定位的方式。解算在标签侧,基站多天线发射。
exec path
\MentorGraphics\PADSVX.2.3\SDD_HOME\common\win32\bin\powerlogic.exe
\MentorGraphics\PADSVX.2.3\SDD_HOME\common\win32\bin\powerpcb.exe
how to set the "PADS Projects" path
\MentorGraphics\PADSVX.2.3\SDD_HOME\Programs\powerlogic.ini
\MentorGraphics\PADSVX.2.3\SDD_HOME\Programs\powerpcb.ini
6110R-1F-DEV 是一款用于realtek 8710af相关的模组测试的开发板,起使用接口如下:
此开发板贴的是rtl8710af模组,默认的波特率是38400
rtl8710芯片功能管脚定义如下:
swd接口定义:
TMS=>SWIO
TCLK=>SWCLK
mtk工程大同小异,参考路径:\build\ultra2503d_11c\ULTRA2503D_11C_PCB01_gprs_MT6261_S00.xxx_V30_041_20190311.bin\ULTRA2503D_11C_BB.cfg
对于开发mtk方案来说,模拟器至关重要,是提升开发效率的利器。
除了硬件驱动相关的数据接口模拟器不能调试外,tcp,wifi 等数据通讯和业务逻辑等,大多都能在模拟器中完成,所以开发mtk一定要把模拟器用好。
拿到2503的代码后,发现了一些小问题,记录之。
1. cl.exe错误
在安装vs2008后,本地已经有了cl.exe,但是模拟器代码跑起来后报cl的相关错误,很显然是环境变量确实,导致脚本调用失败。
2. 头文件错误
fatal error C1083: 无法打开包括文件:“stdarg.h”: No such file or directory
本地搜索,文件是存在的。所以还是调用问题,经确认,make\modisConfig.mak 中有对vs的路径做设定,默认是按照c盘指定的,但是本人是安装到d盘,所以该项c盘相关的路径就可以了
3. 其他函数编译错误
拿到代码后,发现之前的开发并没有使用过modis,所以硬件配置是可以编译通过的,但是modis编译不行,主要是WIN32相关的宏生命周期范围有误,还有些是对应的新增文件没有生成进modis生成的vs工程中,导致编译时调用符号缺失,根据对应函数的名称,将相关的实现文件添加到vs的工程中就可以编译了。
4. 运行崩溃问题
因为工程可能并没有在modis下面验证过,所以即使编译通过,也可能运行时崩溃。崩溃的地方主要在模拟器和硬件的逻辑差异部分,自己确认逻辑,加上合适的WIN32,基本就能问题结局。
5. 硬件数据问题
因为模拟器不能真正的使用硬件,所以在使用模拟器的时候,我们要最大可能的尽量通过软件宏逻辑来模拟硬件的数据,保证模拟器的流程跟真实硬件相同。主要的工作包括数据模拟,定时器模拟等。
一款用户802.11的beacon抓包分析工具:omnipeek。
配套参考硬件:
目前的代码,可以看到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实际交互中才能确认。
amebaz的image tool是使用uart下载的,ameba1的image tool是使用jlink下载的。
对于ameba1的image tool下载,操作方法如下:
GPIOB_0 上拉, 然后加电开机使得ameba1处理器进入烧录模式,然后image tool就可以连接和操作了。
需要注意的是,经过验证6.20c版本的jlink不行,可能更高版本的也不行。目前经过实际验证4.9版本的可以,其他版本需要自己去摸索和验证。
realtek的rt8710af和rt8711af都归属于ameba1系列。
首先硬件的firmware必须是支持mptool的版本,支持的的版本运行时会显示如下类似的日志:
Initializing WIFI ...
RTL8195A[Driver]: The driver is for MP
日志中有mp字样的log。
连接时,要ameba芯片的GPIOB3脚接地,然后开机,再连接mptool,连接成功后,如下图所示:
使用mptool前,注意参看工具目录下的使用手册,先进行正确的配置哦。
支持mptool的firmware和mptool工具:
支持mptool的bin
mptool
下面为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 | TCLK, 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或悬空 |
下面是管脚物理排列:
wxBitmap::CreateFromImage(): invalid image
同时UI工具弹框提示:找不到 ./RESOURCE/IDLE_S.bmb
根据日志,对相关模组做了重新安装:
pip install -U wxPython
pip install Pillow
安装后还是不行,遂暂时另寻他法。
2. python命令行下载
想起ubuntu下 make flash 命令后的下载命令,一想,我可以在windows下如法炮制啊:
./esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port COM15 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 ./esp32/esp-proj/hello_world/build/bootloader/bootloader.bin 0x10000 ./esp32/esp-proj/hello_world/build/hello-world.bin 0x8000 ./esp32/esp-proj/hello_world/build/partitions_singleapp.bin
遇到问题:
No module named tools.list_ports
于是安装缺少的模块:
pip install pyserial --upgrade
再执行,同步重启设备,竟然顺利烧写成功了。
3. UI工具正常了
等方式2成功后,再尝试UI工具时,竟然顺利成功了。感情前面的失败是uart组件缺失导致的,日志提示真是坑啊。
最后还是一如既往的死磕,搞定!
$PROJ_DIR$\..\..\..\component\soc\realtek\8195a\misc\iar_utility\common\preload.mac
$PROJ_DIR$\..\..\..\component\soc\realtek\8195a\misc\iar_utility\common\8195a.ddf
$PROJ_DIR$\tmp.board
--drv_vector_table_base=0x0
拿到的是Ameba-Z_DEV01_1V0开发板,开发时,发现jlink V9一直连接不上
解决:按下J17的按键,就可以连接成功
于是找了下原理图,分析下根本原因:
J17连接的是cmsis-dap芯片的reset,所以原因就是cmsis-dap对swd影响造成的。
更彻底的可以物理上断开swd和断开cmsis-dap芯片的供电,断开R5和R29。
不像STVD有详实的UI界面来配置详细的link参数,IAR无法无法细致的展现这些参数,那么如何配置这些参数呢,比如section,内存起始等。
在我们创建IAR的工程时,会生成EWSTM8目录,在目录下面的icf文件,就是默认iar工程加载的配置文件。没有的话,也可以自己修改或者从其他工程拿模板来修改。
有时候拿到的开发板或者其他ST的产品在IAR中烧录时会提示写保护。
解决的办法:
用STVP进行一次写入(默认会擦除flash,所以标识也被擦除了)Program the current tab
mcu:STM8L051F3P6,属于 STM8L Series low density
已经内置bootloader的mcu
没有内置bootloader的mcu
bootloader执行流程图:
ota 同步消息SYNCHR=0x7F
支持传输的外设
从图上看,051F支持UART或者SPI
UART设置:1 start bit, 8 data bit, 1 bit 奇校验 ,1 stop bit
波特率:通过0x7F的传输,自动适配波特率,最大115200,最小4800.
传输回复
串口:1 start bit, 8 data bit, no parity bit, 1 stop bit,波特率自适应
SPI设置
• 8 data bit, MSB first
• Bit rate: Set by the host which acts as a master
• Peripheral set in slave mode with software management of NSS
• Data polarity: CPOL = 0 (SCK to 0 when idle), CPHA = 0 (the first clock transition is the
first data capture edge).
收到命令后,bl回复ACK 0x79
从资源的角度,我们倾向于使用spi做外设,因为uart可以预留来做用户调试用,但是目前官方提供了uart的串口下载PC客户端,方便测试。所以目前看使用uart作为bl外设可能更方便。这里也就要求选用单片机时,最好是多串口的设备。
关键点检测后,要跳转的地址表:
目前我们可以先考虑实现串口的版本,但是最后还是SPI的更实用。
完整文档:UM0560
参考系统给的样例,封装了写入函数:
int usr_write_config_to_flash() { int ret; U32 offset = 0; // do { // 写入前要先擦除块 info_block_erase(); // 写入配置数据 memset(flash_write_buf, 0, sizeof(flash_write_buf)); memcpy(flash_write_buf, &sys_config, sizeof(sys_config)); offset = 0; ret = am_hal_flash_program_info(AM_HAL_FLASH_PROGRAM_KEY, 0, // we are only supporting INFO on instance 0. flash_write_buf, offset / 4, // offset (sizeof(sys_config) + 3) / 4); // num words //} while (ret); if (ret) { log(ERR, "am_hal_flash_program_info at offset 0x%08x i32ReturnCode = 0x%x.\n", offset, ret); return ERROR; } log(RUN, "flash write success\r\n"); return SUCCESS; }
系统的样例是正常的,因为没有别的业务逻辑,我的代码在开机执行也是正常的,但是在业务中调用 am_hal_flash_program_info 函数时就会随机失败,开始一直怀疑是地址区段的问题,各种尝试都不行,后来看函数的原型,发现下面的文字说明,才恍然一惊:
看到蓝色标识的部分,才想到是不是被系统的定时器中断影响了,因为系统起来后开启了很多定时器中断,于是在擦除和写入的逻辑区间关闭了中断,于是就没有再发现失败了。
浪费了半天时间,惭愧,特此随记,以示教训:在没有相关文档的情况下,要仔细看函数原型的任何一行说明文字