[原创] 【 ST NUCLEO-G071RB测评】_05_系统时钟配置以及串口实现的俄罗斯方块游戏

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

回复评论 (6)

这可以刷吗?,能消除方块?
点赞  2019-1-13 17:16
哈哈,这个很强,mobaxterm作为串口终端,使用整页刷新的那个指令吗?如果用串口助手应该不行吧。
我的小站 我的博客
点赞  2019-1-14 09:42
引用: lehuijie 发表于 2019-1-13 17:16
这可以刷吗?,能消除方块?

使用VT终端控制码,可以操作字符的位置,前景色和背景色,当然可以消除方块
点赞  2019-1-17 09:17
引用: hotsauce1861 发表于 2019-1-14 09:42
哈哈,这个很强,mobaxterm作为串口终端,使用整页刷新的那个指令吗?如果用串口助手应该不行吧。

串口助手不支持VT控制码,用串口助手的话,能看到原始的控制码数据
点赞  2019-1-17 09:17
为什么不能下载呢,很尴尬
点赞  2019-3-25 18:11
我也不能下载想学习学习很尴尬,下载不了
点赞  2019-3-25 19:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复