FAQ汇总

FAQ 是针对常见问题的总结。在线帮助我们的用户快速检索经常问到的问题,通过简单的解释获得解答。目前常见问题的种类涵盖:开发环境、应用方案、软件平台、硬件相关和测试测试。

开发常见问题

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。