硬件与开发环境介绍
开发板:
本次选用的开发板是大疆创新的RoboMaster开发板C型,其上面采用高性能的STM32F407IG芯片。开发板C型具有如下外设:
用户自定义LED、5V接口、BOOT配置接口、micro USB接口、SWD接口、按键、可配置I/O接口、UART接口、CAN总线接口、PWM接口、DBUS接口、数字摄像头FPC接口、蜂鸣器、电压检测ADC、六轴惯性测量单元和磁力计。
这个也是我可以找到体积最小的板载陀螺仪的开发板,常用的接口也都有,很适合用在控制上。
软件环境:
IDE:RT-Thread Studio
RT-Thread:V4.1.0
STM32CubeMx:V6.7.0
STM32CubeProgrammer:V2.11.0
STM32CubeMonitor:V1.4.0
我平时开发常用的IDE实际上是Jetbrains家的Clion但是为了教程的通用性就选择了免费的RT-Thread Studio。
教程第一步:点灯
本次我们选择UART1作为我们的控制台串口,根据原理图我们得知发送脚为PA9,接收脚为PB7。
因此我们创建项目的选择如下
之后我们需要在CubeMX Setting中进行时钟树和引脚的配置。
在 System Core 下选择 RCC 选项,在 RCC mode and Configuration 中的 High Speed
Clock(HSE)下选择 Crystal/Ceramic Resonator
之后进行时钟树的配置,我们需要修改红框内的数据如下图
配置的根据如下:
Input frequency这个是根据板载的外部高速晶振来设置的,具体板子具体设置。
PLL的信号来源我们这里选择HSE(外部高速时钟),不选择HSI(内部高速时钟)是由于HSI时钟信号是由RC振荡电路产生的精度相对较差,而HSE时钟信号是由石英晶体产生精度相对而言更高,所以选择HSE。
后面灰色框内的M、N、P是PLL(锁相环)的分频倍频参数,将我们输入的HSE或者HSI时钟信号进行分频、倍频得到更高的时钟频率。这里我们配置的原因是因为我们希望SYSCLK(系统时钟)的频率达到STM32F407可到最高的168MHz。
系统时钟可以由三种时钟源来驱动
HSI振荡器时钟
HSE振荡器时钟
Main PLL时钟
而HSI和HSE在此处都不能到达168MHz因此我们这里我们这里选择通过PLL倍频后驱动SYSCLK。
因此PLL的三个参数也是通过凑出倍频后得到168MHz计算得到的。
最后我们修改的两处为配置AHB频率的预分频器,这里我们需要根据STM32F4xx中文参考手册来配置。根据下图我们可知APB1的最大频率为42MHz,APB2的最大频率为84MHz,因此我们的分频值分别设置为4和2来匹配最大频率。
后面我们点击顶部的 Pinout & Configuartion,选择 SYS,在 Debug 下拉框中选择 Serial Wire。
随后配置命令行串口所需的UART1引脚,配置哪一个引脚需要根据开发板原理图来设置,用于STM32许多引脚都有复用功能的,所以哪个引脚有什么功能是需要根据硬件来看的。原来创建工程的时候我们就看了原理图发送脚为PA9,接收脚为PB7,所以这里我们就直接设置。
由于我们这里要进行点灯所以我们来设置一下GPIO。根据原理图我们知道LED_B、LED_G、LED_R引脚分别为PH10、PH11、PH12,我们在CubeMX中进行配置。
把这三个引脚设置为GPIO_Output。
随后点击GENERATE CODE生成代码
根据原理图我们可以发现三个引脚不处于高电平的输出状态,那么三极管的控制端将会被下拉电阻拉为低电平,当 LED_B、LED_G 和 LED_R 处于高电平的输出状态,通过原理图中 1kΩ与 10kΩ的分压后,三极管的基极控制端将变成高电平,故而三级管的控制端电压将变成高电平。因此引脚为高电平时,LED灯亮。
在main函数中编写如下代码进行点灯。
/*
Copyright (c) 2006-2022, RT-Thread Development Team
SPDX-License-Identifier: Apache-2.0
Change Logs:
Date Author Notes
2022-12-29 RT-Thread first version
/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
/ 定义LED引脚 /
#ifndef LED_B_PIN
#define LED_B_PIN GET_PIN(H, 10)
#endif
#ifndef LED_G_PIN
#define LED_G_PIN GET_PIN(H, 11)
#endif
#ifndef LED_R_PIN
#define LED_R_PIN GET_PIN(H, 12)
#endif
int main(void)
{
/ 设置LED引脚为输出模式 */
rt_pin_mode(LED_B_PIN,PIN_MODE_OUTPUT);
rt_pin_mode(LED_G_PIN,PIN_MODE_OUTPUT);
rt_pin_mode(LED_R_PIN,PIN_MODE_OUTPUT);
int count=1;
while(count++)
{
rt_pin_write(LED_B_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_B_PIN, PIN_LOW);
rt_pin_write(LED_G_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_G_PIN, PIN_LOW);
rt_pin_write(LED_R_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_R_PIN, PIN_LOW);
}
return RT_EOK;
}
最终效果为红、绿、蓝三个灯依次亮灭。
原作者:goldengrandpa