本次活动测评开发板ST NUCLEO-G071RB由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!
【实验目的】
· 掌握串口的使用
· 掌握系统时钟的配置
· 掌握俄罗斯方块游戏实现逻辑
【实验环境】
· NUCLEO-G071RB开发板
· Keil MDK-ARM(Keil uVision 5.25.2.0)
· Keil.STM32G0xx_DFP.1.0.0.pack
· MobaXterm、Putty、SecureCRT、XShell等超级终端软件
【实验资料】
· NUCLEO-G071RB开发板原理图
· STM32G071x8/xB Data Sheet
· STM32G071芯片用户参考手册
【实验分析】
在上一个UART串口实验的基础上,增加俄罗斯方块的功能逻辑,这里面包含了很多C语言算法,以及终端控制码的使用,内容比较复杂,这里提供了程序代码供有兴趣的读者自行参考。
在这个实验中主要用到了两个额外的处理器功能
1、主系统时钟提高到64MHz的配置
2、Systick节拍定时器的使用
64MHz主时钟的配置主要用到了芯片的RCC单元,RCC单元主要用来控制整个芯片系统各个功能单元的复位与时钟的控制,这里主要用到了时钟控制。
对时钟的控制基础主要依赖于系统的时钟树,与系统主频相关的部分如下图所示:
实际上也就是需要通过各种设置,使SYSCLK的时钟频率达到64MHz。
根据时钟图以及对芯片使用手册的查阅,可知系统默认使用的是内部的16MHz的RC振荡电路提供的时钟,即HSI16,且经过分频器后(默认未分频),变为HSISYS,主时钟SYSCLK选择器默认选择HSISYS为主时钟源,默认的主时钟SYSCLK频率也就是16MHz。
根据对STM32G071芯片的了解,SYSCLK主时钟最大支持的频率为64MHz,SYSCLK作为系统的主时钟,给CPU内核、大部分外围设备提供时钟源。
该芯片使用Cortex-M0+体系结构的CPU内核,以HCLK为工作时钟,最大主频可以运行到64MHz。
综上,我们如果想发挥处理器的最大性能,需要提高SYSCLK到可支持的最大频率64MHz。
在时钟部分,系统中有一个PLL部件,主要功能是提高时钟频率,输入一个低频率的时钟信号,输出一个高频率时钟信号,在图中可以看到,PLL可以选择HSE或HSI16为时钟源,在我们的开发板中,只能使用HSI16,所以这部分需要进行单独配置,整个PLL相关的配置,都在寄存器PLLCFGR中:
在这个寄存器中,主要关心的就是几个数值M、N、P、Q、R,结合时钟树以及寄存器的公式描述,能够很清楚的了解每个位段的作用。
这里最重要的两个参数就是M和N,这两个决定了锁相环PLL内部fvco的频率,三路的输出时钟都以这个频率为基准进行分频,所以需要对M和N进行合理取值。
配置完PLL参数后,需要启动PLL,主要使用了RCC_CR寄存器
需要开启[24]位,并且需要通过检测[25]位来检测PLL是否正常工作。一切正常以后,就可以把SYSCLK时钟源切换到PLLRCLK了,主时钟源的选择主要用到了RCC_CFGR
在这里设置[2:0]=010 (0x2)即可选择主时钟为PLLRCLK,时钟切换成功后,可以通过读[5:3]验证时钟是否切换成功。
综上所述,时钟配置函数实现如下:
- /* 配置64MHz系统时钟 */
- void SystemClockConfig(void)
- {
- //Fvco1 = 16 * 32 / 4 = 128
- RCC->PLLCFGR = (0x2<<0) //PLL时钟源选择HSI16
- | (4<<4) //M=4
- | (32<<8) //N=32
- | (1<<28) //使能PLLRCLK
- | (1<<29); //R=1 PLLRCLK分频系数为2 则PLLRCLK频率为64MHz
- RCC->CR |= (1<<24); //使能PLL
- while(!(RCC->CR & (1<<25))); //等待PLL锁定
-
- RCC->CFGR |= (0x2<<0); //切换时钟源为PLLRCLK
- while(!(RCC->CFGR & (0x2<<3))); //等待时钟源切换完成
- SystemCoreClockUpdate(); //更新SystemCoreClock全局变量
- }
在主函数中运行该函数,即可使主时钟频率提高到64MHz,可以通过访问全局变量SystemCoreClock得到当前的SYSCLK时钟频率。
【实验代码】
【实验现象】
· 连接开发板,并打开超级终端软件,并使用115200的波特率连接开发板的串口(注意:只能使用超级终端软件,不能使用串口调试助手,串口调试助手只能看到原始的终端控制码)
· 开发板复位以后即开始游戏,使用键盘按键控制方向
S ——左
D ——下
F ——右
E ——切换方向
空格键暂停/继续游戏
R ——重新开始
在终端中显示如下:
此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 lvxinn2006 于 2019-1-11 08:55 编辑