stm32单片机-跑马灯实验

一、实验名称

跑马灯实验(配QSDP-X2实验箱)

二、实验目的

(1)掌握kiel软件使用方法,MDK5软件编译平台安装
(2)MDK5软件编译平台使用与新建工程
(3)stm32单片机的开发,了解什么是stm32,以及学习开发环境的搭建。
(4)掌握STM32基本I/O口输出操作

三、实验说明

相比较51单片机,STM32有许多远超51的功能,最明显也是最突出的是STM32精确的时钟,和超多的I/O引脚资源。

首先,要想学好STM32单片机,最基础的事,了解如何初步控制STM32单片机的引脚输出输入。STM32F103ZET6有7组I/O口,每组有16个I/O口,总计112个I/O资源。GPIOABCDEFG。这些I/O口除了做普通I/O外,还有许多复用外设功能,此后我们在实验中会一一介绍。本次试验主要向大家介绍STM32的I/O的8种不同工作模式,以及如何配置和该配置在何种情况下用。
1、STM32的I/O口总分为两大类,
(1)4种输入模式:
1)输入浮空
2)输入上拉
3)输入下拉
4)模拟输入
(2)4种输出模式:
1)开漏输出
2)开漏复用功能
3)推挽式输出
4)推挽式复用功能
2、此外每个I/O口的电平翻转速度可选为,
(1)2MHZ
(2)10MHZ
(3)50Mhz
3、上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
4、推挽输出与开楼输出的区别,
(1)推挽输出:
可以输出强高低电平,连接数字器件
(2)开漏输出:
只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极.,要得到高电平状态需要上拉电阻才行, 适合于做电流型的驱动,其吸收电流的能力相对较强(一般20ma以内)。
5、STM32的每组GPIO端口的寄存器包括:
(1)两个32位配置寄存器(GPIOx_CRL和GPIOx_CRH),
-GPIOx_CRL :端口配置低寄存器- GPIOx_CRH:端口配置高寄存器
(2)两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),
-GPIOx_IDR:端口输入寄存器
-GPIOx_ODR:端口输出寄存器
(3)一个32位置位/ 复位寄存器(GPIOx_BSRR),
-GPIOx_BSRR:端口位设置/清除寄存器
(4)一个16位复位寄存器(GPIOx_BRR),
-GPIOx_BRR:端口位清除寄存器
(5)一个32位锁定寄存器(GPIOx_LCKR)。
-GPIOx_LCKR:端口配置锁存寄存器
在使用库函数操作时,都是通过已封装好的库函数来对I/O口操作。
(具体请参考文档“STM32八种IO口模式区别.pdf”)

四、实验设备

1、STM32F103核心板—DCP-401模块。
2、-link下载器。
3、直流电源—QSDP-X2-01模块。
4、实验导线。
5、计算机

五、实验注意事项

1、实验前确保实验箱的板面整洁,板面无杂乱金属器件,以防造成核心板上电发生短路,损坏板载元器件。
2、实验中请仔细观察核心板原理图及其实验外设电路,以防出现连接线错误造成的短路、器件损坏现象。
3、实验时接线要采取外设电路“电源线最后”的原则,即先下载程序,再连接外设数据传输线路,最后连接外设店路电源。因此,要保证上电前的线路连接正确。
4、实验中若出现任何突发情况,请及时关闭实验箱右上角的“电源开关”。
5、试验后请先拔出电源“+12V”处的电源线,若以“J-link”供电,则先拔出“J-link”,再逐个拔出其余的板上连接线。合上实验箱。

使用STM32CubeIDE具体实验步骤如下:

步骤一:搭建开发环境

首先需要下载并安装STM32CubeIDE,该软件可以帮助我们进行程序编译、下载和调试。安装完成后,需要选择对应的芯片型号和开发板。

步骤二:创建工程

在STM32CubeIDE中创建一个新的工程,在创建工程的过程中需要选择芯片型号和配置外设资源等。创建完成后,工程目录中会自动生成各种驱动文件和库文件。

步骤三:编写程序

在“main.c”文件中编写程序代码。程序代码的主要功能是通过控制GPIO口的电平变化来实现跑马灯的效果。具体实现方式是通过设置GPIO口的输出模式为推挽输出,分别控制不同的GPIO口输出高低电平。

#include "main.h"

uint16_t LED_Pin[4] = {GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8};  // 定义四个LED灯对应的GPIO口

int main(void)
{
  HAL_Init();  // 初始化HAL库
  MX_GPIO_Init();  // 初始化GPIO口

  int led_index = 0;  // 定义LED灯的索引变量

  while (1)
  {
    HAL_GPIO_WritePin(GPIOA, LED_Pin[led_index], GPIO_PIN_SET);  // 打开当前LED灯
    HAL_Delay(200);  // 延时一段时间
    HAL_GPIO_WritePin(GPIOA, LED_Pin[led_index], GPIO_PIN_RESET);  // 关闭当前LED灯

    led_index++;  // 索引变量加一,选择下一个LED灯
    if (led_index >= 4)  // 判断索引变量是否超出范围
      led_index = 0;  // 如果超出范围则重新从第一个灯开始
  }
}
 

步骤四:编译、下载和调试

编写程序代码后,需要进行编译、下载和调试。首先进行编译,如果编译通过则可以进行下载。在下载之前需要将开发板连接到电脑,并选择对应的串口进行下载。下载完成后,可以进行调试验证程序是否正常运行。

在跑马灯实验中,我们通过控制四个LED灯的电平变化来实现跑马灯的效果。具体实现方式是通过设置GPIO口的输出模式为推挽输出,分别控制不同的GPIO口输出高低电平。在程序中我们使用了HAL库提供的GPIO口控制函数,通过循环实现了LED灯的不断闪烁。

使用Kile实现步骤

STM32单片机是一种高性能低功耗的嵌入式处理器,其拥有丰富的外设和强大的处理能力,可以广泛应用于各种嵌入式系统中。在本文中,我们将介绍如何使用STM32单片机实现一个跑马灯实验。

一、实验原理

跑马灯实验是最基础的实验之一,其原理是利用单片机的GPIO控制LED灯的亮灭,通过不同的灯光顺序和速度组合成不同的效果。本实验采用STM32F103C8T6单片机,并通过Keil C编译器进行程序设计。

二、实验器件

1、STM32F103C8T6单片机;

2、LED灯若干;

3、10K欧姆电阻若干;

4、面包板若干;

5、杜邦线若干。

三、实验步骤

1、连接硬件电路

将STM32单片机、LED灯、10K欧姆电阻和面包板连接成如下电路图所示的电路。其中,PB0~PB7引脚连接LED灯的正极,LED灯的负极通过10K欧姆电阻连接地。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YGfnd3oU-1692932134434)(https://user-images.githubusercontent.com/57705582/128339560-18d1dc83-7df3-44fb-a6d8-8c183ad7b748.png)]

2、新建Keil工程

在Keil环境下新建一个STM32F103工程,并进行如下配置:

(1)选择”Project” -> ”New uVision Project…”,并选择STM32F103C8作为目标器件。

(2)将”Device” -> ”Startup” -> ”system_stm32f10x.c”文件添加至工程中。

(3)在”Options for Target”中选择正确的芯片型号,并配置系统时钟频率为72MHz。

3、编写程序代码

在Keil环境下编写程序代码,代码如下:

#include "stm32f10x.h"
#include "delay.h"

#define LED_GPIO GPIOB
#define LED_PIN GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  
  GPIO_InitStruct.GPIO_Pin = LED_PIN;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(LED_GPIO, &GPIO_InitStruct);
}

void LED_Reverse(void)
{
  u8 i;
  for (i = 0; i < 8; i++)
  {
    GPIO_WriteBit(LED_GPIO, LED_PIN, Bit_RESET);
    GPIO_WriteBit(LED_GPIO, 1 << i, Bit_SET);
    delay_ms(100);
  }
}

int main(void)
{
  LED_Init();

  while (1)
  {
    LED_Reverse();
  }
}

程序代码中,先定义了LED_GPIO和LED_PIN宏定义,分别表示LED灯的控制引脚和控制位。在程序主函数中,首先调用LED_Init函数进行GPIO的初始化,然后通过LED_Reverse函数控制LED灯的亮灭。LED_Reverse函数使用循环控制LED灯的顺序和亮灭时间。

四、实验结果

编译程序后,将程序下载至STM32单片机中并运行,即可观察到跑马灯效果。当灯光流动到最后一盏灯后,便会重新从第一盏灯开始循环。

六、实验总结

1.实验软件安装很顺畅,学习开发环境也搭建完成。在进行代码编译时出现一个错误,可能与电脑设备有关,因为部分同学电脑未出现错误,随即我和另外的同学一起进行实验,链接好实验设备
2.程序仿真完成后,发光二极管会有规律的从左向右循环闪亮。
3.之后我们又利用写好的代码程序和实验箱进行了其他实验。
本文介绍了如何使用STM32单片机实现跑马灯实验。通过该实验,可以加深对STM32单片机GPIO的理解,掌握基本的程序设计技巧。在日后的嵌入式系统开发中,可以根据实际需求进行程序设计,实现更为复杂的功能。