基于寄存器与基于固件库的stm32 LED流水灯

一、基于寄存器

1.创建工程

打开keil软件,新创建一个项目文件,正确选择开发板,并在网上下载启动文件,将stm32的启动文件startup_stm32f10x_md.s插入到工程中,并添加一个main函数。
在这里插入图片描述

2.设置hex文件

首先找到魔法棒,然后选择output,点击creat hex file,如果为默认路径即可以在objects项目文件中找到,也可以自己选择存放路径,选择slect folder for objects自己更换路径。
在这里插入图片描述

3.在main函数中添加代码

在这里插入图片描述
完整代码如下:

#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(){
	
}

点击进行编译

4.硬件连接

GND 连 GND
3V3 连 3V3
TXD 连 A10
RXD 连 A9
可根据程序得知,3个led灯分别于A0,B0,C15相接。小灯长的一边连接正极,短的一边连接负极
如图所示
在这里插入图片描述
在这里插入图片描述

打开串口助手,选择自己存放的hex路径,按一下开发板上面的开关,点击开始编程。
在这里插入图片描述
调试结果如下

D9071CC38E89B52FF89E28FABC335DC7

二、基于STM32标准库函数的LED流水灯实验

1.STM32标准库函数简要介绍及与寄存器编程的区别

STM32标准库是一套由STMicroelectronics提供的软件库,用于简化STM32微控制器上开发应用程序的过程。它包含了许多常用的函数和驱动程序,可用于配置和操作STM32微控制器的各种硬件资源。

STM32标准库函数可以分为几个主要类别:
系统初始化函数:用于初始化系统时钟、中断向量表和其他系统设置。
GPIO函数:用于配置和操作通用输入/输出端口,包括设置引脚方向、读取和写入引脚状态等。

外设驱动函数:用于配置和操作各种外设,如串口、SPI、I2C等。这些函数包括初始化外设、发送和接收数据等。
中断处理函数:用于配置和处理中断。它们允许您定义中断服务函数,并将其与特定的中断源关联起来。
与寄存器编程相比,STM32标准库函数的主要优势在于简化了开发过程。使用标准库函数,您可以通过调用封装好的函数来配置和操作硬件资源,而无需直接访问寄存器。这样可以减少编写大量底层代码的工作量,并提高开发效率。

2.下载标准外设库并使用库中文件

所有配置函数需要在ST官网进行下载:
https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html

3.新建一个文件存放delay.c以及delay.h代码

在这里插入图片描述

delay.c

#include "delay.h"
// 	 
//如果需要使用OS,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=nms*9000;			//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           			//清空计数器
	SysTick->CTRL=0x01 ;          			//开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL=0x00;      	 			//关闭计数器
	SysTick->VAL =0X00;       				//清空计数器	
//u16 i=0;
//while(nms--){
//i=10000;
	//while(i--);
//}	
} 
#endif 




delay.h

#ifndef __DELAY_H
#define __DELAY_H 			   
#include "sys.h"  
void delay_ms(u16 nms);
#endif


主函数

#include "stm32f10x.h"                  // Device header
#include "delay.h"

int main(void)
{
	//时钟配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启PA5口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启PB9口的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//开启PC14口的时钟
	//输入输出模式设置,输出速度设置
	GPIO_InitTypeDef GPIO_InitStructureA, GPIO_InitStructureB, GPIO_InitStructureC;
	// 配置A5
	GPIO_InitStructureA.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureA.GPIO_Pin = GPIO_Pin_5;// 选择5号引脚
	GPIO_InitStructureA.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置B9
	GPIO_InitStructureB.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureB.GPIO_Pin = GPIO_Pin_9;// 选择9号引脚
	GPIO_InitStructureB.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	//配置C14
	GPIO_InitStructureC.GPIO_Mode = GPIO_Mode_Out_PP;// 点灯用推挽输出
	GPIO_InitStructureC.GPIO_Pin = GPIO_Pin_14;// 选择14号引脚
	GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz;//选择输出速度
	
	GPIO_Init(GPIOA, &GPIO_InitStructureA);// GPIOA外设的5号引脚配置为推挽输出、50MHz速度
	GPIO_Init(GPIOB, &GPIO_InitStructureB);//GPIOB外设的9号引脚配置为推挽输出、50MHz速度
	GPIO_Init(GPIOC, &GPIO_InitStructureC);//GPIOC外设的14号引脚配置为推挽输出、50MHz速度
	while(1)
	{
		//A亮
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);//Bit_RESET电平0,Bit_SET电平1
		delay_ms(1000);
		//B亮
		GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_RESET);
		delay_ms(1000);
		//C亮
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, Bit_SET);
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
		delay_ms(1000);
		GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
	}
	
}




4.测试

F7733B7FA5255925367EEFC33A6A3848

5.波形图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值