嵌入式系统实验——【玄武F103开发板】实现两个LED小灯闪烁

一、实验文件

main.c


#include "stm32f10x.h" 

typedef unsigned int u32;

void delay(u32 i)
{
	while(i--);
}

int main(void)
{	

	RCC_APB2ENR |= (1<<3);
	GPIOB_CRL &= ~( 0x0F<< (4*5));	
	GPIOB_CRL |= (1<<4*5);

	RCC_APB2ENR |= (1<<6);
	GPIOE_CRL &= ~( 0x0F<< (4*5));	
	GPIOE_CRL |= (1<<4*5);

	while(1)
	{
		GPIOB_ODR^=(1<<5);
		GPIOE_ODR^=(1<<5);
		delay(600000);
	}
	while(1);
}



void SystemInit(void)
{	
}
/*********************************************END OF FILE**********************/

stm32f10x.h



/*±¾ÎļþÓÃÓÚÌí¼Ó¼Ä´æÆ÷µØÖ·¼°½á¹¹Ì嶨Òå*/

/*片上外设基地址*/
#define PERIPH_BASE           ((unsigned int)0x40000000)

/*APB2总线基地址*/
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)
/*AHB总线基地址,这个不完全准确,与真实值有不同*/
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)

/*GPIOB外设基地址*/
#define GPIOB_BASE       (APB2PERIPH_BASE + 0x0C00)

/* GPIOB寄存器*/
#define GPIOB_CRL 	 	 *(unsigned int*)(GPIOB_BASE+0x00)
#define GPIOB_CRH 	 	 *(unsigned int*)(GPIOB_BASE+0x04)
#define GPIOB_IDR 	 	 *(unsigned int*)(GPIOB_BASE+0x08)
#define GPIOB_ODR 	 	 *(unsigned int*)(GPIOB_BASE+0x0C)
#define GPIOB_BSRR 	 	 *(unsigned int*)(GPIOB_BASE+0x10)
#define GPIOB_BRR 	 	 *(unsigned int*)(GPIOB_BASE+0x14)
#define GPIOB_LCKR 	 	 *(unsigned int*)(GPIOB_BASE+0x18)


/*GPIOE外设基地址*/
#define GPIOE_BASE        (APB2PERIPH_BASE + 0x1800)

/* GPIOE寄存器*/
#define GPIOE_CRL 	 	 *(unsigned int*)(GPIOE_BASE+0x00)
#define GPIOE_CRH 	 	 *(unsigned int*)(GPIOE_BASE+0x04)
#define GPIOE_IDR 	 	 *(unsigned int*)(GPIOE_BASE+0x08)
#define GPIOE_ODR 	 	 *(unsigned int*)(GPIOE_BASE+0x0C)
#define GPIOE_BSRR 	 	 *(unsigned int*)(GPIOE_BASE+0x10)
#define GPIOE_BRR 	 	 *(unsigned int*)(GPIOE_BASE+0x14)
#define GPIOE_LCKR 	 	 *(unsigned int*)(GPIOE_BASE+0x18)

/*RCC外设地址*/
#define RCC_BASE      (AHBPERIPH_BASE + 0x1000)
/*RCC的AHB1始终使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR		 *(unsigned int*)(RCC_BASE+0x18)
	



二、实验思路

(一)打开两个LED小灯

1.在玄武F103开发板上找到LED0、LED1对应的GPIO控制寄存器

玄武F103开发板原理图.pdfctrl+f查找LED0即可)

分别位于GPIOB和GPIOE(PB5中的B对应GPIOB、PE5中的E对应GPIOE)

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

2.找到GPIOB、GPIOE的地址

在STM32F1xx中文参考手册中的28页找到:

在这里插入图片描述
但是在本次实验的文件中,采取分别列出各个总线的地址,具体寄存器位于基于总线的偏移量的方式记录各寄存器的地址
在这里插入图片描述

3.打开APB2外设时钟的使能寄存器

在这里插入图片描述
可以在STM32F1xx中文参考手册中的低70页看到RCC上GPIOB、GPIOE对应的始终分别在位3和位6
在这里插入图片描述
于是在main.c中打开这两个端口的时钟
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.对GPIO寄存器进行设置

采用通用推挽输出,速度为10M
在此之前需要清空控制其的端口位
在这里插入图片描述
在这里插入图片描述

对端口输出寄存器进行设置

在这里插入图片描述
如图所示,当LED0所在位置为低电平时,LED0点亮,相反则熄灭
(这里我没搞明白为什么是第五位,可能是因为PB5和PE5中的数字5,如果是这样的话,代码中的(1<<5)都应该改为16,但好像并不是这样)

//PB5输出低电平设置
GPIOB_ODR&=(0<<5);
//PE5输出低电平设置
GPIOE_ODR&=(0<<5);

(二)使两个LED小灯闪烁

//PB5输出低电平设置
GPIOB_ODR&=(0<<5);
//PE5输出低电平设置
GPIOE_ODR&=(0<<5);

改为

	while(1)
	{
		GPIOB_ODR^=(1<<5);
		GPIOE_ODR^=(1<<5);
		delay(600000);
	}

并添加delay函数的定义:

void delay(u32 i)
{
	while(i--);
}

上述代码含义即为每隔一定的CPU执行一定数量的算术运算指令(delay函数的内容)后,就将GPIOB和GPIOE的端口输出寄存器的低五位的值按位取反

如下的代码会导致两个LED等都常亮

	while(1)
	{

		GPIOB_ODR^=(16);
		GPIOE_ODR^=(16);
		delay(600000);

	}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于嵌入式操作系统的应用程序通过蓝牙可以实现stm32f103开发板端的控制。首先,需要在stm32f103开发板上连接蓝牙模块,使其能够与手机或其他蓝牙设备进行通信。然后,在基于嵌入式操作系统的应用程序中,通过蓝牙模块与stm32f103开发板进行通信。 在应用程序中,首先需要通过蓝牙模块与手机或其他蓝牙设备进行配对和连接,以建立蓝牙通信链路。一旦建立成功,应用程序就可以发送控制命令或数据给stm32f103开发板端。例如,可以通过蓝牙发送控制命令给开发板实现开启或关闭某个功能模块的操作;或发送数据给开发板,让其进行相应的数据处理和反馈。 在stm32f103开发板端,需要编写相应的程序来解析和执行通过蓝牙接收到的命令或数据。可以利用串口通信协议来实现与蓝牙模块之间的数据传输,通过串口接收蓝牙模块发送过来的数据,然后根据接收到的命令进行相应的控制操作或数据处理。 总结来说,基于嵌入式操作系统的应用程序可以通过蓝牙与stm32f103开发板端进行通信和控制。通过蓝牙配对和连接建立通信链路,并在应用程序中发送控制命令或数据给stm32f103开发板端。在开发板端,通过编程解析和执行蓝牙接收到的命令或数据,实现相应的控制操作或数据处理功能。这样可以实现便捷的无线控制和数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值