stm32点亮流水灯(小白的求学之路)


前言

由于之前作者仅仅只学习了51单片机的一些操作,对stm32单片机操作完全不会,过程中很曲折,如果有什么错的地方,希望可以告诉作者加以改正。

一、怎么点亮一个LED?

这个问题困扰了很久,因为stm32与51不同,51单片机直接可以操作引脚,而stm32要复杂得多。下面我们先来了解一下输入输出管脚——GPIO。

1、GPIO简介

GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如 GPIOA、GPIOB、GPIOC,所有的 GPIO 引脚都有基本的输入输出功能。
(这里我们可以类比51单片机的引脚,点灯的时候只需要将GPIO管脚置为高电平或者低电平)
问题又来了,怎么设置GPIO管脚呢?
这个时候就会用到寄存器啦。

2、寄存器

1、片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1挂载低速外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,也叫外设基地址。

总线名称 总线基地址 相对外设基地址的偏移
APB1 0x4000 0000 0x0
APB2 0x4001 0000 0x0001 0000
AHB 0x4001 8000 0x0001 8000

(到这里可以发现一个公式:地址=基地址+相对地址偏移)
2、外设基地址
GPIO 属于高速的外设 ,挂载到APB2 总线上。
在这里插入图片描述

外设名称 外设基地址 相对 APB2 总线的地址偏移
GPIOA 0x4001 0800 0x0000 0800
GPIOB 0x4001 0C00 0x0000 0C00
GPIOC 0x4001 1000 0x0000 1000

现在我们知道了GPIO的地址,是不是意味着可以直接通过地址来设置GPIO呢?
答案还是否定的,还需要操作里面特定功能的寄存器来设置GPIO管脚,比如:输入数据寄存器 GPIOx_IDR,GPIO 模式GPIOx_CRL或者GPIOx_CRH,时钟使能RCC_APB2ENR。

3、 APB2 外设时钟使能寄存器(RCC_APB2ENR)
为减小stm32的功耗而设置,如果不把对应管角的时钟使能,对应管脚不会工作。
在这里插入图片描述

这里我们以打开GPIOA的时钟为例子:
首先找到APB2的地址0x4001 0000,通过地址=基地址+相对地址偏移,得到RCC_APB2ENR的地址0x4001 0018。我们可以直接赋值为0x00000004

4、GPIO 模式GPIOx_CRL或者GPIOx_CRH
每个 GPI/O 端口有两个 32 位配置寄存器(GPIOx_CRL,GPIOx_CRH)。低8位GPIOx0—7在GPIOx_CRL,高8位GPIOx8—15在GPIOx_CRH。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keil5是一款嵌入式开发工具,用于编写和调试嵌入式系统的软件。而STM32是一系列由STMicroelectronics开发的32位ARM Cortex-M微控制器。点流水是一个常见的入门级示例项目,用于展示如何在STM32上控制多个LED按照一定的顺序依次点。 以下是一个简单的Keil5 STM32流水的代码示例: ```c #include "stm32f4xx.h" void delay(uint32_t time) { while(time--); } int main(void) { // 初始化GPIO端口 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { // 依次点LED GPIO_SetBits(GPIOA, GPIO_Pin_0); delay(1000000); GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_1); delay(1000000); GPIO_ResetBits(GPIOA, GPIO_Pin_1); GPIO_SetBits(GPIOA, GPIO_Pin_2); delay(1000000); GPIO_ResetBits(GPIOA, GPIO_Pin_2); GPIO_SetBits(GPIOA, GPIO_Pin_3); delay(1000000); GPIO_ResetBits(GPIOA, GPIO_Pin_3); } } ``` 这段代码使用了STM32的GPIO模块来控制LED的点和熄灭。首先,需要初始化GPIO端口,将四个LED的引脚配置为输出模式。然后,在一个无限循环中,依次点每个LED,并通过延时函数延时一段时间后再熄灭。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值