页次: 1
我也有一堆,同出
官方没有提供模板,从网上查找的文档自己写的
@wm20031015
how to compiler
keil mdk ac5
资料值钱,现在抄得多了
以前用orange pi zero刷ubuntu跑jlink linux驱动,挺好使。
谁家的手表?
如果是公司要用的,会差这点钱吗?
公司自然会有代理免费送的。
CmBacktrace也不错,如果keil的交互窗口更强大一点,应该是可以做到跳转到出问题的行
机器人用的BMS
APM32F072研究了一下追踪hardfault,一个是通过网上的套路,从PC指针人工方式找到事故地点,另一个是通过trace32代码执行的回溯查找事故地点。
trace32高级点的应用:
1、代码执行时间,新版的power debug仿真器已经可以把log保存到本地电脑了
2、程序运行起来后,看下实际运行环境下的,代码覆盖覆盖率,
果然CAN和USB不能同时用,用USB转串口的DEMO,把CAN时钟打开,USB就不能识别了
USB和CAN能同时使用吗?
实际加载后如图
lauterbach最新发布的svdconverter终于可以完整的把SVD文件转换成per文件了,调试MCU就可以使用per.view xxxx来加载,直接察看操作寄存器了。
这主频对不起外设啊,外设全开的情况下,CPU忙得过来不
搞MCU开发JLINK是比较方便。很多都是拿来做逆向的,IDA+TRACE32,直接修改完调试,没更方便的了
开发环境要迁移到IAR才行,GCC编译出来的文件比IAR大太多了
搞的山寨版,
trace32 烧写的脚本 :
//连接MCU
SYStem.Down
SYStem.RESetOut
WAIT.500ms
SYStem.RESet
SYStem.CPU CortexM33
;SYStem.CPU Star
SYStem.JtagClock 30M
SYStem.CONFIG.DEBUGPORTTYPE SWD
SYStem.Option.DUALPORT ON
SYStem.Up
PRIVATE &i
&i=0x20000000
WHILE (&i<0x20001000)
(
Data.Set &i 0
&i=&i+1
)
FLASH.RESet
;Data.LOAD.Binary ~~/demo/arm/flash/word/acm32f4.bin 0x20000000
;Register.Set PC 0x20000004
;Go
//创建FLASH列表,64K,地址范围:0x00--0xffff,扇区大小:512byte,总线位宽:字,32位
;FLASH.Create 1. 0x0000--0x1fff 0x200 TARGET Long
FLASH.Create 1. 0x0000--0xffff 0x200 TARGET Long
;FLASH.Create 1. 0x0000--0x7ffff 0x200 TARGET Long
//bat32g13x编程程序加载到0x20000000,
FLASH.TARGET 0x20000000 0x20000800 0x200 ~~/demo/arm/flash/word/acm32f4.bin
//擦除FLASH
FLASH.Erase 1.
;编程FLASH
FLASH.Program 1.
Data.LOAD.auto F:\Project\demo\ACM32F4_ModulesDemo_Rev1.0.8\ModulesDemo\GPIO\demo\MDK_Project\Objects\Project.axf /path F:\Project\demo\ACM32F4_ModulesDemo_Rev1.0.8\ModulesDemo\GPIO\demo\MDK_Project\Objects
FLASH.Program off
List
Break
周六得空,把板子翻出来把坑填完,终于可以正常烧写仿真了。
acm32f4_config.h
#ifndef __ACM32F4__H
#define __ACM32F4__H
#define CHIP_FLASH_SIZE 0x7ffff
#define FLASH_PAGE_SIZE 0x200
#define SCU_RCR *(unsigned int *)(0x40010800UL + 0x00)
#define SCU_CCR1 *(unsigned int *)(0x40010800UL + 0x10)
#define SCU_CCR2 *(unsigned int *)(0x40010800UL + 0x14)
#define SCU_RCHCR *(unsigned int *)(0x40010800UL + 0x24)
#define SCU_RCR_REMAP_IMP (1UL << 16)
#define SCU_RCHCR_RCHRDY (1UL << 9)
#define SCU_RCHCR_RCH_EN (1UL << 0)
#define SCU_RCHCR_RCH_DIV (1UL << 8)
#define SCU_CCR2_DIVDONE (1UL << 31)
#define EFC_CTRL *(unsigned int *)(0x00100000UL + 0x00)
#define EFC_SEC *(unsigned int *)(0x00100000UL + 0x04)
#define EFC_TERASE *(unsigned int *)(0x00100000UL + 0x0c)
#define EFC_TPROG *(unsigned int *)(0x00100000UL + 0x10)
#define EFC_STATUS *(unsigned int *)(0x00100000UL + 0x14)
#define EFC_INTSTATUS *(unsigned int *)(0x00100000UL + 0x18)
#define EFC_INTEN *(unsigned int *)(0x00100000UL + 0x2C)
#define FMC_FLSTS_OVF_Msk 0x01
#define SCB_VTOR *(unsigned int *)(0xE000E000UL + 0x0D00UL + 0x08)
#define EFC_CTRL_PAGE_ERASE_MODE (1 << 1)
#define EFC_CTRL_PROGRAM_MODE (1 << 0)
#define EFC_STATUS_NVR4_LOCK (1 << 4)
#define EFC_STATUS_NVR3_LOCK (1 << 3)
#define EFC_STATUS_NVR2_LOCK (1 << 2)
#define EFC_STATUS_NVR1_LOCK (1 << 1)
#define EFC_STATUS_EFLASH_RDY (1 << 0)
//计算编程等待时间,默认时钟为64M
#define SYS_CLK (64)
#define FLASH_PROG_DELAY (12 * SYS_CLK)
#define FLASH_ERSAE_DELAY (6 * 1000 * SYS_CLK)
//系统时钟配置
#define system_init() do{ \
SCU_RCR |= SCU_RCR_REMAP_IMP; \
EFC_CTRL = (EFC_CTRL & ~(0x1F << 7)) | (8 << 7); \
if(0 == (SCU_RCHCR & SCU_RCHCR_RCH_EN)) \
{ \
SCU_RCHCR |= SCU_RCHCR_RCH_EN; \
while(0 == (SCU_RCHCR & SCU_RCHCR_RCHRDY)); \
} \
SCU_CCR1 = 0; \
SCU_RCHCR &= (~SCU_RCHCR_RCH_DIV); \
while(0 == (SCU_RCHCR & SCU_RCHCR_RCHRDY)); \
SCU_CCR2 = 0x0000; \
while((SCU_CCR2 & SCU_CCR2_DIVDONE) == 0x00); \
EFC_TPROG = FLASH_PROG_DELAY; \
EFC_TERASE = FLASH_ERSAE_DELAY; \
}while(0)
#define flash_readywait(value) do{ \
unsigned int x; \
x = value; \
do{ \
x --; \
if((EFC_STATUS & EFC_STATUS_EFLASH_RDY) != 0) break; \
}while(x); \
}while(0)
#define flash_program() do{ \
unsigned int i; \
EFC_CTRL |= EFC_CTRL_PROGRAM_MODE; \
for(x=0; x<FlashParameter.size; x += 4) \
{ \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *)(FlashParameter.addr + x) = *((unsigned int *)(&FlashParameter.data[x])); \
flash_readywait(FLASH_PROG_DELAY); \
} \
EFC_CTRL &= ~EFC_CTRL_PROGRAM_MODE; \
FlashParameter.status = 0; \
}while(0)
#define flash_erasepage() do{ \
EFC_CTRL |= EFC_CTRL_PAGE_ERASE_MODE; \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *) FlashParameter.addr = 0x00; \
flash_readywait(FLASH_ERSAE_DELAY); \
EFC_CTRL &= ~EFC_CTRL_PAGE_ERASE_MODE; \
FlashParameter.status = 0; \
}while(0)
#define flash_erasechip() do{ \
unsigned int x; \
EFC_CTRL |= EFC_CTRL_PAGE_ERASE_MODE; \
for(x=0; x<FlashParameter.size; x += FLASH_PAGE_SIZE) \
{ \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *)(x) = 0x00; \
flash_readywait(FLASH_ERSAE_DELAY); \
} \
EFC_CTRL &= ~EFC_CTRL_PAGE_ERASE_MODE; \
FlashParameter.status = 0; \
}while(0)
#endif
main.c
//***********************************************************************************************************
// Ver 1.0
// 2022.04.02 1、新建文件。
//***********************************************************************************************************
//#include "gd32l23x_config.h"
//#include "bat32g135_config.h"
#include "acm32f4_config.h"
//参数块定义
typedef struct{
unsigned int flashaddr; //0x800,芯片起始地址
unsigned int flashwidth; //0x804,1=8bit,2=16bit,4=32bit
unsigned int width; //0x808,数据总线位宽
unsigned int offset; //0x80c,
unsigned int addr; //0x810,FLASH操作地址
unsigned int size; //0x814,擦除、写入字节数
unsigned int reserved; //0x818,
unsigned int status; //0x81c,in: 1=program, 2=erase, 5=chip erase, out: 0=o.k., 0x100=fail
unsigned char data[4096]; //0x820,缓冲区起始地址
}FlashParameter_Str;
static FlashParameter_Str FlashParameter __attribute__((at(0x20000800)));
//static FlashParameter_Str FlashParameter __attribute__((section(".ARM.__at_0x20000800")));
enum{
FLASH_PROGRAM = 0x01,
FLASH_ERASE_PAGE = 0x02,
FLASH_CHIP_ERASE = 0x05,
};
#pragma arm section code = ".ARM.__at_0x20000000"
//#pragma clang section text = ".ARM.__at_0x20000000" //AC6
int main(void)
{
unsigned int errCnt = 65535;
unsigned int tMs;
system_init();
while(1)
{
switch(FlashParameter.status)
{
case FLASH_PROGRAM:
flash_program();
return(0);
//break;
case FLASH_ERASE_PAGE:
flash_erasepage();
return(0);
//break;
case FLASH_CHIP_ERASE:
flash_erasechip();
return(0);
//break;
default:
tMs = 65535;
while(tMs--);
break;
}
if(errCnt > 0) errCnt--;
else return(1);
}
}
#pragma arm section
//#pragma clang section
30号了,还没有恢复...........
我买的两个也吃灰了,同出
这个要用墨水屏才省电,OLED太耗电了,电池顶不住
yelong98 说:5.8干嘛不买雅特立,何苦去填坑新品
雅特力一批量,世强能给你搞死,签过合同的订单,都会改价叫你重签
法院告他
从晕哥的淘宝设点买了个板,得空试了下开发板点灯测试正常,测试用trace32连接的时候提示内核问题,cortex m33还是star core?
选择cortex m33跑个点灯倒是没报错。
写下载算法的时候遇到问题了,复位芯片后再下载,擦除时间算是正常的,程序运行的时候,不复位芯片下载,这个擦除时间很长,是重新配置时钟不成功?然后按64M配置的延迟导致出问题了?有大佬指点下,会不会芯片初始化有遗漏哪个寄存器没设置?
头文件如下:
#ifndef __ACM32F4__H
#define __ACM32F4__H
#define CHIP_FLASH_SIZE 0x7ffff
#define FLASH_PAGE_SIZE 0x200
#define SCU_RCR *(unsigned int *)(0x40010800UL + 0x00)
#define SCU_CCR1 *(unsigned int *)(0x40010800UL + 0x10)
#define SCU_RCHCR *(unsigned int *)(0x40010800UL + 0x24)
#define SCU_RCR_REMAP_IMP (1 << 16)
#define SCU_RCHCR_RCHRDY (1 << 9)
#define SCU_RCHCR_RCH_EN (1 << 0)
#define EFC_CTRL *(unsigned int *)(0x00100000UL + 0x00)
#define EFC_SEC *(unsigned int *)(0x00100000UL + 0x04)
#define EFC_TERASE *(unsigned int *)(0x00100000UL + 0x0c)
#define EFC_TPROG *(unsigned int *)(0x00100000UL + 0x10)
#define EFC_STATUS *(unsigned int *)(0x00100000UL + 0x14)
#define EFC_INTSTATUS *(unsigned int *)(0x00100000UL + 0x18)
#define EFC_INTEN *(unsigned int *)(0x00100000UL + 0x2C)
#define FMC_FLSTS_OVF_Msk 0x01
#define SCB_VTOR *(unsigned int *)(0xE000E000UL + 0x0D00UL + 0x08)
#define EFC_CTRL_PAGE_ERASE_MODE (1 << 1)
#define EFC_CTRL_PROGRAM_MODE (1 << 0)
#define EFC_STATUS_NVR4_LOCK (1 << 4)
#define EFC_STATUS_NVR3_LOCK (1 << 3)
#define EFC_STATUS_NVR2_LOCK (1 << 2)
#define EFC_STATUS_NVR1_LOCK (1 << 1)
#define EFC_STATUS_EFLASH_RDY (1 << 0)
//计算编程等待时间,默认时钟为64M
#define SYS_CLK (64)
#define FLASH_PROG_DELAY (12 * SYS_CLK)
#define FLASH_ERSAE_DELAY (6 * 1000 * SYS_CLK)
//系统时钟配置
#define system_init() do{ \
SCU_RCR |= SCU_RCR_REMAP_IMP; \
EFC_TPROG = FLASH_PROG_DELAY; \
EFC_TERASE = FLASH_ERSAE_DELAY; \
if(0 == (SCU_RCHCR & SCU_RCHCR_RCH_EN)) \
{ \
SCU_RCHCR |= SCU_RCHCR_RCH_EN; \
while(0 == (SCU_RCHCR & SCU_RCHCR_RCHRDY)); \
} \
SCU_CCR1 = 0; \
EFC_CTRL = 0x2400; \
}while(0)
#define flash_readywait(value) do{ \
unsigned int i; \
i = value; \
do{ \
i --; \
if((EFC_STATUS & EFC_STATUS_EFLASH_RDY) != 0) break; \
}while(i); \
}while(0)
#define flash_program() do{ \
unsigned int ii; \
EFC_CTRL |= EFC_CTRL_PROGRAM_MODE; \
for(ii=0; ii<FlashParameter.size; ii += 4) \
{ \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *)(FlashParameter.addr + ii) = *((unsigned int *)(&FlashParameter.data[ii])); \
flash_readywait(FLASH_PROG_DELAY); \
} \
EFC_CTRL &= ~EFC_CTRL_PROGRAM_MODE; \
FlashParameter.status = 0; \
}while(0)
#define flash_erasepage() do{ \
EFC_CTRL |= EFC_CTRL_PAGE_ERASE_MODE; \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *) FlashParameter.addr = 0x00; \
flash_readywait(FLASH_ERSAE_DELAY); \
EFC_CTRL &= ~EFC_CTRL_PAGE_ERASE_MODE; \
FlashParameter.status = 0; \
}while(0)
#define flash_erasechip() do{ \
unsigned int i; \
EFC_CTRL |= EFC_CTRL_PAGE_ERASE_MODE; \
for(i=0; i<FlashParameter.size; i += FLASH_PAGE_SIZE) \
{ \
EFC_SEC = 0x55AAAA55; \
*(unsigned int *)(i) = 0x00; \
flash_readywait(FLASH_ERSAE_DELAY); \
} \
EFC_CTRL &= ~EFC_CTRL_PAGE_ERASE_MODE; \
FlashParameter.status = 0; \
}while(0)
#endif
main函数如下:
//***********************************************************************************************************
// Ver 1.0
// 2022.04.02 1、新建文件。
//***********************************************************************************************************
//#include "gd32l23x_config.h"
//#include "bat32g135_config.h"
#include "acm32f4_config.h"
//参数块定义
typedef struct{
unsigned int flashaddr; //0x800,芯片起始地址
unsigned int flashwidth; //0x804,1=8bit,2=16bit,4=32bit
unsigned int width; //0x808,数据总线位宽
unsigned int offset; //0x80c,
unsigned int addr; //0x810,FLASH操作地址
unsigned int size; //0x814,擦除、写入字节数
unsigned int reserved; //0x818,
unsigned int status; //0x81c,in: 1=program, 2=erase, 5=chip erase, out: 0=o.k., 0x100=fail
unsigned char data[4096]; //0x820,缓冲区起始地址
}FlashParameter_Str;
static FlashParameter_Str FlashParameter __attribute__((at(0x20000800)));
//static FlashParameter_Str FlashParameter __attribute__((section(".ARM.__at_0x20000800")));
enum{
FLASH_PROGRAM = 0x01,
FLASH_ERASE_PAGE = 0x02,
FLASH_CHIP_ERASE = 0x05,
};
#pragma arm section code = ".ARM.__at_0x20000000"
//#pragma clang section text = ".ARM.__at_0x20000000" //AC6
int main(void)
{
unsigned int errCnt = 65535;
unsigned int tMs;
system_init();
while(1)
{
switch(FlashParameter.status)
{
case FLASH_PROGRAM:
flash_program();
return(0);
//break;
case FLASH_ERASE_PAGE:
flash_erasepage();
return(0);
//break;
case FLASH_CHIP_ERASE:
flash_erasechip();
return(0);
//break;
default:
tMs = 65535;
while(tMs--);
break;
}
if(errCnt > 0) errCnt--;
else return(1);
}
}
#pragma arm section
//#pragma clang section
不错,晚上试试,
文件上传建议弄个TFTP服务器,上传下载都方便。
没啥资料,等大佬先填坑
手册看过,还不错,可以搞起来
这个就NB大了,省了买XILINX下载线了
个人可以弄个山寨的,原装货价格确实高了点
trace32调试什么芯片,换对应的头子就可以了,楼上有Tricore的头子?我没有用过tricore的芯片不太清楚,手上还有两个支持arm的头子,也许可以交换一下
近来用国产的ARM起来越多了,想着把TRACE32利用起来,调试、抓取数据非常的方便,花了一周的时间找资料,验证算法,终于搞定了。
//***********************************************************************************************************
// Ver 1.0
// 2022.04.02 1、新建文件。
//***********************************************************************************************************
//#include "stdio.h"
//参数块定义
typedef struct{
unsigned int flashaddr; //0x800,芯片起始地址
unsigned int flashwidth; //0x804,1=8bit,2=16bit,4=32bit
unsigned int width; //0x808,数据总线位宽
unsigned int offset; //0x80c,
unsigned int addr; //0x810,FLASH操作地址
unsigned int size; //0x814,擦除、写入字节数
unsigned int reserved; //0x818,
unsigned int status; //0x81c,in: 1=program, 2=erase, 5=chip erase, out: 0=o.k., 0x100=fail
unsigned char data[4096]; //0x820,缓冲区起始地址
}FlashParameter_Str;
//关键地址,TRACE32的数据交互都在这个结构体里面
static FlashParameter_Str FlashParameter __attribute__((at(0x20000800)));
#define FLASH_PAGE_SIZE 512
enum{
FLASH_PROGRAM = 0x01,
FLASH_ERASE = 0x02,
FLASH_CHIP_ERASE = 0x05,
};
#define FMC_FLPROT *(unsigned int *)(0x40020000UL + 0x20)
#define FMC_FLOPMD1 *(unsigned int *)(0x40020000UL + 0x04)
#define FMC_FLOPMD2 *(unsigned int *)(0x40020000UL + 0x08)
#define FMC_FLSTS *(unsigned int *)(0x40020000UL + 0x00)
#define FMC_FLERMD *(unsigned int *)(0x40020000UL + 0x0c)
#define FMC_FLSTS_OVF_Msk 0x01
#define SCB_VTOR *(unsigned int *)(0xE000E000UL + 0x0D00UL + 0x08)
//关键行,把main函数放到RAM首地址,找到这个问题花了不少时间。
#pragma arm section code = ".ARM.__at_0x20000000"
int main(void)
{
unsigned int errCnt = 65535;
unsigned int tMs;
unsigned int i;
unsigned char *ptr,*buf;
while(1)
{
switch(FlashParameter.status)
{
case FLASH_PROGRAM:
ptr = (unsigned char *)FlashParameter.addr;
buf = &FlashParameter.data[0];
if(FlashParameter.size > 0xffff)
{
FlashParameter.size = 0xffff;
}
FMC_FLPROT = 0xF1;
for(i=0; i<FLASH_PAGE_SIZE; i++)
{
FMC_FLOPMD1 = 0xAA;
FMC_FLOPMD2 = 0x55;
*ptr++ = *buf++;
// polling OVER Flag
while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
}
FMC_FLPROT = 0x00;
FlashParameter.status = 0;
return(0);
break;
case FLASH_ERASE:
FMC_FLERMD = 0x10;
FMC_FLPROT = 0xF1;
FMC_FLOPMD1 = 0x55;
FMC_FLOPMD2 = 0xAA;
// Write data to start address of sector to trigger Erase Operation
*(unsigned int *) FlashParameter.addr = 0xFFFFFFFF;
// polling Erase Over Flag
while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
FMC_FLERMD = 0x00;
FMC_FLPROT = 0x00;
FlashParameter.status = 0;
return(0);
break;
case FLASH_CHIP_ERASE:
FMC_FLERMD = 0x08;
FMC_FLPROT = 0xF1;
FMC_FLOPMD1 = 0x55;
FMC_FLOPMD2 = 0xAA;
*(unsigned char *) FlashParameter.addr = 0xff;
// polling OVER Flag
while((FMC_FLSTS & FMC_FLSTS_OVF_Msk) == 0);
FMC_FLSTS |= FMC_FLSTS_OVF_Msk;
FMC_FLPROT = 0x00;
FlashParameter.status = 0;
return(0);
break;
default:
tMs = 65535;
while(tMs--);
break;
}
if(errCnt > 0) errCnt--;
else return(1);
}
}
#pragma arm section
确实是这样,对于新手来说,一开始就写cmm文件有点难,都还没摸清操作套路,慢慢来就好了。
玩个高大上的装备,劳特巴赫Trace32来仿真调试STM32F103ZE,大概说一下流程,细节参考视频。
1.连接好仿真器与目标板,这高大上的设备还是要注意点,在断电状态连接调试头和20PIN线。都接好后将仿真器和板上电,这个顺序不知道有没有什么讲究,老师也没有说过要哪个先上电,按一般套路来吧。
2.打开trace32菜单的"TRACE32 ICD ARM USB".然后在命令行窗口输入两行命令,如下:
sys.cpu stm32f103ze //设置CPU为STM32F103ZE
sys.up //连接CPU
输入这两个命令后,最下面的状态栏“system dowm”就会变成“system ready”,表示连接目标芯片成功。
3.加载脚本"E:\T32\demo\arm\flash\stm32f10x.cmm" 将程序下载到FLASH,第一个窗口询问是否编程配置字,一般点取消就可以了,第二个窗口询问编程FLASH,按提示操作选择要烧写的文件,这个比较简单,等待完成就好了。
4.加载要调试的文件“Project.axf”和源文件的目录,命令行如下:
data.load.auto E:\Project\STM32\GPIO\MDK-ARM\Obj\Project.axf /path E:\Project\STM32\GPIO
加载的时候可能会遇到“bus error generated by cpu”这样的错误,没搞为懂为什么,跳过就可以。
5.点菜单“View -> List Source”打开代码窗口,点按钮栏的开始或者在命令行改善"go"命令,程序就跑起来了。
https://whycan.com/files/members/341/TRACE32%E4%B8%8B%E8%BD%BD%E8%B0%83%E8%AF%95STM32F103ZE.rar
顶楼主,关注中!
预祝转行成功,
也要慢慢把手上用不上的东西清掉了。
这个强大。
虽然没有用过君正的芯片,帮顶 一下
这个要能挂openocd就强大了
小明优秀
真大佬
小明好牛B
高手,向高手学习
山寨的OB JLINK
要不起,
楼主,LAUNCHXL2-570LC43什么价出
1、V2 支持STM32、STM8仿真,无串口。
2、V2.1支持STM32仿真,有串口,不支持STM8仿真。
3、使用包里的升级工具V2可以正常升级到最新版,V2.1如果使用CBT6也可以正常升级到最新版。
4、V2.1如果使用的是C8T6,要用里面的STLinkUpgradeHacked.jar,如果是正宗的C8T6,FLASH只有64K,会变砖,用recovery目录的ST-LinkUpgrade_V2.J27.M15还可以抢救一下。
不要留下证据,过期的记录及时清除。
你只管发动起步加速,我随时上车 +1
海景别墅开始盖了
不错的GUI,
支持国产
入坑试了一下就吃灰了,没有调试口还是不方便。
不错,用过SWM220
已经拍了两台
晕哥,来2个
好板,可怜还没学会LINUX
要禁止联网才可以,否则也只能使用一段时间,
修改时钟校准值,实现串口115200bps通信DEMO。
把IO的施密特触发功能打开 ,配置寄存器要注意换页问题。
刚买了一个,硬件是一样的,只是license不一样,可以通过exec addfeature xxxx命令来添加,可以正常使用,因为SN与license不匹配会有个提示对话框出现。
代码优化开到最大,最后不能运行的情况是有的,自作主张把部分代码直接给弄没了。
页次: 1