作为一名STM32嵌入式学习的新人,我希望把我学习STM32潘多拉开发板的一些实验经历和学习经历记录下来,最好能够给大家一点点帮助。
1、程序烧录的设置:
作为玩单片机的电子生,我们的实验第一步都是点亮LED,但是STM32的程序下载和C51不太一样,需要用到ST Link或者J Link,但是有些开发板是集成了有ST Link的,例如本实验开发板,如图所示:
下载程序点击 ARM Keil 的download,或者按F8。但是我们光把USB线插入到这个接口是没用的,会显示
所以我们要先配置一下电脑的串口,我是下载这个程序软件配置的(需要的朋友可以私聊我):
配置完后是这样:
然后就可以点击Download烧录程序到板子上了:
下载好后的板子运行的第一个程序。
OK,现在解决了烧录的问题,我们来开始聊代码。
2、头文件的浅聊
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
(1)这个代码中,rtthread.h是RT-Thread系统的头文件,用于一些常用函数、宏、数据结构的定义等。在本实验例程中,用到的定义的函数有rt_thread_mdelay()等,可以自己去rtthread.h头文件中查看定义了哪些函数,去了解一下定义的结构那些。
(2)rtdevice.h是RT-Thread设备驱动的头文件。在本次实验中,我们用到了实验板中的引脚,所以需要定义一下设备的引脚pin。
(3)board.h是RT-Thread用于定义和配置开发板的头文件。具体有什么用还在了解中……
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
这里,`DBG_TAG` 的定义为 `main`,表示调试标签为 "main"。这个宏可以在调试输出中作为标识符,用于标记与主要代码逻辑相关的调试信息。`DBG_LVL` 的定义为 `DBG_LOG`,表示调试级别为 `DBG_LOG`。这个宏用于指定调试输出的级别,可以根据不同的需求来调整调试信息的显示详细程度。(具体啥用也还在了解中……)
rtdbg.h头文件应该是定义程序中的打印函数:
LOG_D("led on, count: %d", count);
这里用LOG_D()来代替printf()。
定义好环境后,可以开始编写后面的程序:
在看主程序之前,首先了解一下RGB灯引脚的定义以及点亮的方式。在Drivers文件里面有drv_gpio.h头文件(drv_gpio.c有),该头文件里面中定义了RGB的引脚以及一些按键和蜂鸣器的引脚:
// BEEP && LED && KEY
#define PIN_BEEP GET_PIN(B, 2) // PB2 : BEEP --> BEEP
#define PIN_LED_R GET_PIN(E, 7) // PE7 : LED_R --> LED
#define PIN_LED_G GET_PIN(E, 8) // PE8 : LED_B --> LED
#define PIN_LED_B GET_PIN(E, 9) // PE9 : LED_G --> LED
#define PIN_KEY2 GET_PIN(D, 8) // PD8 : KEY2 --> KEY
#define PIN_KEY1 GET_PIN(D, 9) // PD9 : KEY1 --> KEY
#define PIN_KEY0 GET_PIN(D, 10) // PD10: KEY0 --> KEY
#define PIN_WK_UP GET_PIN(C, 13) // PC13: WK_UP --> KEY
在RGB引脚定义中,例如R灯的引脚,在芯片中定义R灯的引脚是pin 57,则定义#define PIN_LED_R GET_PIN(E, 7),表示R灯的引脚是E区的7(意思就是引脚57?)芯片引脚如图所示:
3、主函数
OK,我们继续来看主函数,该函数的功能是使RGB灯中的R灯每秒亮灭1次,500ms亮,500ms灭。
/* 配置 LED 灯引脚 */
#define LED_PIN PIN_LED_R //定义LED_PIN为红色的RGB灯R灯的引脚
int main(void)
{
unsigned int count = 1;
/* 设置 LED 引脚为输出模式 */
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); //定义该R灯的引脚为输出模式。
while (count > 0)
{
/* LED 灯亮 */
rt_pin_write(LED_PIN, PIN_LOW); //写LED_PIN引脚为低电平模式,灯亮
LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯灭 */
rt_pin_write(LED_PIN, PIN_HIGH); //写LED_PIN引脚为低电平模式,灯灭
LOG_D("led off");
rt_thread_mdelay(500);
count++;
}
return 0;
}
那么,根据这个代码,我们可以写一些让R、G、B三灯轮流闪烁的情况,代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/* 配置 LED 灯引脚 */
#define LED_PIN1 PIN_LED_R
#define LED_PIN2 PIN_LED_G
#define LED_PIN3 PIN_LED_B
int main(void)
{
unsigned int count = 1;
/* 设置 LED 引脚为输出模式 */
rt_pin_mode(LED_PIN1, PIN_MODE_OUTPUT);
rt_pin_mode(LED_PIN2, PIN_MODE_OUTPUT);
rt_pin_mode(LED_PIN3, PIN_MODE_OUTPUT);
while (count > 0)
{
/* LED 灯亮 */
rt_pin_write(LED_PIN1, PIN_LOW);
// LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯灭 */
rt_pin_write(LED_PIN1, PIN_HIGH);
// LOG_D("led off");
rt_thread_mdelay(500);
/* LED 灯亮 */
rt_pin_write(LED_PIN2, PIN_LOW);
// LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯灭 */
rt_pin_write(LED_PIN2, PIN_HIGH);
// LOG_D("led off");
rt_thread_mdelay(500);
/* LED 灯亮 */
rt_pin_write(LED_PIN3, PIN_LOW);
// LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯灭 */
rt_pin_write(LED_PIN3, PIN_HIGH);
// LOG_D("led off");
rt_thread_mdelay(500);
count++;
}
return 0;
}
在这串代码中,我们首先定义了RGB三个引脚为输出模式,然后默认为低,所以会三灯全亮:
然后就是在循环中R、G、B三灯轮流闪烁: