国民技术N32G43X/L40X/L43X系列单片机FAQ集锦
本文档主要统计了国民技术 N32G43x/L40x/l43x 系列 32 位 通用安全 MCU 在使用过程中用户常见的疑问点或容易出错的功能,并对这些问题给出了解答;目的在于降低用户在开发过程中的难度,提高开发效率。文档内容按照外设模块划分,采用一问一答的形式针对每个具体的问题作答,某些问题可能涉及到其他的参考文档,在回答中会标注相关文档的名称,文档资料请联系国民技术代理商深圳市绿都电子有限公司索取,联络电话:0755-83777478,18688790400(微信同号)。
1.1 TIM
Q1:在用 TIM1 输出 PWM 的时候失败
高级定时器在输出 PWM 时,需要额外使能一项:TIM_EnableCtrlPwmOutputs(TIM1,ENABLE);
Q2:在配置 LPTIM 的时候进不去中断函数
LPTIM 配置中断的时候有点特殊,需要额外配置使能 EXTI 的 LINE24,因为这个 LINE24 是内部连接到LPTIM 唤醒中断的。详情可看用户手册的 6.2 章节以及参考相关例程
Q3:TIM 初始化时配置分频之后不起作用
检查后续有无误操作到修改了分频的操作,大概率是后续的初始化中调用到了 TIM_ConfigPrescaler 函数导致分频重新配置成了其它参数
Q4:有时候在使能溢出中断以及定时器之后就会马上进一次中断(此时 TIM_CNT 还没溢出)
在使能 TIM 中断之前,建议先调用 TIM_ClearFlag 函数清除一次中断,然后再使能中断和定时器
1.2 LPTIM
Q1:LPTIM 无法进入中断函数
LPTIM 链接了外部中断 EXTI_LINE24(可翻阅用户手册 6.2.4 章节),在配置 LPTIM 中断的同时,也需要配置 EXTI_LINE24
1.3 LCD
Q1:在低温下启动时,LCD 显示内容异常缓慢以及有拖影现象
显示缓慢:关闭死区时间,并使能高驱动能力电压输出可有效缓解该异常现象。拖影现象:可适当降低刷新率来解决。
1.4 ADC
Q1:ADC 如何使用内部 2.048V 基准做参考源?
在 ADC 初始化前面加上:(*((uint32_t*)(0x40001800+0x24))) |= 3<<19;把这两个 bit 置 1,分别是表示打开 2.048v 开关以及将其作为 VREF 基准源。
Q2:ADC 初始化配置不通过,卡在等待 ADC 初始化完成函数那里
ADC 时钟初始化需要格外注意两个地方:ADC_1MCLK 时钟的来源以及分频。ADC_1MCLK 用于内部计时功能,频率大小必须配置成 1M,时钟来源可以是 HSE 或 HSI。通过 RCC_ConfigAdc1mClk 函数的配置来选择ADC_1MCLK 时钟来源于 HSE 还是 HSI,以及分频系数。假如选择用 HSI 作为 ADC_1MCLK 的时钟源,由于该系列的 HSI 为 16M,所以此时函数配置应该是:RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSI, RCC_ADC1MCLK_DIV16);假如选择用 HSE,则需要根据 HSE 的参数来做分频,比如 HSE 采用 8MHz 的,则需要 8 分频:RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSE, RCC_ADC1MCLK_DIV8);是 12M 则需要 12 分频,以此类推。
Q3:ADC DMA 搬运多个通道时数据异常
在改为多通道传输时,需要注意一下几点的配置:ADC 是否改为扫描模式、DMA 的 MemAddr 数组长度是否满足 ADC 通道数量、是否已开启 MEM 偏移、搬运长度是否与 ADC 通道数量一致
Q3:ADC+DMA 搬运通道错乱或者 ADC 死机如何解决?
在相关文件开头添加宏定义:#define ADCIP_CTRL (*(uint32_t*)(0x40020800+0x60))并配置该寄存器:ADCIP_CTRL = 0x28;(该配置语句放在 ADC 模块使能之前)
Q4:ADC 1M 时钟源用的是 HSE,操作完 Flash 之后关闭 HSI 时钟为什么会导致后续的 ADC 初始化失败?芯片复位运行时,HSI 默认是关闭的,且 ADC_1MCLK 时钟源默认为 HSI;此时配置 ADC_1MCLK 时钟源为
HSE 可正常以切换。但如果先开启 HSI(用于 flash 之类的)再关闭,此时 ADC_1MCLK 时钟源想要配置为 HSE 必须在 HSI 打开时才能切换成功。否则后续 ADC 初始化异常(ADC_1MCLK 时钟异常,ADC 就绪标志无法置位)。建议将 ADC 模块的初始化放在其它可能涉及到开关 HSI 时钟模块的前面。
1.5 PWR
Q1:从 LP RUN/LP SLEEP/STOP2 模式退出到 RUN 模式后串口打印异常
退出之后,需要对系统时钟重新初始化,如果前后两次主频的初始化不一致,还额外需要初始化外设,否则只需重新配置时钟
Q2:N32G43x 以及 N32L4xx 系列做替换时没有 VBAT 脚,怎么接备用电源
芯片不支持接备用电源
Q3:在测试 STOP2 低功耗模式时程序烧录失败
在进入 STOP2 模式之后 SWD 口默认已经关闭了,导致烧录不了。可以通过拉高 BOOT0 管脚的方式切回BOOT 状态下擦除 FLASH 再回到用户模式重新烧录。后续在做类似测试时可以使能低功耗下调试功能:DBG_ConfigPeriph(DBG_STOP, ENABLE); 或者在进入低功耗模式前延时一段时间(比如 1s),后续烧录新的工程可以利用这个延时完成烧录,无需每次都切换
BOOT。
Q4:RTC 唤醒 STOP2 异常
查看 RTC 的时钟源是否为 HSE,因为在 STOP2 模式下 HSE 是关闭状态,可改为 LSE 或 LSI。
Q5:修改唤醒脚之后,发现之前配置过的唤醒脚也可以唤醒
未掉电的情况下,上一次配置的 WKUP 脚会保持生效,在重新配置新的 WKUP 脚的同时,还需要重新关闭上一次 WKUP 的配置使能。
Q6:在 STOP2 模式下 Debug,调试到 WFI()休眠处再进行下一步时,会进入到 HardFault 中
调试过程中不要因为打断点,或没有触发唤醒时停止全速运行而导致指令停在进低功耗函数中的 WFI()处,然后会导致进 HardFault
Q7:测试 STOP2 功耗与手册上描述的不符
一般是由于板子有漏电引起的功耗偏高,比如有些特殊引脚默认是高电平或者低电平(详情可翻阅用户手册的 5.2.2 章节),导致该引脚连接的电路有漏电产生
Q8:低功耗模式下 IO 口怎么配置可以进一步降低功耗
主要是避免漏电流的产生,可以直接将引脚配置成模拟输入(注意不是浮空输入)Q9:STOP2 模式唤醒之后,调用系统初始化函数 SystemInit()会导致 LPTIM 工作异常SystemInit 函数会复位 LPTIM 的时钟,不建议直接调用该函数做系统的重新初始化,可以参考 STOP2 例程中 SetSysClockToPLL 函数来重新配置系统时钟
1.6 BOOT
Q1:BOOT0 引脚拉高之后用 NZDownloadTools 上位机还是识别不到芯片
从以下几点去排查原因:
1、拉高之后需要重新上电复位,芯片才能识别到 BOOT0 脚的变化从而进入 BOOT 模式
2、排查 USART(仅限 PA9 PA10)或者 USB 接口的接触是否正常
Q2:IAP 升级完之后程序运行异常,卡在死循环中
boot 程序升级完成之后,在跳转的 APP 前,把 boot 中用到的中断悉数关闭。建议逐个关闭,而不是直接调用__NVIC_DisableIRQ 函数
1.7 RTC
Q1:RTC 在用 RTC_SetWakeUpCounter 函数配置唤醒时间的时候为什么需要重新上电才会生效
在重新修改唤醒时间之前,需要先关闭 RTC 唤醒使能,即调用 RTC_EnableWakeUp(DISABLE);
Q2:RTC 用 LSE 作为时钟源,在低温测试下 RTC 会停止工作(未超出 LSE 温度范围)低温环境中(比如-20℃以下),需要增强 LSE 驱动能力或者对晶振型号做调整,详情可以参阅套件资料中的使用指南《UG_N32G43X & N32L40X & N32L43X 系列 MCU LSE 晶体选型指南 V1.0.pdf》
1.8 USART
Q1:用开发板测试串口 1 PA9 PA10 打印数据异常
开发板上的 PA9 PA10 有用跳帽连接了 NSLINK 芯片,在外接 USB 转串口模块时需要把这两个相应的跳帽拔掉
Q2:串口 2 跑 2M 波特率不行
USART2 挂在 APB1 总线上,总线频率最高不超过 27M。波特率计算公式为:TX/RX 波特率 =FAPB1 /(16 ∗USARTDIV)。所以肯定是没有 2M 的。
Q3:串口没有使能溢出中断,但相应的标志位会置位
在使能了接收中断之后,溢出中断就自动使能了。所以在串口中断函数里面需要注意溢出中断的处理(溢出中断清除步骤:先读取 STS 寄存器,再读取 DAT 寄存器)
1.9 LPUART
Q1:LPUART 如何配置空闲中断
在 LPUART 中没有硬件空闲中断,需要用软件方式模拟。比如每隔 100ms 判断一次当前串口长度与上一次的长度有无变化,如果没有变化,则说明数据已接收完成
1.10 GPIO
Q1:在同个 IO 口可复用多个外设功能时,应该依据什么来配置哪个复用
以 TIM 通道为例:
在用户手册的 5.2.5 章节有对各个复用的详细说明
Q2:在用 PB3 做 LCD 功能的 SEG7 时,上电会有个过冲电平,导致屏幕显示闪烁了一下
PB3 在上电复位之后状态为推挽输出无上下拉,所以该过冲的确存在,可以在进 main 函数之前,执行SystemInit 函数时配置一下 PB3 为输出上拉模式,如下:
Q3:JTAG 复用失败
在复用之前需要先开启 AFIO 时钟,否则复用不生效
Q4:低功耗模式唤醒之后,调用 GPIO 口复位函数的操作会导致 SWD 口调试异常
GPIO 口复位函数会关闭时钟,导致调试断开,建议在调试时屏蔽该调用或者用其他方式看现象
Q5:模拟 I2C 或者模拟 SPI,如何提高 IO 效率
采用寄存器操作方式以及使用位带操作
Q6:N32L406 的 PD14、PD15 能否作为普通 IO 口输出?如何配置?
根据用户手册 5.2.5.3 章节,HSE 的 OSC_IN 和 OSC_OUT 分别映射到 PD14 和 PD15,如果 HSE 关闭,相应引脚可以用作 GPIO,如果 HSE 开启,相应引脚进入模拟模式并绕开 GPIO 配置;LSE 同理;但需要注意的是当 HSE 作为系统时钟时 HSEEN 位不能被清零(即 HSE 不能被软件关闭),所以如果要使用 PD14 和 PD15,首先要在 system.c 文件中设置系统时钟为非 HSE 的其他时钟源,再通过软件 RCC_CofigHse();函数关闭 HSE,最后把 PD14 和 PD15 配置为普通 IO 口,即可调用函数输出高低电平
1.11 DMA
Q1:DMA 的中断请求号和 DMA 通道是什么关系
同一个外设会有多个中断请求号,但在同一时刻,DMA 的一个通道只能选择其中一个响应。
Q2:在做 DMA 不定长数据搬运时,DMA 长度配置了之后没有生效
在重新修改 DMA 长度参数时,需要先关闭掉 DMA 使能,再进行配置,配置完之后重新打开使能。1.12 FLASH
Q1:flash 操作失败可能是什么原因导致
该系列芯片在操作 FLASH 之前需要先初始化 HSI 时钟以及需等待 HSI 震荡就绪,建议参考开发套件中的例程,沿用 SDK 中已封装好的 flash 时钟初始化函数:FLASH_ClockInit()
Q2:Flash 如何用字节形式进行写操作
没有单字节操作的方式,需要改换成 word 操作方式或者用 FLASH 模拟 E2 的方式来实现单个字节操作
1.13 NVIC
Q1:配置了中断函数但没有进中断,反而卡在死循环
先查看 NVIC 配置,以及中断函数入口(即中断函数名有没有写错,可以在启动文件中查看相应函数名)
1.14 SPI
Q1:以配置 SPI1、2 同样的方式配置 SPI3 工作异常
SPI3 有几个复用引脚默认是做烧录口用的,需要先关闭烧录口的复用才能做 SPI3 用
Q2:在配置为某些分频系数的情况下,SPI 片选脚会先于 SCK 拉高,即时钟线还没走完,CS 就已经拉高了在传输数据时,可以先等待 SPI 总线不繁忙再返回数据,另外 SPI 总线判断不繁忙的依据跟 SPI 配置第一
还是第二边沿采样有关, 如果是第一边沿采样,有可能是在 SCK 上升沿之后不久还没到下降沿此时 CS 就会拉高。
1.15 PWM
Q1:用开发板的 PA10 引脚输出 PWM 波形有偏置电压
需要把连接到虚拟串口的跳帽断开1.16 RCC
Q1:如何修改程序的主频和时钟源
修改时钟源在 system_n32xxx.c 中,通过修改 SYSCLK_SRC 宏定义的变量,即对应不同的时钟源;通过修改 SYSCLK_FREQ 宏定义来设置系统主频。在 n32xxx.h 中,通过修改 HSE_VALUE 的定义,来修改外部晶振参数。
1.17 CAN
Q1:CAN 上电之后会有一段不规则电平产生,导致总线上其它设备识别错误
可以加两个上拉电阻以及先配置 CAN 模块参数再配置 CAN 的 IO 口
1.18 看门狗
Q1:在进低功耗状态下,如何关闭 IWDG
IWDG 无法被关闭,哪怕是关掉中断使能,在第二次开启的时候也会进入到之前触发的中断里面,所以最好用到低功耗模式时采用 WWDG,WWDG 可以随时关闭
Q2:在执行一些耗时操作或者低功耗休眠时,芯片会重启
可能是看门狗造成的,根据耗时时间来合理配置 IWDG 复位时间;如果是低功耗休眠,可配置定时唤醒去喂狗
1.19 其他
Q1:debug 模式下工程异常
工程中包含了中文路径,Keil 对此兼容性不高。需要修改成纯英文路径
Q2:烧录报错,Error:Flash Download failed - Could not load file xxx.axf
没有编译,导致没有生成可执行文件。此时需要先编译
Q3:直接编译 SDK 中的工程报错,找不到标准库文件
是由于 SDK 中包含了中文路径导致,将整个 SDK 放在一个纯英文路径下即可Q4:编译工程报错“找不到 stdio.h”环境问题,需要在系统环境变量中加入 keil 自带的库文件,一般会在安装路径下的\ARM\ARMCC\include
中。新增一个系统环境变量,将该路径包含即可。
Q5:板子不时会复位
如果程序中添加了看门狗,需要关注喂狗是否及时;此外硬件复位电路不要悬空,可参考开发套件中的硬件设计指南
Q6:EIL 里面用 JLINK 烧录时弹出如下类似框图
该系列芯片的内核为 Cortex-M4F,选择一个未指定的 M4 核即可,如下:
Q7:初始化外设程序放在不同位置导致现象不一致
一般出现这种情况都是在配置结构体参数时,因为没有用到某些功能所以没有去完整配置全部参数导致的,且结构体变量时定义为了局部变量。可以在初始化之前调用相应函数初始化一下结构体,比如在配置
GPIO 口时,定义结构体为: GPIO_InitType GPIO_InitStructure;在配置 GPIO_InitStructure 的结构体成员的参数前调用 GPIO_InitStruct(&GPIO_InitStructure);初始化一遍结构体即可。
Q8:程序跑进 assert_failed
一般是函数传参不匹配导致,可在 assert_failed 函数里面添加如下打印函数即可定位到哪里的配置出了错:printf("Wrong parameters value: file %s on line %d\r\n", file, line);
Q9:芯片首次烧录失败
可以切回 BOOT 状态,然后擦除 FLASH 内容,之后即可正常烧录
Q10:UCID/UID 的获取异常
建议统一用标准库的 API 来获取:void GetUCID(uint8_t *UCIDbuf) / void GetUID(uint8_t *UIDbuf)
Q11:JFLASH 识别芯片信息异常
通常是配置 JLINK 的 xml 文件错误引起的,需要注意在复制 Nationstech-JLinkDevices.xml 文件的配置内容时不要复制头尾的</DataBase>
Q12:软件方式配置读保护等级没有生效
需要配合 flash 解锁和上锁函数使用,在配置读保护之前先解锁 flash,配置之后上锁并复位
Q13:在没有开启读保护的情况下,烧录以及调试失败,但调试工具是可以识别得到芯片的
查看 FLM 文件,没有选中或者是选择型号错误
Q14:烧录器能识别到芯片且 Flash 可以擦除,但烧录失败,报错信息:Flash Download failed - "CoretxM4"
大概率是开启的读保护功能导致,可以用 Nations MCU Download Tool 工具,通过串口或者 USB 解锁读保护(这两种方式需要切 boot),或者通过 SWD 接口解锁读保护(SWD 方式不需要切 boot)
(该操作只有解锁 L1 等级可行,L2 不可恢复)
如果您在使用国民技术MCU时遇到技术方面的疑问,请联络国民技术代理商深圳市绿都电子有限公司FAE支持,联络电话:0755-83777479,18688790400,philip.yf@szlvdu.com.