注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

lvxinn2006的个人空间 http://home.eeworld.com.cn/space-uid-757599.html [收藏] [复制] [分享] [RSS]

日志

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

已有 31 次阅读2019-1-10 22:55 |个人分类:MCU

本次活动测评开发板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单元主要用来控制整个芯片系统各个功能单元的复位与时钟的控制,这里主要用到了时钟控制。
对时钟的控制基础主要依赖于系统的时钟树,与系统主频相关的部分如下图所示:
实际上也就是需要通过各种设置,使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中:
在这个寄存器中,主要关心的就是几个数值MNPQR,结合时钟树以及寄存器的公式描述,能够很清楚的了解每个位段的作用。
这里最重要的两个参数就是MN,这两个决定了锁相环PLL内部fvco的频率,三路的输出时钟都以这个频率为基准进行分频,所以需要对MN进行合理取值。
配置完PLL参数后,需要启动PLL,主要使用了RCC_CR寄存器
需要开启[24]位,并且需要通过检测[25]位来检测PLL是否正常工作。一切正常以后,就可以把SYSCLK时钟源切换到PLLRCLK了,主时钟源的选择主要用到了RCC_CFGR
在这里设置[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时钟频率。
实验代码

【实验现象】
· 连接开发板,并打开超级终端软件,并使用115200的波特率连接开发板的串口(注意:只能使用超级终端软件,不能使用串口调试助手,串口调试助手只能看到原始的终端控制码)
· 开发板复位以后即开始游戏,使用键盘按键控制方向
                        S        ——左
                        D        ——下
                        F        ——右
                        E        ——切换方向
                        空格键暂停/继续游戏
                        R        ——重新开始
在终端中显示如下:



此内容由EEWORLD论坛网友lvxinn2006原创,如需转载或用于商业用途需征得作者同意并注明出处

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2019-1-19 01:59 , Processed in 0.032887 second(s), 11 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部