文章目录
- 搭建机器人电控系统——MCU基石
- 时钟配置
-
- 参考手册中的时钟树
- 时钟软件配置
搭建机器人电控系统——MCU基石
在上一章中,我讲解了搭建一个机器人电控系统的前期准备工作,包括电源的选择和主控的开发,经过一些基础的单片机任务之后,现在你应该对单片机的一些编程习惯有了掌握。
在本章中,我将会按照一个机器人的底盘到上层机构的顺序,单独来对每一个机构的电控部分进行讲解。从中分别来详细展示运动模型、通信协议、PWM输出和算法部分,从而让你学会如何用MCU去控制每个部分机构的运动。
不过在这之前,我会以STM32F407为例,先补充一些关于MCU的基本知识原理:
STM32系统架构
STM32时钟配置
GPIO原理
中断NVIC与EXTI
时钟配置
在画一块主控的讲解中,曾经讲解过一个晶振电路。晶振好比单片机的心脏,如果没有心脏起跳,单片机也将无法在正常工作,单片机收到一个脉冲,就执行一次或多次指令。
参考手册中的时钟树
再查看STM32F4参考手册中的时钟树,现在来看就很清晰了。我们把时钟树分成两半来看,左边的那条主干就是时钟信 的输入;而右边讲的是时钟信 到了哪里,也就是什么地方需要时钟信 ,需要多大的时钟信 :
左端时钟信 输入线:
-
输出
输出②:时钟信 输出引脚,即MCU系统的时钟信 可以通过某个引脚输出,通过示波器可以看到时钟信 的变换波形,并且你可以选择分频系数。
RCC_MCO1Config(RCC_MCO_X,RCC_MCO1Div_X);
可以作为输出的时钟信 :SYSCLK、HSI、HSE、PLLCLK_Div2
外设总线AHB:
以上,这就是为什么我们在编所有程序的时候,第一就是要使能那个功能对应的时钟,只有时钟信 到达了,整个功能才能开始工作。
现在让我们来看一个串口时钟配置的例子:
HSI、HSE、PLLCLK通过SW进行选择后得到SYSCLK,再得到AHB线时钟和APB线时钟。
外设USART1挂载在APB2总线上,所以先要对APB2总线时钟进行使能,让时钟信 能够到达外设USART1。
外设GPIOA挂载在AHB1上,所以先对AHB1总线时钟进行使能,让时钟信 能够到达外设GPIOA。
时钟软件配置
我们讲了很多选择器,选择哪个是不确定的。很多分频器,分频系数是不确定的。但是你会发现在我们串口使能并没有选择这些参数,仅仅是使能打开了那个通道。事实上,这些参数都在你开发一个主控导入的那一系列启动文件中所定义了。所以在本节中,将会介绍软件上是如何决定这些参数的。
①参数一:单片机选择了哪个时钟源r> system_stm32f4xx.c文件:
由说明备注知道,这个文件有两个函数:
①SystemInit():设置系统时钟函数,包括:
- 时钟源是哪个li>
- PLL锁相环中的系数是多少li>
- AHB/APB预分频器的分频是多少r> (看,是不是解决了之前参数的问题)
②SystemCoreClockUpdate():用于更新变量SystemCoreClock ,这个变量的赋值是HCLK或者说主频,这个变量被用于去实现Cortex内核自带的那个定时器,用于程序延时。
整个文件的工作过程:
单片机上电复位/或按键复位后,程序先执行startup_stm32f4xx.s启动函数,启动函数中默认选择HSI(16MHZ)作为时钟源。system_stm32f4xx.c在startup_stm32f4xx.s中被调用,执行其中的SystemInit()函数,而在这个函数中除了复位一些寄存器的初始位置外,经过了一个叫做SetSysClock()的函数:
这个函数是这样的:
- HSI(16MHZ)
- HSE(4—25MHZ)
- PLLCLK(HSE经过PLL锁相环得到)
由此我们得出结论:在MCU的启动过程中,先默认把HSI(16MHZ)作为时钟源启动,然后再经过SystemInit()中的SetSysClock()函数,将HSE作为时钟源经过PLL锁相环后的时钟作为真正的系统时钟!
②参数二:分频系数是多少strong>
现在我们知道了单片机选择的时钟的具体路线,现在关键就是如何确定路线上的分频系数,这些分频系数包括:分频系数M,倍频系数N,分频系数P,如下图。
根据公式计算:系统时钟SYSCLK=8MHZ*N/M/P=168MHZ,即SYSCLK的最大频率:
- 第一句话告诉我们:系统默认运行出来的系统时钟频率为168MHZ,这也应证了我们之前的理论。
- 第二句话告诉我们:HCLK=SYSCLK/1,即AHB时钟线频率=SYSCLK=168MHZ。
- 第三句话告诉我们:PCLK2=HCLK/2,即APB2时钟线频率=HCLK/2=84MHZ。
- 第四句话告诉我们:PCLK1=HCLK/4,即APB1时钟线频率=HCLK/4=42MHZ。
以上是分频系数的选择,这是初始化默认的分频,当然你可以改成其他分频。
其实在system_stm32f4xx.c开头的表格中已经告诉过我们所有参数的默认值:
挂载在AHB2上的设备:
挂载在APB1上的设备:
回到串口那个问题

为什么使能是这样写的p>
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!