社区导航

 

搜索
查看: 150|回复: 4

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

[复制链接]

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-10 22:55:37 | 显示全部楼层 |阅读模式
本帖最后由 lvxinn2006 于 2019-1-11 08: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.         
  13.         RCC->CFGR |= (0x2<<0);        //切换时钟源为PLLRCLK
  14.         while(!(RCC->CFGR & (0x2<<3)));        //等待时钟源切换完成
  15.         SystemCoreClockUpdate();        //更新SystemCoreClock全局变量
  16. }
复制代码

在主函数中运行该函数,即可使主时钟频率提高到64MHz,可以通过访问全局变量SystemCoreClock得到当前的SYSCLK时钟频率。

实验代码
实验05_俄罗斯方块.rar (836.2 KB, 下载次数: 3)

评分

1

查看全部评分



回复

使用道具 举报

325

TA的帖子

8

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 6 天前 | 显示全部楼层
这可以刷吗?,能消除方块?


回复

使用道具 举报

93

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 5 天前 | 显示全部楼层
哈哈,这个很强,mobaxterm作为串口终端,使用整页刷新的那个指令吗?如果用串口助手应该不行吧。
http://www.crazyee.com
我的网站
我的博客


回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 前天 09:17 | 显示全部楼层
lehuijie 发表于 2019-1-13 17:16
这可以刷吗?,能消除方块?

使用VT终端控制码,可以操作字符的位置,前景色和背景色,当然可以消除方块


回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 前天 09:17 | 显示全部楼层
hotsauce1861 发表于 2019-1-14 09:42
哈哈,这个很强,mobaxterm作为串口终端,使用整页刷新的那个指令吗?如果用串口助手应该不行吧。

串口助手不支持VT控制码,用串口助手的话,能看到原始的控制码数据


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-1-19 01:56 , Processed in 0.162015 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表