前言
一、软件及文件下载准备
[百度网盘下载链接]https://pan.baidu.com/s/1Lk-eke0Lssc8rLluKZjulg
提取码:1145
二、操作步骤
新建项目
(1)创建项目light(项目名)并在项目文件夹light2(文件夹名)里新建如下图四个文件夹(直接创建)
(2)在第一个文件夹里创建LED文件夹用于存放之后所需的文件
(3)将文件创建时自动生成的如图三个文件夹移入OBJ文件夹
(4)复制之前链接里下载的system文件夹里的内容到新建的SYSTEM文件夹里(完成后如图)
(5)将项目light创建时生成的如图文件移动到USER文件夹
(6)如下图项目栏所示的文件夹里分别鼠标右键add(添加)启动文件starup_stm32f10x_md.s、sart.c、sys.c和delay.c(这四个文件在链接里有直接复制过去就行)。之后的text.c文件以及led.c和led.h都需要自己新建并写入以下代码,之后再右键add到相应图示项目栏文件夹里‘
右键添加文件方法:
text.c代码:
#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与 LED 连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=0;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=1;
LED2=0;
delay_ms(1000);
}
}
led.c
#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
// RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
// RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5 推挽输出
GPIOB->ODR|=1<<5; //PB.5 输出高
GPIOB->CRL&=0XFFFFFFF0;
GPIOB->CRL|=0X00000003;//PB.0 推挽输出
GPIOB->ODR|=1<<0; //PB.0 输出高
GPIOA->CRL&=0XFFFFFF0F;
GPIOA->CRL|=0X00000030;//PA.1 推挽输出
GPIOA->ODR|=1<<1; //PA.1 输出高
}
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化
#endif
(7)右键点击Target1之后点击Manage project item
(8)按照下图手动输入添加第二个表格里的groups,第三个表格file里只需要点击add files按照电脑给出的路径找到并对应添加下图所示文件(不需要手动输入,但每个group里对应的files都要添加齐全)
三、编译前的基础设置
(9)打开魔法棒,找到output(输出设置栏)勾选蓝色处用于编译生成hex文件,点击绿色处用于找到OBJ路径设置为文件生成路径
(10)output设置完成后找到c/c++栏,在define输入如图字符,之后再include path里添加路径(在include右边有三个小点(…))点击之后在弹出的Folder setup里手动输入路径(这里可以直接找到文件夹右键复制路径再粘贴即可,如下图)
找到文件所在位置并复制地址
四、编译
(11)编译成功并创建了hex文件
可以在OBJ(之前设置的路径)里找到hex文件
五、烧录以及硬件连接
(12)在之前网盘里有Flymcu软件,打开从下载(用于烧录代码进芯片)
(13)打开Flymcu并如图设置:
红色:勾选即可
蓝色:在硬件连接完成前先不用管,硬件连接完成插口后插入电脑后,先搜索串口,然后在port里选择对应的串口(不一定是图中的COM7),最后将bps设置为115200
黄色:找到生成的hex文件
紫色:如若勾选了,取消勾选
橙色:选择DTR低电平复位,RTS高电平进bootLoader
(14)硬件连接
3v3——3v3
GND——GND
TXD——A10
RXD——A9
接小灯前了解代码中的端口定义以便正确接入小灯:这里指明了小灯需接入在B5、B0、A1插口处
流水灯闪烁:
流水灯3
六、基于寄存器的流水灯
由于之前的基本操作的的学习,这里我们只需要将main.c(下附代码)和starup_stm32f10x_md.s(之前网盘下载的文件里有)添加到source group1里,然后打开魔法棒找到output选择生成hex文件并修改路径为这个项目文件的路径即可(这里我新建light4文件夹并放在里面了,之前那个是light2文件夹),最后打开flyMCU找到生成的hex文件,最后烧录,线路连接时接在A0、B0、C15即可。
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRL (*(unsigned int *)0x40010C00)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
int main(){
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
// 设置 GPIO 为推挽输出
// 设置 GPIOB 最后四位为 0001 (B0)
GPIOB_CRL |= (1<<0); // 最后一位设置为1
GPIOB_CRL &= ~(0xE); // 倒数二、三、四位设置为0
// 设置 GPIOC 前四位为 0001 (C15)
GPIOC_CRH |= (1<<28); // 第四位设置为1
GPIOC_CRH &= ~(0xE0000000); // 前三位设置为0
// 设置 GPIOA 最后四位为 0001 (A0)
GPIOA_CRL |= (1<<0); // 最后一位设置为1
GPIOA_CRL &= ~(0xE); // 倒数二、三、四位设置为0
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<0); // 最后一位设置为1
GPIOC_ODR |= (1<<15); // 倒数第15位设置为1
GPIOA_ODR |= (1<<0); // 最后一位设置为1
while(1){
GPIOB_ODR &= ~(1<<0); // 点灯1
Delay_ms(1000);
GPIOB_ODR |= (1<<0); // 灭灯1
Delay_ms(1000);
GPIOC_ODR &= ~(1<<15); // 点灯2
Delay_ms(1000);
GPIOC_ODR |= (1<<15); // 灭灯2
Delay_ms(1000);
GPIOA_ODR &= ~(1<<0); // 点灯3
Delay_ms(1000);
GPIOA_ODR |= (1<<0); // 灭灯3
Delay_ms(1000);
}
}
void SystemInit(){
}
结果:
流水灯2
所需接线种类
这三种线建议集齐最好缺少某种完成起来就很麻烦
七、总结
这次通过两种方式实现LED流水灯,去对于初学者的我来说,还是有些地方不是很容易搞清楚。实验过程,开始编译烧录后,灯一直不亮,我一直以为是程序的问题,结果最后发现是接线错误,所以一定要仔细检查自己的器件链接是否正确再看代码也不迟