【STM32嵌入式系统设计与开发】—— 4流水灯应用


STM32资料包:
百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888
提取码:8888


一、任务描述

在这里插入图片描述

二、任务实施

在这里插入图片描述
观察流水灯电路图,电流 -------->发光二极管--------->端口,故IO口低电平灯亮,高电平熄灭。
在这里插入图片描述

1、led工程文件夹创建

步骤1:复制 2KEIL工程的建立链接 中建立的工程,重命名为2_LEDTest。
在这里插入图片描述
步骤2:将output中的obj和lst两个文件夹内的文件全部删除
在这里插入图片描述
步骤3:将projects文件夹保留“LEDTest.uvprojx”文件并删除其他文件
在这里插入图片描述
步骤4:运行“LEDTest.uvprojx”文件,点击“Options for Target”目标选项中的“Output”设置输出,修改“Name of Executable”后内容为“LEDTest”。
在这里插入图片描述
步骤5:在bsplibrary/hardware文件夹下新建1_LED文件夹,并在该文件夹下新建“led.c”和“led.h”两个文件
在这里插入图片描述
步骤6:工程添加文件,点击“Manage Project Items”下的bsplibrary/hardware组中在点击“Add Files…”跳转到bsplibrary/hardware/1_LED文件中选择文件类型为“All files(* .*)”鼠标上拉选择“led.c”和“led.h”文件,点击“Add”保存文件添加。最后点击管理项窗口的“OK”保存设置。
在这里插入图片描述
步骤7:添加文件夹设置添加,点击“Options for Target”目标选项中的“C/C++”中的“…”设置文件夹设置后添加路径为bsplibrary/hardware/1_LED,点击“OK”保存文件设置,点击“OK”保存目标选项。

请添加图片描述

2、宏定义

步骤1:头文件保护,LED 控制相关的声明、宏定义和函数原型。作用就好比是一道门,用来防止同样的东西被重复带进房间。

// led.h
#ifndef _LED_H
#define _LED_H





#endif

在这里插入图片描述

步骤2:添加led所需的内容但,中文出现乱码。打开配置修改编码为GB2321,并点击“OK”保存。
在这里插入图片描述
步骤3:添加LED 控制相关的宏定义等。核心板子为PA8高低电平转换,拓展端口为PA0 - PA7。

// An highlighted block
#include <stdint.h>         // 包含用于标准整数类型的头文件
#include "stm32f10x_gpio.h" // 包含 GPIO 头文件
#include "stm32f10x_rcc.h"  // 包含 RCC 头文件
#include "misc.h"           // 包含其他外设库的头文件
#include ".\sys\sys.h"      // 包含系统配置头文件

// 核心板板载LED宏定义
#define LED PAout(8) // 定义用于控制核心板板载LED的宏

// 开发板LED宏定义
#define LED1 PAout(0) // L4->PA0	
#define LED2 PAout(1) // L4->PA1	
#define LED3 PAout(2) // L4->PA2	
#define LED4 PAout(3) // L4->PA3	
#define LED5 PAout(4) // L4->PA4	
#define LED6 PAout(5) // L4->PA5	
#define LED7 PAout(6) // L4->PA6
#define LED8 PAout(7) // L4->PA7

在这里插入图片描述
在这里插入图片描述

步骤4:头文件添加

#include "led.h"

在这里插入图片描述

步骤5:GPIO初始化,本节主要对核心板的PA8和拓展的PA0-PA7GPIO端口配置。比喻为在厨房里先打开灯光,然后准备好要使用的所有工作台和炉灶,最后把所有的灯和炉灶都关闭,等待进一步的操作。

/*********************************************************************
 @Function  : LED IO初始化
 @Parameter : N/A 
 @Return    : N/A
**********************************************************************/
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;                  // 定义 GPIO 初始化结构体变量
    
    /* 时钟使能 */	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟
    
    /* 引脚配置 */	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;             // 将板载 LED 连接的引脚设置为 PA8
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      // 设置引脚为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 设置引脚的输出速度为 50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);                // 应用以上配置到 GPIOA 上
    
    GPIO_SetBits(GPIOA, GPIO_Pin_8);                      // 将 GPIOA 的引脚 PA8 设置为高电平,使得板载 LED 灭
}

/*********************************************************************
 @Function  : 开发板LED IO初始化
 @Parameter : N/A 
 @Return    : N/A
**********************************************************************/
void ExpLEDInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; // 定义 GPIO 初始化结构体变量
    
    /* 时钟使能 */	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟
    
    /* 引脚配置 */	
    GPIO_InitStructure.GPIO_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;  // D1-D8->PA0-PA7 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚的输出速度为 50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); // 应用以上配置到 GPIOA 上
    
    GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                          GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
}

在这里插入图片描述
步骤6、编写led灯控制函数,比喻为备好菜,等待主函数起灶时候直接调用使用。
在这里插入图片描述

/*********************************************************************
 @Function  : 开发板LED控制
 @Parameter : ledbit :LED状态 
 @Return    : N/A
**********************************************************************/
void ExpLEDSet(uint8_t ledbit)
{
  uint8_t i;
	for(i=0;i<8;i++)
	{
	 if(ledbit&0x01)
		PAout(i) = 1;
	 else
		PAout(i) = 0;
	 ledbit >>=1;
	}
}

在这里插入图片描述
步骤7:对函数进行声明

// 函数声明
void LED_Init(void); // LED初始化函数声明
void ExpLEDInit(void); // 外部LED初始化函数声明
void ExpLEDSet(uint8_t ledbit); // 设置外部LED状态函数声明

在这里插入图片描述

3、主函数编辑

步骤1:添加led.h头文件

#include "led.h"

在这里插入图片描述
步骤2:函数初始化

	uint32_t temp=0;
	delay_init();                   //启动滴答定时器
    usart1_init(9600);              //USART1初始化
	SystemTinerInit(1000-1,3600-1); //系统时间初始化 定时100ms
	LED_Init();                     //板载LED初始化
    ExpLEDInit();		            //开发板LED初始化
	ExpLEDSet(0XFF);                //关闭开发板所有灯       

	printf("初始化成功!\r\n");

在这里插入图片描述
步骤3:主函数功能实现,无线循环PA8端口高低电平每隔300ms转换,PA0 - PA7如果模式1依次熄灭,模式2依次点亮。

    if (WaitTimerOut(3))   	               // 如果定时器3超时,取反板载LED   
   	    LED=!LED;		
    
    // 如果定时器1超时
    if (WaitTimerOut(1))
    {
       
        if (status)                        // 如果当前状态为点亮
        { 
            temp = (temp << 1) & 0xFE;     // 顺序点亮          
            if (temp == 0x00) status = 0;  // 如果所有LED都被点亮,开始熄灭
                
        }   
        // 如果当前状态为熄灭
        else 
        {               
            temp = (temp << 1) | 0x01;     // 顺序熄灭            
            if (temp == 0xFF)              // 如果所有LED都被熄灭,开始点亮
                status = 1;
        }
        // 设置开发板LED的状态
        ExpLEDSet(temp);
    }

在这里插入图片描述

4、测试

可参考: 3KEIL工程仿真与编译
步骤1:软件仿真
步骤2:硬件测试点击"Rebuild"重建编译工程,点击“Options for Target”中选择“Debug”勾选"CMSIS-DAP Debugger"。设置目标驱动“Settings”中的“Flash Download”勾选上“Reset and Run”。点击"OK"保存设置。最后点击“Download”下载代码。
在这里插入图片描述

  • 35
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值