一、题目描述
假设你手中已有 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灯的正负极怎么接)其他两个寄存器的寻找方法与之类似。文章来源:https://www.toymoban.com/news/detail-435485.html
03 代码编写
led.c
文章来源地址https://www.toymoban.com/news/detail-435485.html
#include "led.h"
//初始化PA5 PB9 PC14为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<2;
到了这里,关于使用STM32点亮LED的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!