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”下载代码。