STM32完全学习——点亮LED灯

一、寄存器描述

首先我们知道STM32对外设的操作,是靠对寄存器的设置来完成的。因此我们想要点亮LED灯,就需要知道端口的控制寄存器,然后给寄存器设置不同的值就可以让端口来输出0或1,首先我这里使用的是GPIOA这个端口的0-8位来做实验,使用的芯片型号是STM32C8T6,其余的类似处理即可。

(1)端口配置低寄存器(GPIOA_CRL)地址:0x40010800

每个寄存器的位的设置值描述如下:

|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|
| CNFx[1:0](x = 0,1,2,3,4,5,6,7) | 当MODEx[1:0] = 0;输入模式 00:模拟输入模式 01:浮空输入模式(复位后的状态) 10:上拉/下拉输入模式 11:保留 当MODEx[1:0] != 0;输出模式 00:通用推挽输出模式 01:通用开漏输出模式 10:复用功能推挽输出模式 11:复用功能开漏输出模式 |
| MODEx[1:0](x=0,1,2,3,4,5,6,7) | 00:输入模式(复位后的状态) 01:输出模式,最大速度10MHz 10:输出模式,最大速度2MHz 11:输出模式,最大速度50MHz |

(2)端口配置高寄存器(GPIOA_CRH)地址0x40010804

我们可以看到这个其实就是端口GPIOA的8-15的输出端口的配置,具体每个位的设置和上面的是一样的,这里就不再赘述了。

(3)端口输出数据寄存器(GPIOA_ODR)地址:0x4001080c

这个寄存器就是用来控制端口输出的,如果你想给某个端口输出0或1,那么你就给其某位赋值0或即可。有了上面的3寄存器的设置并不能点亮我们的LED灯,那是因为我们知道STM32在复位之后每个外设的时钟都是关闭的,因此我们想要使用GPIOA这个端口,我们就必须先打开他的时钟。因此我们还需要使用一个有关时钟的寄存器,如下:

(4)APB2外设时钟使能寄存器(RCC_APB2ENR)地址:0x40021018

这个寄存器就是写入0就是关闭某个外设,写1就是开启某个外设。

二、编程实现

首先我们得了解STM32并不能像51单片机那样去按位操作寄存器,也没有将寄存器的符号封装到某一个头文件里面,并没有类似reg51.H这样的头文件。这里仅对于我们使用寄存器直接编程的情况。因此我们想要给某个寄存器写入某个值,就必须得先知道这个寄存器的地址,然后使用指针的解引用,给这个地址写入相应的数据即可,完成我们对寄存器的设置。下面上代码:

cpp 复制代码
#define RCC_APB2ENR 0x40021018  //时钟设置寄存器
#define GPIOA_CRL 0x40010800    //GPIO配置低寄存器
#define GPIOA_CRH 0x40010804    //GPIO配置高寄存器
#define GPIOA_ODR 0x4001080c    //GPIO输出数据寄存器
#define uint unsigned int      
int main(void)
{
	//由于STM32在复位后每个外设的时钟都是关闭的,因此在使用某个外设之前要先开启时钟
	*((uint *)RCC_APB2ENR) = 0x00000004;   //打开GPIOA的时钟
	*((uint *)GPIOA_CRL) = 0x33333333;     //设置GPIOA为推挽输出模式
    *((uint *)GPIOA_ODR) = 0xffffaaaa;     //然后给16个端口分别输出一定的数据
                                           //我这里的LED灯,给低电平就会亮,而且我只是用了GPIOA的0-7个端口

	while(1);
}
//没有这个函数就会报错
void SystemInit(void)
{
	
	
}

如果没有后面那个函数就会报下面的错误,如下:如果你报了下面的错误你就加上这个函数就行,如果没有就不用管了。

为什么不写会报错呢?那是因为在头文件里面对这个函数进行了调用,看下图,这个函数主要是完成系统初始化的,再调用main函数之前对他进行了调用,因此我们需要自己写一个这样的函数来供她调用,我们也可以直接将头文件里面的这句代码删除掉,也可以。具体怎么处理看你自己

相关推荐
杨若瑜22 分钟前
Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
学习·golang·gin
久恙50233 分钟前
一文学会docker中搭建kali
运维·数据库·学习·网络安全·docker·容器
近听水无声4771 小时前
vector容器的学习
学习
MogulNemenis2 小时前
每日八股——JVM组成
java·jvm·后端·学习
芋头莎莎2 小时前
单片机智能家居火灾环境安全检测
c语言·stm32·单片机·嵌入式硬件·51单片机
矿矿不想吃饭2 小时前
UG Motion学习笔记
笔记·学习
芋头莎莎2 小时前
STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
c语言·数据库·stm32·单片机·嵌入式硬件·物联网
web3探路者3 小时前
2024年 Web3开发学习路线全指南
学习·web3·区块链·智能合约·软件开发·dapp开发·公司开发
Angindem3 小时前
Redis 学习笔记
redis·笔记·学习