当前位置: 首页 > news >正文

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

目录

  • 一、实验文件
    • `main.c`
    • `stm32f10x.h`
  • 二、实验思路
  • (一)打开两个LED小灯
    • 1.在玄武F103开发板上找到LED0、LED1对应的GPIO控制寄存器
    • 2.找到GPIOB、GPIOE的地址
    • 3.打开APB2外设时钟的使能寄存器
    • 4.对GPIO寄存器进行设置
    • 对端口输出寄存器进行设置
  • (二)使两个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开发板原理图.pdf (ctrl+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);}
http://www.lryc.cn/news/28761.html

相关文章:

  • 数组之双指针题
  • 真实需求和梦想实现满足
  • [ant-design-vue] tree 组件功能使用
  • QT父子窗口事件传递与事件过滤器
  • 【2.4 golang中的循环语句for】
  • Windows 系统下 Apache 和 php 环境怎么搭建?
  • Python基础知识——字符串、字典
  • JVM常用指令
  • 排序中常见的一些指标
  • 51单片机入门————数码管显示
  • Spring事务未生效场景
  • servlet注解开发
  • mysql一联合主键
  • openpnp - 判断吸嘴是否指定了正确的旋转轴
  • 【办公类-19-03】办公中的思考——Python批量统一文件名的序号(保教主任整理打印文件)
  • MySQL约束
  • x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
  • 找工作经验分享
  • C语言学习之路--操作符篇,从知识到实战
  • 【华为OD机试2023】端口合并 C++ Java Python
  • C++常用头文件整理
  • Linux内核4.14版本——drm框架分析(2)——connector分析
  • dev GridControl 按条件纵向合并单元格
  • aws eks 集群初始化过程中pause容器的启动逻辑
  • Numpy专栏目录(长期更新)
  • English Learning - L2 第1次小组纠音 [ɑː] [ɔː] [uː] 2023.2.25 周六
  • 博客系统程序(页面设计)
  • 【死锁的排查工具有哪些?】
  • JUC包:CyclicBarrier源码+实例讲解
  • Trace、Metrics、Logging 选型