开发常见问题
1.电源和USB口接好的情况下,使用内部lrc作时钟(免晶振方案),无盘符弹出,怎么解决?
答:需要使用杰理USB升级工具,并使用bit2模式,将升级工具的第2位拨到on。
2.使用内部lrc作时钟(免晶振方案),有盘符弹出,打印乱码,怎么解决?
答:先确认串口助手的波特率是否与板级设置一致,若一致还是打印乱码,则是芯片没有trim过,需要客户使用工具trim或者联系代理方。
3.uart/iic/spi/pwm接口可以映射到任意接口吗?请问USB口的DP/DM也可以映射吗?
答:uart/iic/spi/pwm接口可以通过crossbar映射到任意接口,API接口是gpio_set_fun_output_port和gpio_set_fun_input_port。USB口的DP/DM也是可以映射的。在board_demo.c中配置的uart/iic/spi/pwm接口驱动会自动映射,客户无需再去自行映射。
4.如何开放vm区域给用户使用?
答:详细可看FLASH开放VM/BTIF区域章节,注释掉main()中vm_init_app,返回resfile_init函数获得vm的起始地址后,利用flash读写章节的FLASH读写API接口从返回的起始地址开始写读就行。
5.如何查看剩下的RAM空间大小?
答:调用mem_stats函数,就可以得到剩下RAM空间的大小,即是打印的后半部分physics memory size为剩余的ram。
6.如何擦除整个flash?
答:在download.bat中加上 -format all 即可。
7.Gitee下载的压缩包codeblocks编译不成功,log显示’isd_download.exe’不是内部或外部命令,也不是可运行的程序或批处理文件,怎么解决?
答:参考Gitee上issue版块的 “下载压缩包后,codeblocks编译不成功解决方法”。
8.通用MCU主频最高支持多少兆?
答:最高支持160M,若需更高的主频,可咨询杰理FAE,用户需自行评估风险。
9.特殊引脚LDO_IN如何当作普通IO使用?
答:LDO_IN可以直接做普通IO使用,对应的是PP0脚(IO_PORTP_00)。注意PP0与P00引脚是有区别的,P00引脚是小核P11控制的,不属于主系统,主系统只能通过P11寄存器控制,控制方法如下:
P11_PORT_CON0 = BIT(1)|BIT(0); //输出1
P11_PORT_CON0 = BIT(1); //输出0
10.启动文件startup.S中_stack_ssp和_stack_usp分别是什么意思?
答:ssp为系统栈,是中断里面的栈空间大小;usp为用户栈,是main中的栈空间大小。
11.怎么知道栈是否溢出了?
答:SDK本身自带有异常打印,测试栈溢出会有异常打印出来。
12.codeblock中怎么打开异常打印?
答:①在codeblocks工程build options中删掉宏定义CONFIG_RELEASE_ENABLE;
②在debug.c中取消CONFIG_RELEASE_ENABLE宏定义:#undef CONFIG_RELEASE_ENABLE。
13.如何让flash跑四线模式?sfc时钟如何提高或减小?
答:在isd_config.ini中默认状态是2线,
2线模式,如下:
SPI=2_3_0_0; #data_clk_mode_port;
四线模式,如下:
SPI=4_3_0_0; #data_clk_mode_port;
sfc时钟提高只需要修改上面的第2位参数clk即可,sfc_clk=sys_clk/(clk+1)。
14.下载代码时如何擦除BTIF/VM区域?
答:在isd_config.ini文件中默认是不擦除BTIF/VM区域,需要擦除可以设置如下:
BTIF_OPT=0;/VM_OPT=0;
15.低功耗IO唤醒引脚配置为别的IO引脚?如何配置多个IO口同时唤醒?
答:详见pmu章节的常见问题。
16.使用crossbar映射功能后,spi通信关闭后(spi_close),DO口设置为高阻态仍旧输出为高电平,怎么解决?
答:主要原因是spi的DO口使用了crossbar,要当作普通io使用需要调用gpio_disable_fun_output_port函数释放外设控制。
17.如何获取重启复位原因?
答:第一种方法:boot.c中的main函数默认会调用u32类型的power_reset_source_dump(), 其返回值就是复位源寄存器数值,并且函数里面会有复位原因打印 printf(“[0-MSYS]–Reset Source : 0x%xn”, JL_RST->RST_SRC),其值每一位的具体含义如下图。
第二种方法:客户自行调用函数 u32 get_reset_source_value(void),其返回值是u32类型的复位源寄存器数值,客户可利用其返回值做应用判断使用,其值每一位的具体含义如下图。
18.BR30调用软关机函数,唤醒IO触发中断后,唤醒复位重启打印显示不完整,缺失uboot到power_wakeup_init函数之间打印信息,是什么原因?怎么恢复这些打印信息?
答:因为唤醒后,系统重新上电复位,power_wakeup_init函数之前,都还没有解锁,所以你的这个打印口是无效的,要想有完整直观打印,只能使用下面这些保留的口作打印:
PA7
PB4
PC3/PC5
PD0~PD7
USB DP,DM
19.高阻态是一种什么样的IO状态, 会不会输出不高不低的电平出来?
答:不会输出不高不低的电平,它既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样。
20.电池直接给IC供电 要采集电池电压 用的是ADC哪个通道呢?VBAT为什么读到的ADC采样值太小,是不准确吗?
答:使用AD_CH_VBAT通道读VBAT。VBAT读到采样值太小,是因为读到的是vBAT值的1/4,需要乘4才是真正的VBAT值,参考如下:
21.给某个io口输入高电平,为什么使用gpio_read函数,读出来电平为0?
答:使用gpio_read函数读取高电平,需要预先进行如下GPIO配置:
gpio_set_direction(USB5VIN, 1); //方向设为输入 gpio_set_pull_up(USB5VIN, 0); //关上拉10K gpio_set_pull_down(USB5VIN, 1); //开下拉10K gpio_set_die(IO_PORTC_04, 1); //设置为数字功能
22.用户在应用层如何提高内核电压?
答:在boot.c的main()函数中调整clk_voltage_mode(CLOCK_MODE_ADAPTIVE, SYSVDD_VOL_SEL_126V)为clk_voltage_mode(CLOCK_MODE_USR, SYSVDD_VOL_SEL_129V), SYSVDD_VOL_SEL_129V是最高的内核电压1.29V了。
23.休眠唤醒会清空临时变量吗?
答:RAM临时变量BSS段一上电复位重启都会清空,所以软关机唤醒复位后会丢失变量,但是power_down唤醒不会丢失数据。
24.中断堆栈溢出保护(中断栈一旦溢出就触发异常)怎么配置?
答:例如在startup.S中设置中断栈如下:
则要在debug.c的debug_init函数中设置如下中断堆栈溢出保护函数的参数:
25.休眠唤醒配置IO唤醒边沿后,还可以动态切换唤醒边沿吗?
答:可以通过寄存器动态切换唤醒边沿,方法如下:
1.board_demo.c中获取要唤醒IO对应的index值:
const struct wakeup_param wk_param = { .port[index] = &port0, ... ... ... }2.需要动态切换唤醒边沿的地方修改相应index位的寄存器值:
/***下降沿配置***/ gpio_set_pul1_uP(IO_PORTX_XX,1); gpio_set_pull down(IO_PORTX_XX,0); P3_WKUP_EDGE |= BIT(index); //下降沿 /***上升沿配置***/ gpio_set_pul1_uP(IO_PORTX_XX,0); gpio_set_pull down(IO_PORTX_XX,1); P3_WKUP_EDGE &= ~BIT(index); //上升沿
26.软关机有定时唤醒吗?
答:power_down支持定时唤醒,软关机不支持。
27.通用MCU软关机有低电压自动复位的功能吗?
答:通用MCU不支持软关机低电复位。
28.休眠唤醒后如何获取中断唤醒源是哪个IO?
答:添加如下函数,即可获取中断唤醒IO:
1.一进main()就开始读pending: .. code-block:: c
u8 port_wkup = p33_rx_1byte(P3_WKUP_PND);
2.在系统时钟初始化后调用如下打印函数获取中断源io:
static u8 system_wakeup_port_get(void) { for (int i = 0; i < 8; i++) { if(port_wkup & BIT(i)) { printf("port[%d] wake up\n", i); } } return port_wkup; }
29.IC引脚怎么设置强驱动能力的功能呢
答:可见模块例程中GPIO章节:
30.电源有波动导致ic自动复位了,低电复位的电压阈值可以调整吗?
答:可以在应用层直接调用如下的寄存器设置低电复位电压:
31.低电复位电压默认配置的是多少,如何查看?
答:低电复位电压默认配置是烧写器配置的,可以通过在应用层加如下打印,获取默认配置的数值:
printf("VLVD: 0x%x\n", (P33_CON_GET(P3_VLVD_CON)>>3)&0x7);通过打印值与下图对应:
32.如何配置输出IO的强驱动能力?如何查看默认的强驱组合?
答:通过HD/HD0组合配置输出IO的强驱动能力:
HD/HD0使用的API接口如下:
查看默认的强驱组合通过在应用层打印如下寄存器,看对应位即可:
JL_PORTX->HD、JL_PORTX->HD0
33.板子供电是3.3V,IO口输出电压量出来只有3.0V,请问是正常的吗?
答:io的电平是跟随VDDIO的,VDDIO可以外供也可以芯片内部自供电,默认是软件让芯片内部供电,在board_demo.c中的power_param中vddiom默认是3.0V,可以修改调节为3.2V:
34.系统复位重启函数接口是什么?
答:客户可以调用void p33_soft_reset(void)函数进行系统复位重启。
35.通用MCU有硬件随机数发生器吗?
答:有硬件随机数,JL_RAND->R64L/JL_RAND->R64H,直接读就可以。
36.timer定时器的输入捕获,获得的计数值不准确,可能是什么原因?
答:定时器输入捕获默认使用的时钟源是lsb,造成计数不准确,可能是定时器中没有分频到(lsb/2)以下。
37.clk_set函数可以设置串口时钟和系统时钟吗?
答:目前clk_set(”uart”, xxx)函数不能设置串口时钟,这样调用是无效的;而clk_set(”sys”, xxx)可以用来设置系统时钟,设置有效。
38.串口最大支持波特率是多少?
答:最大支持1-2M,2M的波特率下,使用内部LRC时钟波特率可能不准,若使用内部时钟,对波特率有高要求,需要客户自测。
39.下载代码时想要擦除指定的区域,怎么操作,比如擦除vm区域?
答:ini文件中设置对应区域的OPT为0,擦除vm区域则是VM_OPT=0,OPT操作符说明如下:
40.进入power_down休眠后,72分钟左右会自动唤醒,这个可以关闭,一直休眠吗?
答:lp_timer计数溢出2^32us唤醒,约为72分钟,不能关闭,只能72分钟唤醒后再继续休眠睡了,或者直接软关机一直休眠。
50.高频160M以上进行vm区域读写测试,会有读写错误,比如写进去一个正数,而读出来是FF(十六进制代表负数),是什么原因?
答:是因为频率太高了,系统跑飞了,客户在通用MCU不建议跑160M以上,会有风险。
51.DP/DM脚可以做普通IO功能吗?
答:可以直接调用 gpio_direction_input/output函数,里面默认会通过usb_iomode(1)函数把DP、DM脚设为普通IO引脚。
52.耐高压引脚,比如BR30的 PB0/PC0 最高耐压值多少?
答:耐高压引脚最高耐压值是5V。