寄存器和标准库的stm32 LED流水灯闪烁


前言

一、软件及文件下载准备

[百度网盘下载链接]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.cled.h都需要自己新建并写入以下代码,之后再右键add到相应图示项目栏文件夹里‘在这里插入图片描述
右键添加文件方法
右键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流水灯,去对于初学者的我来说,还是有些地方不是很容易搞清楚。实验过程,开始编译烧录后,灯一直不亮,我一直以为是程序的问题,结果最后发现是接线错误,所以一定要仔细检查自己的器件链接是否正确再看代码也不迟

八、参考

STM32点亮流水灯详解
面包板的使用方法
基于寄存器和固件库的stm32 LED流水灯

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值