芯片:选用STM32G070KBT6,具有128 KB Flash存储器、36 KB RAM,基于M0+内核,最大主频64MHz;
在stm32G0系列参考手册中我们可以发现高速外部时钟信号(HSE)可由两种可能的时钟源产生:一种是外部时钟信号(HSE),另一种是内部时钟信号(HSE)。时钟源:
- HSE 外部晶体/陶瓷谐振器(无源晶振英文为crystal或者resonator,即晶体或谐振器)
- HSE 用户外部时钟(可以是有源晶振或者其他单片机输出的时钟信号,有源晶振英文为oscillator,即振荡器)
谐振器和负载电容必须尽可能靠近振荡器引脚,以减少输出失真和启动稳定时间。负载电容的
必须根据所选振荡器调整负载电容值。
使用外部时钟时,OSC_OUT可以配置为普通IO口或者OSC_EN引脚,该引脚和有源晶振使能引脚连接,为外部有源晶振提供使能信号。它允许在器件进入低功耗模式时停止外部时钟源。
参考手册如下:说明HSE crystal模式下可以输入4-48MHZ oscillator(按理来说这个是有源晶振,为什么划分到晶体这来?)和HSE bypass模式下最大48MHZ时钟;
然后笔者又去看了stm32G070KB这个具体型号的产品手册,其中关于System clock source有如下一段话:
三种不同的时钟源可提供 SYSCLK 系统时钟:
- 4-48 MHz 高速振荡器,带外部晶体或陶瓷谐振器 (HSE)。它 可为系统 PLL 提供时钟。HSE 也可配置为旁路模式,用于外部时钟。
- 16 MHz 高速内部 RC 振荡器 (HSI16),可通过软件微调。它可以 为系统 PLL 提供时钟。
- 系统 PLL 最大输出频率为 64 MHz。它可由 HSE 或 HSI16 时钟。
如果说oscillator也表示无源晶振的话,笔者在使用stm32cubemx配置g070KBT6的时钟树时遇到了以下问题:
可以看到无法配置HSE的crystal模式,只有BYPASS外部时钟模式,这个问题也有其他人遇到过,
参考链接:STM32G050的外部晶振的一些坑_stm32单片机的晶振引脚接有源晶振-CSDN博客
既然如此,我们姑且认为oscillator表示无源晶振,而在G070KBT6这个型号上也只能用BYPASS模式,虽然参考手册说可以用无源晶振但我们以cubeMX实际配置为准,即使用BYPASS模式并使用有源晶振作为外部时钟;
晶振:使用8MHZ有源晶振(YXC,杨兴晶振),该晶振参考书册中的电路如下:
顺便记录一下单片机PLL锁相环(Phase Locked Loop)倍频原理,为什么输入8MHZ振荡信号,最后能8倍频从而驱动64MHZ的单片机;
首先PLL的结构如下:鉴相器的作用是检测输入信号和输出信号的相位差,并将检测出的相位差信号转换成uD(t)电压信号输出。当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住;鉴相器的输出,可能会带点毛刺,过一下低通滤波;最后VCO它有这么个特性,一丢丢输入电压的变化,会导致输出频率出现很大的变化,个人认为实现频率增加的功能就是由VCO提供;
那么如何实现特定的2/4/8倍频呢?我们只需要在反馈回路上加一个相应的2/4/8分频器即可;
下载电路:使用SWD下载,这里SWD引脚和BOOT0引脚是冲突的;(G0系列只有boot0引脚而没有boot1引脚,具体启动模式选择后面会讲)
我们知道stm32的boot有三种模式:
我们先说明一下,boot只是决定了单片机上电后从哪个区域启动,由于每个区域对应一个固定的开始地址,那我们也可以理解为boot只决定了单片机从哪个地址开始运行;而我们下载程序的方法有很多,串口、SWD、Jtag等,这些方法都可以决定把程序下载到Flash或者SRAM中的任意地址中去,和什么boot模式无关;
如果想用串口下载那就得先1、选择系统存储器模式(系统存储器中有官方的串口下载bootloader,该程序被固化不可更改),2、按下复位键从系统存储器启动,将程序下载到flash;3、选择主闪存存储器模式;4、再按下复位键系统从主闪存存储器(即flash)启动,运行刚刚下载的程序;
上述步骤缺一不可,只有按下复位键之后才能以刚刚更改的模式运行,想要使用官方的bootloader下载程序就要进入系统存储器模式,该模式也只能下载程序不能运行程序;如果想要运行程序就要运行主闪存存储器存储器模式;
再来聊一下内置SRAM模式,即从SRAM中启动来运行下载到SRAM中的程序,首先我们知道如果下载程序到SRAM中再运行的话是不可行的,因为下载完程序后需要复位才能运行程序,而复位之后SRAM中的内容将会被清零;那么内置SRAM模式的作用是什么呢?作者网上查阅了相关资料发现有调试的作用,具体实现原理还没有弄清楚,如果有看到这里的大佬能解答一下我不胜感激。
那么还有一种方法可以下载程序在SRAM中并且在SRAM中运行程序,那就是选择主闪存存储器模式启动,然后再闪存flash开头我们自己编写一个bootloader,这个bootloader包含官方bootloader的串口下载功能(当然也可以添加一些其他功能),当App程序运行时检测到要下载程序就跳转到自己编写的bootloader中去,然后通过串口用代码指定程序下载到SRAM中(也可以指定下载到flash中),下载完再跳转到SRAM(或者跳转到flash)中,就可以运行刚刚下载的app程序;(关于bootloader和APP的内容请自行查阅)
这里我们选择使用SWD下载程序(SWD下载基于专用的SWD硬件接口,如果单片机芯片有SWD硬件接口就可以使用SWD下载),如果我们将程序下载到flash中那就从flash启动,即选择主闪存存储器模式;
由于SWD_CLK和boot0都在PA14引脚上,我们根据G0系列参考手册中如下所说的:
在 STM32G0x0 中,可以通过 BOOT0 引脚和用户选项字节中的启动配置位 nBOOT1、BOOT_SEL 和 nBOOT0 选择三种不同的启动模式,如下表所示。在芯片重启后,在第4个系统时钟的上升沿来检查BOOT引脚的电平及相关寄存器配置位来选择在复位后的启动模式(检测之后BOOT脚什么电平也就无所谓了)
由于G0系列只有boot0引脚,所以就用单片机寄存器中nBOOT1 bit位代替boot1引脚的功能;上表中nBOOT_SEL则设置boot0位是参照boot0物理引脚还是和boot1一样参照寄存器中的nBOOT0 bit位;具体如何应用可以参考下面这张图:(从别的作者那里扒来的【毕设】USB功率测试仪 - 嘉立创EDA开源硬件平台 (oshwhub.com))
结合上面两张图翻译一下就是:
当nBOOT_SEL被勾选,即为1时,启动模式为纯软件启动,这个时候你得先把该程序下载到芯片中才能更改启动模式,因此官方的bootloader就用不了了(官方bootloader得先改启动模式才能下载,顺序不对);当nBOOT_SEL取消勾选时,启动模式由BOOT0引脚电平和nBOOT1决定,当BOOT0为0时从flash启动,BOOT0为1时看nBOOT1是否勾选,勾选则从系统存储区启动,这时可以使用官方的bootloader进行串口下载。没勾选则从内置SRAM区启动;总之SWD下载和官方bootloader一键串口下载不可兼得;
由于前面说了BOOT0引脚和SW_CLK冲突了,我们有两种解决方式;
1、在BOOT0引脚接一个下拉电阻(官方推荐阻值10K),由于我们是使用SWD下载所以只用主闪存存储器模式即可;
2、放弃BOOT0引脚,使用纯软件更改启动模式;(这里我们使用第一种解决方式,具体实现可以通过HAL库相关代码或者在stm32cubeprogrammer中实现,后续会验证能否用ST-Link的SWD更改启动模式)
复位电路:NRST低电平复位,于是接一个上拉电阻,再接一个按钮到地,按下按钮时NRST接地系统复位;还可以在NRST和GND之间接一个电容用来硬件消抖;
电源:使用了一个AMS1117的5V-3.3VLDO降压电路;
最终电路图如下:
关于晶振电路的布线也是有要求的:
1.晶振要尽可能靠近单片机晶振引脚,以此减小寄生电容和减小干扰;晶振的电容要尽可能靠近晶振;
2.晶振电路PCB区域(从顶层到底层)不走任何于晶振电路无关的走线,大功率强干扰器件和高速信号线原理晶振电路;
3.晶振电路和MCU同层布线,且包地处理(通过在电路周围铺一圈地线来减小其他信号对电路的干扰),同时晶振电路PCB区域的其他层也最好进行GND铺铜处理;
如果是无源晶振的话还需要注意差分走线和外部匹配电容的计算,因为无源晶振有两根线,为了减小干扰以及方便负载电容的计算,需要保证两根线等长、等宽、紧密靠近、且在同一层面;
参考链接:STM32G070KB - 主流超值系列Arm Cortex-M0+ MCU,具有128 KB Flash存储器、36 KB RAM、64 MHz CPU、4x USART、定时器、ADC和通信接口,2-3.6V - 意法半导体STMicroelectronics
锁相环倍频原理简要分析 - 嗜血的草 - 博客园 (cnblogs.com)
软件工程师硬起来系列七:强大的锁相环PLL
【毕设】USB功率测试仪 - 嘉立创EDA开源硬件平台 (oshwhub.com)
单片机晶振电路计算与PCB设计,晶振参数 晶振匹配电容计算 无源晶振 有源晶振 温补晶振 恒温晶振 屹晶微EG8010 ,STM32单片机晶振电路设计,长江大学_哔哩哔哩_bilibili