使用STM32点亮LED

一、题目描述

假设你手中已有 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言 寄存器方式编程实现。

3)安装 stm32CubeMX,用cubemx完成初始化过程,采用HAL库编程实现。

4)在Keil下用软件仿真运行上面代码,并用虚拟逻辑分析仪观察 对应管脚上的输出波形(高低电平转换),看是否是1秒的周期。

二、设计思路

外设的功能都是完全不同的,但初始化都是大同小异的。
点灯是所有学单片机的人都应该学会的第一项技能,这样子才算入门。

51单片机的点灯是,通过控制寄存器将片外引脚(我们称之为IO口)拉低拉高,输出高低电平,以控制LED亮灭。
其过程:单片机给指令->控制寄存器->给IO口电平->控制LED亮灭

stm32的点灯则是,通过使能外设GPIO时钟,发出指令给外设GPIO,外设GPIO收到指令后,着手配置自己的寄存器,然后给IO口模式,让其实现各种功能。
其过程:CPU给指令->GPIO收到指令->配置内部寄存器->配置IO口模式(注意是模式)->控制LED亮灭

三、寄存器实现

01 时钟配置

使用PA6的端口,在面包板相应端口上接上LED灯

  • 首先要配置时钟使能。

为什么配置时钟?为了省电,默认的时钟都是关闭的。配置STM32的任何资源前,都必须首先使能时钟。

  • 配置哪个时钟?

时钟的信息在参考手册里边,参考手册十分巨大,不用通读,就像一个字典,需要什么查什么。

  • 参考手册,搜索"时钟",在表1里可以看到。

时钟控制名字叫做RCC,属于AHB总线。GPIOA属于APB2。
在这里插入图片描述
我们已经知道,GPIO端口A的地址从0x4001 0800开始。接下来只寻找时钟使能寄存器的地址:
  复位和时钟控制RCC的地址从0x4002 1000开始;
  可以在6.3.7小节找到APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址是0x18,所以APB2的地址就是0x4002 1018。
  看手册RCC_APB2ENR,位2是IOPAEN,名字是IO端口A时钟使能,就是我们想要的。
在这里插入图片描述
把RCC_APB2ENR的位2赋值为1,就是开启GPIOA时钟。
在这里插入图片描述

02 模式设置

  • 配置为通用输出

既然叫做IO,那么肯定就是可以输入,可以输出,到底是输入还是输出呢?
  控制LED需要输出高电平或是低电平,所以需要配置为输出。
  由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)。STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。
  配置引脚PA6,使用的寄存器是GPIOA_CRH。下面我们来寻找这个寄存器的地址。

在这里插入图片描述

  • 点亮LED需要输出高电平

在单片机的编程中,要想做某件事,必须寻找相应的寄存器。在8.2.4小节,可以找到端口输出数据寄存器,就是我们需要的。我们需要输出1(主要看面包板上LED灯的正负极怎么接)其他两个寄存器的寻找方法与之类似。

03 代码编写

led.c

#include "led.h"
//初始化PA5 PB9 PC14为输出口.并使能这三个口的时钟 
//LED IO 初始化
void LED_Init(void)
{
   
	RCC->APB2ENR|=1<<2; //使能 IOPA 时钟 
	RCC->APB2ENR|=1<<3; //使能 IOPB 时钟 
	RCC->APB2ENR|=1<<4; //使能 IOPC 时钟
//	RCC->APB2ENR|=1<<5; //使能 IOPD 时钟	

	GPIOA->CRL&=0XFF0FFFFF; 
	GPIOA->CRL
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值