我们非常重视您的个人隐私,当您访问我们的网站时,请同意使用的所有cookie。有关个人数据处理的更多信息可访问《隐私政策》

产品中心

更多内容

NSUC16x0开发工程师FAQ

2025/08/21

1. 上手篇


1.1 硬件开发板

Q:NSUC16x0的Demo板有哪些特性?

    A:NSUC16x0的Demo板是为了帮助客户更快的评估该芯片而设计的。目前硬件已经到V1.3版本。该Demo板主要包括下面的一些功能:

        1. 支持各种不同的电机形式,包括直流有刷电机、三相直流无刷电机以及步进电机控制;

        2. 每个桥臂的电流高达1.4A;

        3. 支持TEST模式切换,可以从FLASH启动或者RAM启动;

        4. 支持SWD调试接口;

        5. 支持四线的LIN,包括LIN_IN, LIN_OUT, GND和VSUP,可以方便的组网和自动寻址;

        6. 有一个电源指示灯和一个用户可控指示灯;

        7. 支持一个按键输入;

        8. 支持HSBVDD高边输出控制;

        9. 各个功能管脚都引出,方便客户评估和使用;

 

Q2:NSUC16x0的Demo板原理图?

    A:

    FAQ1.jpg


Q3:Demo板里的程序明明输出了,但为什么没有电流?

    A:Demo板出厂默认没有跳线,请检查跳线J8是否闭合。如果没有闭合的话,桥臂MVDD就没有供电上。

    FAQ2.png

 

Q4:为什么LIN线既有LIN又有LIN_O?在LIN Interface的接口上名字叫LIN_IN和LIN_OUT?

    A:芯片的管脚上有LIN和LIN_O。如果应用中不需要自动寻址的功能,那么建议LIN_O悬空即可。如果需要用到自动寻址,比如空调风门或者出风口应用,比较多的相同功能的ECU连接在一起,那么就需要自动寻址的方法来进行ECU的NAD赋值。

    LIN_IN和LIN_OUT指的就是连接LIN和LIN_O管脚的外部信号。这两个信号用于将多个ECU串联起来。LIN和LIN_O之间是一个1欧姆的电阻,这个电阻是芯片内部集成的,用万用表通断测量的话,LIN和LIN_O,也就是LIN_IN和LIN_OUT是联通的。

 

 

1.2 软件开发环境

Q1:NSUC16x0支持什么哪些软件IDE?

    A:NSUC16x0属于ARM CortexM3内核。虽然ARM内核可以有很多不同的开发环境,但Keil一直是比较受广大开发者喜欢的IDE。因此NSUC16x0选择Keil作为其开发环境。用户只需要安装Keil的MDK5xx及以上的IDE,都是可以的。

 

Q2:使用Keil开发应该注意些什么?

    A:在使用Keil的MDK5xx开发NSUC16x0产品应用的时候,需要首先安装NSUC16x0的芯片安装包。安装包文件名为Novosns.NSUC16x0.2.1.x.pack(如需最新安装包,请至纳芯微官网下载)

 


1.3 调试器

Q1:NSUC16x0开发推荐什么调试器呢?

    A:NSUC16x0 支持SWD调试口。由于NSUC16x0的IO属于5V系统,因此建议用户使用支持5V电压的J-link。如果使用DP-Link或者ST-Link,大部分都是3.3V的IO,这样的话有较大概率会连接失败。

 

Q2:使用JLINK过程中的注意事项有哪些?

    A:

    1. 在购买J-link的时候,需要确保这个J-link是支持5V的,比如会有类似的字样。

    FAQ3.png

    2. SWD的连接,Jlink的话,需要连接4根线,VTref需要连接到目标板的AVDD,这个作用是为了检测AVDD的电压,从而确保SWD输出的电压和AVDD匹配。如下图所示:

    FAQ4.png

    J-link的20PIN的接头连接如下图所示,VTref - PIN1;SWDIO - PIN7;SWCLK - PIN9;GND - PIN20或者其他。

    FAQ5.png

    3. 如果J-link连接正确的话,给目标板上电后,在Keil的魔术棒下的Debug选项卡上能读到J-link的信息和芯片的IDCODE。

    FAQ6.png

 

1.4 LIN盒子

Q1:LIN 盒子能做什么?

    A:LIN盒子实际上就是一个LIN-USB工具,主要用于模拟LIN Master,发送LIN的指令和读取LIN Slave的数据。

    由于NSUC16x0主要是用于LIN通信的执行器,因此LIN盒子是必须要的。

 

Q2:LIN盒子推荐型号?

    A:目前推荐图莫斯的LIN盒子,原因是纳芯微MCU开发的上位机也都是基于该工具。

    该工具性价比比较高,其自带上位机功能也比较丰富。

    USB2CAN&LIN总线适配器基础版-重庆图莫斯电子科技有限公司官网

    FAQ7.png

 

1.5 电机

Q1:DEMO配套的步进电机型号是什么?

    A:其实没有所谓DEMO配套的步进电机,我们推荐使用12V步进电机,可以使用42BYGH33等常用的步进电机。

 

 

2. 硬件篇

Q1:产品板子的TEST引脚该如何处理呢?

    A:TEST引脚对于用户来讲,主要的作用是为了芯片boot的选择。芯片复位后会根据TEST脚是高电平还是低电平,选择不同的boot位置。如果TEST是高电平,那么芯片将从RAM开始boot,反之如果是低电平则从FLASH开始boot。

    建议用户将TEST引脚通过一个10k电阻接地,同时将TEST接一个测试点,这样做的目的是希望如果FLASH启动有问题的话,还可以通过RAM启动来擦除FLASH,可以避免由于程序的操作有问题而导致的板子变砖头。

 

Q2:HSBVDD是做什么用的,不用的话该如何处理呢?

    A:确切的说HSBVDD是一个高边开关,相当于将HSBVDD连到BVDD的一个可控的开关电路。可以通过寄存器控制连接或者关闭,还可以有过流保护功能。比较典型的case是HSBVDD给外部的传感器供电,比如高压的霍尔开关等。

    如果不用的话,可以将其通过一个电阻10k接地,只要其开关是关闭的,并不会带来电流的增加。也可以将其连接到BVDD上。

 

Q3:为什么新做的板子连不上Debug呢?

    A:新板子连不上Debug,主要可能有下面的一些原因:

        1. 使用的Debug工具,比如ST-link或者DAP-Link的输出是3.3V的,直接连到NSUC16x0上面的话会可能存在逻辑电平识别错误。建议使用5V电平的debug工具;

        2. Debug的线束太长,如果Debug的杜邦线比较长可能会导致通信问题;

        3. 由于AVDD的纹波较大,也会导致Debug通信不上,建议调整AVDD的电容;

        4. 由于AVDD外部连接较大的电容,比如1uF或者更大的电容。这个大电容可能是AVDD供电的芯片旁边的电容,这样会导致AVDD异常,比如降到4.0V左右。这样会导致Debug连接异常。

 

Q4:芯片的AVDD可以对外供电么?

    A:芯片的AVDD可以对外提供5V,20mA的供电能力。这个输出没有过流保护,只有AVDD的欠压保护。

 

Q5:芯片的低功耗电流怎样,能满足100uA的要求么?

    A:NSUC16x0的低功耗电流sleep模式下典型值是35uA,可以满足100uA的要求。

 

Q6:芯片的SLEEP模式下要注意些什么?

    A:NSUC1610的SLEEP模式下,MCU的内部LDO是关掉的,CPU、NVM、SRAM都处于PowerDown状态。这个时候如果需要保存数据,请先将数据保存在EEPROM里,保存完好之后再进入到SLEEP状态。


Q7:MVSS0和MVSS1是怎么回事,2个脚是联通的么?

    A:按照目前的User Guide图示显示,MVSS0与MVSS1是分开的。但实际上MVSS0与MVSS1在芯片内部是联通的,且不能分开。

这点需要注意,User Guide新版本中会更改过来。

 

Q8:为什么LIN除了LIN_IN还有LIN_OUT,什么时候需要用到LIN_OUT?

    A:当多个相同功能的LIN模块接入系统的时候,需要给不同的LIN Slave赋值相应的NAD。这个时候就需要4线制的LIN。

    FAQ8.png

    当使用4线制的LIN的时候,某个节点的LIN_OUT接下一个节点的LIN_IN,依次形成菊花链式连接。

    LIN_IN和LIN_OUT之间是一个1Ω的shunt电阻,这个电阻用于采样流过LIN线的电流。具体可以参考文档 Bus Shunt Revision。

 

Q9:NSUC1610的峰值电流是多少,保护电流呢?

    A:NSUC1610峰值电流大小是1.4A,有效值电流约1A。保护电流通常大于峰值电流,NSUC1610的保护电流在1.8A左右,超过该值会触发OC事件。

 

3. 软件篇

Q1:连接芯片ADC通道的温度传感器怎么计算温度?

    A:这部分在用户手册里的第18章节有详细的描述。NSUC1610内部有2颗温度传感器,一颗靠近MOSFET,用于热关断保护;另一颗靠近LDO,且连接到芯片内部的ADC端口,可用于芯片结温实时温度检测。

FAQ9.png

    温度的计算如下所示,通过ADC内部通道采集到DTV的值,通道选择“5”。

    FAQ10.png

    室温下,12V供电不跑电机,测试下来一个DTV值是125x左右(芯片之间会有差异)。

    根据下面的公式(TST和TSA的值请采用寄存器的值,早期版本的芯片可能寄存器里没有trim的值,就需要用默认的数值)

    T[°C] =(TST - DTV)*(TSA / 4096)[°C]

    可以计算得到温度值为 26 摄氏度,符合预期。推荐代码:

        if (ADC->TPSR != 0) {

            i16Temp = (ADC->TPSR_b.TST - i16TempAdc) * ADC->TPSR_b.TSA / 4096;

        } else {

            i16Temp = (0x556 - i16TempAdc) * 0x3DA / 4096;

        }

 

Q2:过压保护与欠压保护如何设置?

    A:过压保护与欠压保护是硬件自动实现的,其中过压保护点并不能设置,而是芯片固定的。欠压保护点有4个档位可选。

    FAQ11.png

    初始化的代码如下所示:

    int AMS_BVDDInit(void)

    {

        /* Set Interrupt PMU priority */

        LL_NVIC_EnableIRQ(PMU_IRQn);

        LL_NVIC_SetPriority(PMU_IRQn, 1, 1);

       

        SYSCTRL->PWRCR_b.BOF = 1;       //set the OV filter time = 0.5us

        SYSCTRL->PWRCR_b.BUF = 1;       //set the UV filter time = 0.5us

     

        SYSCTRL->PWRCR_b.BOIEN = 1;

        SYSCTRL->PWRCR_b.BUIEN = 1;

        /* Enable BVDD  OverVoltage switch-off driver */

        SYSCTRL->PWRCR_b.BOBEN = 0;

        /* Enable BVDD  UnderVoltage switch-off driver */

        SYSCTRL->PWRCR_b.BUBEN = 0;

       

        SYSCTRL->PWRCR_b.UVVTH = 3;     // BVDD UV point = 9.5V (3),  8.5V (2);   7.5V (1);  6.5V (0);

        return 0x00;

    }

    PMU的代码如下所示:

    void PMU_IRQHandler(void)

    {

        uint8_t statusov = SYSCTRL->PWRCR_b.BOVST;    

        uint8_t statusuv = SYSCTRL->PWRCR_b.BUVST;    

     

        if(statusov)

        {

            faultstate.overr = 1;         //LED slow blink   1Hz

            delay_ms(500);

            GPIO->PDO_b.DO3 = 1;

            delay_ms(500);

            GPIO->PDO_b.DO3 = 0;

        }

        if(statusuv)

        {

            faultstate.uverr = 1;         //LED fast blink   5Hz

            delay_ms(100);

            GPIO->PDO_b.DO3 = 1;

            delay_ms(100);

            GPIO->PDO_b.DO3 = 0;

        }

    }

    这个BOVST和BUVST并不需要软件去清,一旦外部条件变化,会自动置位或者清0。请注意过压和欠压刹车功能不建议使用。

 

Q3:如何进入SLEEP模式呢?怎么唤醒呢?

    A:进入SLEEP模式,其实只需要运行一条语句即可。

    SYSCTRL->LPCR_b.SLEEP = 1;

    但SLEEP后,没有其他办法唤醒,只能通过LIN唤醒。

    通过LIN唤醒的话需要配置LIN Wakeup以及LIN break的Debounce设置。

    SYSCTRL->SYSWKR_b.LINWKE = 1;        //enable LIN wake up;

    SYSCTRL->SYSWKR_b.LINDEN = 1;        //enable LIN debounce enable;

    SYSCTRL->SYSWKR_b.LINWDBC = 0;     //LIN debounce time setting = 30us;

 

Q4:SLEEP唤醒后如何读取状态标志呢?

    A:SLEEP唤醒后,可以通过读取SYSCTRL_APMUSTR寄存器来获取相应的信息。

    FAQ12.png

    SYSCTRL_APMUSTR 的描述如下:

            0:  otd_flag

            1:sleep_flag

            2:  ret_mode_flag

            3:  dvdd_uv_flag

            4:  avdd_uv_flag

            5:  por_res_flag

    上电后读取该寄存器就可以判断是单纯的POR还是SLEEP_FLAG+POR,从而可以实现不同的控制策略。

    为了读取这个寄存器,用户需要写3个KEY,之后就可以读取APMUSTR寄存器的值。

    #define SYSCTRL_UNLOCK_KEY                      0x87e4

    #define SYSCTRL_TRIM_REG_UNLOCK_KEY1  0x8a3d

    #define SYSCTRL_TRIM_REG_UNLOCK_KEY2  0x19ec

    /*config sysctrl*/

    SYSCTRL->LKKEYR           = SYSCTRL_UNLOCK_KEY;

    SYSCTRL->LKKEYR           = SYSCTRL_TRIM_REG_UNLOCK_KEY1;

    SYSCTRL->LKKEYR           = SYSCTRL_TRIM_REG_UNLOCK_KEY2;

 

Q5:Flash的操作需要注意什么?

    A:1. 强烈建议Flash的操作通过调用ROM里的Flash函数来实现。

    ROM里的Flash操作接口函数只有三个函数(Erase Full、Erase Sector 和 Write Page)

    #define Write_Page   ((unsigned int (*)(unsigned int page_address, unsigned int *data_array))0x01000139)

    #define Erase_Sector ((unsigned int (*)(unsigned int sec_address))0x01000091)

    #define Erase_Flash ((unsigned int (*)(unsigned int))0x01000001) 

    这3个函数就可以实现Bootloader等常规功能。

    调用这些函数的时候,同时需要确保调用这些函数的函数也放到RAM里运行。以纳芯微bootloader程序为例,ota.c 就是整个文件都放在RAM里跑的。

FAQ13.png

    这个设置可以通过魔法棒里的 Code/Const 下拉选项中选择 “IRAM1(0x20000000-0x20000FFF)” 来实现。一旦成功后,你会发现Project栏目下整个ota.c 的左下角多出来一个小图标。如下图所示。

FAQ14.png

 

    2. Flash操作的时候确保中断使能是关闭的以及清掉所有pending的中断flag,否则可能导致进入到中断函数,而如果中断函数在Flash中的话就会导致Hardfault。

 

Q6:为什么我的工程代码会莫名其妙的RESET?

    A:使用纳芯微的例程,如果用户出现了莫名其妙的RESET现象,请考虑stack不够引起的问题。

    例如当用户额外设置了较大的数组变量,而stack的默认值是 0x100的话就会出现stack不够的场景。这个时候会出现reset的问题。

    解决的办法是增大Stack或者减少局部变量的长度,比如将0x100增大到0x400。

    这个修改是在startup_nsuc1610.lst文件里进行,如下图所示:

FAQ15.png

    EQU        0x00000100         改成  EQU        0x00000400 即可。       

 

Q7:在Keil里如何将某个.c文件放到RAM里面运行?

    A:请参考Q5的答案,可以通过魔法棒工具直接制定特定的.c文件到RAM中即可。

 

Q8:NSUC1610过温硬件保护如何开启?

    A:NSUC1610过温硬件保护需要软件配置后才会开启,参考代码如下:

    SYSCTRL->PWRCR_b.TSF   = 0;

    SYSCTRL->PWRCR_b.TSREN = 1;



全文下载可前往:NSUC16x0开发工程师FAQ.pdf

获取更多NSUC1610产品资料:NSUC1610: 用于汽车电子执行器的马达驱动SoC