基于寄存器&标准外设库的LED流水灯实验

一、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA/GPIOB/GPIOC端口控制LED灯,轮流闪烁,间隔时长1秒。

一、(一)新建项目

1.如图点击Project然后点击new uvision project

在这里插入图片描述

2.输入项目名称

在这里插入图片描述

3.点击魔法棒选择stm32芯片(注意:这里选择的芯片要与刚刚下载的保持一致)

在这里插入图片描述

4.创建项目出现的弹窗,只用勾选框内的CORE

在这里插入图片描述

5.点击魔法棒,选择output,勾选creat hex file然后点击ok

在这里插入图片描述

(二)编写代码

1.点击Target前的加号展开,右键点击source group,然后点击add new item

在这里插入图片描述

2.选择第一个,然后填写文件名字

在这里插入图片描述

3.写入代码

//APB2使能时钟寄存器
#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
//GPIOA配置寄存器
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
//GPIOB配置寄存器
#define GPIOB_CRH	*((unsigned volatile int*)0x40010C04)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
//GPIOC配置寄存器
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
//延时函数
void  Delay_wyd( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}

int main()
{
	int j=100;
	//开启时钟//APB2-GPIOA、GPIOB、GPIOC外设时钟使能	
	RCC_AP2ENR|=1<<2;			
	RCC_AP2ENR|=1<<3;			
	RCC_AP2ENR|=1<<4;			
	
	GPIOA_CRL&=0x0FFFFFFF;	//设置位 清零	
	GPIOA_CRL|=0x20000000;	//PB5推挽输出	
	GPIOA_ORD|=1<<7;		//设置初始灯为灭	
	
	GPIOB_CRH&=0xFFFFFF0F;	
	GPIOB_CRH|=0x00000020;	
	GPIOB_ORD|=1<<9;			
	
	GPIOC_CRH&=0x0FFFFFFF;		
	GPIOC_CRH|=0x30000000;   	
	GPIOC_ORD|=0x1<<15;		
	while(j)
	{	
		GPIOA_ORD=0x0<<0;	//点灯1	
		Delay_wyd(1000000);
		GPIOA_ORD=0x1<<0;	//灭灯1	
		Delay_wyd(1000000);
		
		GPIOB_ORD=0x0<<9;	//点灯2
		Delay_wyd(1000000);
		GPIOB_ORD=0x1<<9;	//灭灯2
		Delay_wyd(1000000);
		
		GPIOC_ORD=0x0<<15;	//点灯3
		Delay_wyd(1000000);
		GPIOC_ORD=0x1<<15;	//灭灯3
		Delay_wyd(1000000);
	}
}

参考:http://t.csdn.cn/BtdiP

(三)添加驱动文件

1.文件比较难找一般在安装的stm32包里面找到Device\Source\ARM

在这里插入图片描述

2.将此文件复制在项目文件夹下面

在这里插入图片描述

3.将此文件放在source group下面,右键点击source group然后选择add existing files

在这里插入图片描述

然后点击刚刚复制在项目目录下的驱动文件

在这里插入图片描述

(四)编译运行

在这里插入图片描述

可能会有报错test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).`

解决办法:1.去掉驱动文件startup_stm32f10x_md.s的只读属性,找到复制在项目下的文件右键点击属性,然后取消只读勾选

在这里插入图片描述

将驱动文件startup_stm32f10x_md.s中的下面三行代码用“;”注释掉

; IMPORT SystemInit
; LDR R0, =SystemInit
; BLX R0

在这里插入图片描述

即可解决问题

二、烧录以及线路连接

(一)烧录

1.烧录软件

官网下载连接http://www.mcuisp.com/

选择我们所需要的版本

在这里插入图片描述

2.软件配置

1.选择“端口port”(FlyMcu会自动搜索CH340串口对应的端口),设置“波特率bps”(对于STM32F429,推荐将波特率设置为76800 bps)。

2.选择在项目文件夹下objects文件下的.hex文件

3.勾选“编程前重装文件“

4.勾选”编译后执行“

5.左下方选择”DTR低电平复位,RTS高电平进BootLoader"

在这里插入图片描述

3.插入USB TO TTL即可开始编程,显示下图即编译成功

在这里插入图片描述

(二)线路连接

参考:http://t.csdn.cn/DCujz

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

二、改用标准外设库方式使用某个端口GPIOx端口管脚控制几个LED灯,轮流闪烁,间隔时长1秒。

一、下载STM32标准固件库

官方网址:STM32标准外设软件库 - 意法半导体STMicroelectronics

打开之后点击F1,然后按照步骤注册下载

二、创建工程

1.新建项目文件夹,并创建子目录start、Library、User
2.复制标准库文件到新建工程

2.1start子目录下文件

(1)找到刚刚解压好的固件库,点击Libraries->CMSIS->CM3->DeviceSupport->ST->STM32F10x->setup->arm,这些为STM32的启动文件,全选启动文件并复制到start

(2)然后回到固件库Libraries->CMSIS->CM3->DeviceSupport->ST->STM32F10x中,找到一个.h文件和两个system开头的文件,它们分别为STM32的外设寄存器描述文件和配置时钟文件,将它们三个也复制到start下

(3)在固件库Libraries->CMSIS->CM3->CoreSupport选择.c和.h文件,这两个文件为内核的寄存器描述,也复制在start文件下

2.2Library子目录下文件

(1)在固件库Libraries->STM32F10x_StdPeriph_Driver->src,将文件全选复制粘贴到工程项目“Library”文件夹
(2)再到固件库Libraries->STM32F10x_StdPeriph_Driver->inc,将文件全选复制粘贴到工程项目“Library”文件夹

2.3User子目录下文件夹

到固件库Project->STM32F10x_StdPeriph_Template,选择main.c文件、两个it文件和conf文件复制粘贴到工程项目"User"文件夹

3.打开keil新建工程

3.1选择芯片型号

3.2添加文件到组

右键点击Target1,然后选中图片箭头

添加文件组

注意选择All files才能将文件全部添加

然后另外两个按上面步骤添加

11

3.3写入代码

#include "stm32f10x.h"

void delay_s(void);

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;              
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;       
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOA, &GPIO_InitStructure);            
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	
		delay_s();
		GPIO_Write(GPIOA, ~0x0002);	
		delay_s();
		GPIO_Write(GPIOA, ~0x0004);	
		delay_s();
	}
}
void delay_s(void)
{
	volatile int i=0,j=0,k=0;
	for(i=1000;i>0;i--)
	{
		for(j=1000;j>0;j--)
		{
			for(k=6;k>0;k--);
		}
	}
}


点击魔法棒进行C/C++设置

添加文件

然后编译运行

可能会遇到start/core_cm3.c(499): error: parameter references not allowed in naked functions错误

解决方法直接删除ore_cm3.c即可

4.仿真

点击魔术棒勾选Use Simulator,并修改参数如下图:

点击仿真按钮开始仿真,打开逻辑分析仪窗口

点击Setup,添加端口

点击如图运行波形

5.烧录


在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值