NUCLEO-L053R8 RCC时钟树 MCO输出
RCC时钟配置实验
最近玩了一下Nucleo-L053R8板子,即STM32L053R8T6。浏览了RCC章节后,顺便做了个小实验,现在给大伙分享一下。
实验非常简单,配置一下系统时钟,可以通过肉眼观察LED的闪烁快慢,精确的话,可以通过数字示波器监控RCC的MCO引脚的输出。为了保证实验的严谨性,本次通过数字示波器监控RCC的MCO引脚的输出。
开始实验之前,先给大伙稍微讲一下MCO 时钟输出的知识:
图1 RCC时钟树
MCO 时钟输出:
MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在STM32L053R8T6中 由 PA8、PA9复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振。
MCO的时钟来源可以是:LSE、LSI、HSE、HSI 16、PLLCLK、SYSCLK、MSI、HSI 48,具体选哪个由时钟配置寄存器的相应位决定。除了对外提供时钟这个作用之外,我们还可以通过示波器监控 MCO 引脚的时钟输出来验证我们的系统时钟配置是否正确。
图2 MCO时钟来源
STM32CubeMx:
了解了MCO时钟输出的知识后,我们就可以真正开始实验了。
首先,我们通过STM32CubeMx生成我们需要的项目工程。STM32CubeMX 是意法半导体STMCube™的主动原创,可以减轻开发工作、时间和费用。STM32Cube 覆盖了 STM32 系列。STM32Cube 包括 STM32CubeMX,STM32CubeMX是一款图形化软件设置工具,允许使用图形化向导来生成 C 初始化代码。它也集成了 一个全面的软件平台,支持每一个系列(例如STM32F4系列的STM32CubeF4)。通俗地说,一方面大大减少了工作量,另一方面也有利于菜鸟的入门学习。通过STM32CubeMx生成项目工程的主要步骤如下:
Nucleo-L053R8板子有两个RCC_MCO引脚,分别为:
RCC_MCO1 -----> PA8
RCC_MCO2 -----> PA9
本次实验监控PA8引脚输出,测试的系统时钟来源于HSI,配置成32MHz。你也可以选用PA9输出或者配置不同的系统时钟。
图3 引脚配置
图4 时钟配置
图5 生成项目工程
到了这一步骤,就可以Open Project开始实验了。代码很简单,且项目工程都已配置好相关GPIO和RCC时钟,直接用数字示波器监控PA8引脚的输出(MCO时钟输出)来判断我们的系统时钟是否配置正确即可。
部分代码如下:
/** Configure pins
PA8 ------> RCC_MCO
*/
static void MX_GPIO_Init(void)
{ GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{ RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = ;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
} /**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
} HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); /**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/); /**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, , );
} int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* Initialize all configured peripherals */
MX_GPIO_Init(); /* Configure the system clock */
SystemClock_Config(); while ()
{
}
}
一开始,我把编译好的程序下载到开发板里,发现数字示波器无输出波形,然后看了一下代码,发现在main函数中,系统时钟配置函数SystemClock_Config()放在了GPIO配置函数MX_GPIO_Init()之前了,而RCC_MCO配置函数放置在系统时钟配置函数中,这就导致了RCC_MCO的GPIO引脚并未配置成复用推挽输出就进行了RCC_MCO配置。我把GPIO配置函数MX_GPIO_Init()放在系统时钟配置函数SystemClock_Config()之前,数字示波器就出现了波形。所以,我们平时在编写代码的时候,应养成一个良好的编程习惯。以上只是我个人对问题的解答,若有不对之处,欢迎指出,共同学习,共同进步。
如果你不清楚Nucleo板子上PA8、GND具体在哪个引脚,那么你可以查阅STM32 Nucleo-64 boards的用户手册(User manual)---> Hardware layout and configuration ---> Extension connectors ---> Figure 20.NUCLEO-L053R8
图6 Extension Connection引脚图
根据上面的引脚图,用两根杜邦线从Nucleo板子上引出PA8、GND,然后用数字示波器来监控。实物连接如下:
图7 实物连接图
把编译好的程序下载到开发板,设置不同的系统时钟,用示波器监控 MCO 引脚输出的波形频率来判断我们的系统时钟是否配置正确。
图8 数字示波器波形图
从波形图可见,监控到RCC时钟频率为32MHZ,与实验时钟配置相符。以上就是RCC时钟配置的一个小实验。希望对有需要的同学有所帮助。谢谢!!!
NUCLEO-L053R8 RCC时钟树 MCO输出的更多相关文章
- RCC—使用 HSE/HSI 配置时钟 ---时钟树
本章参考资料:< STM32F4xx 中文参考手册> RCC 章节.学习本章时,配合< STM32F4xx 中文参考手册> RCC 章节一起阅读,效果会更佳,特别是涉及到寄存器 ...
- STM32学习笔记:【001】时钟树与RCC
导言 如果学过单片机的同学应该不会陌生,学习51单片机时最经常听到的就是“最小系统”. 最小系统里面少不了晶振,否则单片机无法工作. 单片机需要晶振(时钟源)来工作,那么对于STM32芯片同样如此. ...
- 【stm32】时钟树解析
有时候会突然忘了这个重要的时钟树,这里转载一个比较好的,以防忘记. STM32时钟系统 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频 ...
- STM32—时钟树(结合系统时钟函数理解)
时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处.心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来 ...
- STM32入门系列-STM32时钟系统,STM32时钟树
时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行.时钟系统犹如人的心脏,一旦有问题整个系统就崩溃.我们知道STM32属于高级单片机,其内部有很多的外设,但不是 ...
- Linux下时钟框架实践---一款芯片的时钟树配置
关键词:时钟.PLL.Mux.Divider.Gate.clk_summary等. 时钟和电源是各种设备的基础设施,整个时钟框架可以抽象为几种基本的元器件:负责提供晶振 Linux内核提供了良好的CC ...
- 使用HSE配置系统时钟并用MCO输出监测系统时钟
使用模板,在User下新建文件夹RCC 新建bsp_rccclkconfig.h和bsp_rccclkconfig.c 工程和魔术棒添加 对照着上节的RCC源文件编写: void HSE_SetSys ...
- H面试程序(1)编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的 下一秒
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒. 如输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005年 1 月 1 日 0 时 0 分 0 秒. ...
- ICC_lab总结——ICC_lab4:时钟树综合
时钟树综合的理论知识总结在这里:http://www.cnblogs.com/IClearner/p/6580034.html 下面是实践环节:使用ICC进行时钟树综合. 这个实验的目标是: ·设置C ...
随机推荐
- 一道算法题-从1到n整数中1出现的次数
1. 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次. 2. 题目来源 第一次看到是在 ...
- 请教前辈:关于JS的一个奇怪的错误,不知是解析顺序造成的,还是什么原因。。
各位前辈好,如题,不知道是HTML解析顺序造成的,还是JS预编译的结果(见注释). 烦请各位前辈进行指导. <!DOCTYPE html> <html> <head> ...
- nginx里配置跨域
发布于 881天前 作者 wendal 1404 次浏览 复制 上一个帖子 下一个帖子 标签: nginx 跨域 if ($request_method = OPTIONS ) { add ...
- postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径
自己的最短路径实现基本上是按照参考博文的1.2和3进行的,实现的时候也是问题不断,只能是一个一个解决. 问题1:自己发布的geoserver服务无法和OSM底图叠加到一起. 解决:参考博文2提到发布服 ...
- commons dbcp.jar有什么用
主流数据库连接池之一(DBCP.c3p0.proxool),单独使用DBCP需要使用commons-dbpc.jar.commons-collections.jar.commons-pool.jar三 ...
- 机器学习之感知器算法原理和Python实现
(1)感知器模型 感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数. (2)感知器学 ...
- Linux总结(十二)set_uid set_gid stic_bit 软链接 硬链接
一 set_uid 之前我们修改普通用户的登陆密码,都是以管理员身份在操作,比如我们在lv账户下,我们使用sudo passwd lv 重置lv账户密码,此时我们直接拿到root权限忽略掉了文件权限的 ...
- 理解HTML DOM
DOM(Document Object Model)全称文档对象模型.DOM其实是JavaScript操作网页的一套API接口,定义了访问和操作HTML文档的标准.定义了所有HTML元素的对象和属性, ...
- Charles Proxy v4.1.3 Mac、Win64、Win32破解版
http://charles.iiilab.com/ 1. 下载Charles Proxy 4.1.3版本,百度云盘下载 或 去官网下载 2. 安装后先打开Charles一次(Windows版可以忽略 ...
- [转]MFC子线程更改图像数据后更新主窗口图像显示方法
程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...