STM32完全学习——点亮LED灯

server/2024/11/17 10:20:26/

一、寄存器描述

首先我们知道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这样的头文件。这里仅对于我们使用寄存器直接编程的情况。因此我们想要给某个寄存器写入某个值,就必须得先知道这个寄存器的地址,然后使用指针的解引用,给这个地址写入相应的数据即可,完成我们对寄存器的设置。下面上代码:

#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函数之前对他进行了调用,因此我们需要自己写一个这样的函数来供她调用,我们也可以直接将头文件里面的这句代码删除掉,也可以。具体怎么处理看你自己


http://www.ppmy.cn/server/142627.html

相关文章

深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112

深入解析 CentOS 7 上 MySQL 8.0 的最佳实践 随着现代数据库应用需求的快速增长,MySQL 8.0 成为许多企业和开发者的首选数据库管理系统。其性能改进、增强的安全特性以及强大的兼容性,使其在现代架构中占据重要地位。本篇博客将基于实践经验&#xff0c…

在Node.js中如何使用TypeScript

第一步:创建一个Node.js项目的package.json文件 npm init -y第二步:添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步:初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…

工程师 - 真空管(Vacuum tubes)

Vacuum Tubes: The World Before Transistors 在任何现代电气设备中,从闹钟、电话、电脑到电视,你都能找到一种叫做晶体管的装置。事实上,你会发现数十亿个晶体管。晶体管是现代计算的原子,它们组合成逻辑门,从而实现计…

最终用途声明

最终用途声明 本《最终用途声明》适用于Mouser Electronics提供产品、服务、软件和技术(以下简称“商品”)的各方和所有目的地。我们(本订单中指定的购买者或机构)证明如下: This End Use Statement applies to all …

FreeSWITCH的介绍及应用

FreeSWITCH的介绍: 什么是FreeSWITCH FreeSWITCH是一个开源的电话软交换平台,用于构建语音通信系统,如IP - PBX(基于IP的专用交换分机)、呼叫中心等。它能够实现语音通话、视频通话、会议通话等多种通信功能,并且支持多种通信协议,包括SIP(Session Initiation Protocol…

MySQL 8.0.32升级到8.4.3后报mysql_native_password访问问题

升级方式: mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz 之间替换安装文件 升级之前my.cnf检查 mysqld --validate-config mysqls2:/home/db/mysql$ mysqld --validate-config 2024-11-09T21:29:23.61875608:00 0 [Note] [MY-013667] [Server] Error-log destinati…

Vue 3 中的原生事件监听与组件事件处理详解

Vue 3 中的原生事件监听与组件事件处理完全指南 在 Vue 3 中,事件监听和事件处理是组件交互中的关键部分。Vue 提供了一套简单而强大的事件处理机制,可以方便地监听 DOM 原生事件和组件自定义事件。本篇文章将详细介绍 Vue 3 中事件的使用,包…

鸿蒙next版开发:ArkTS组件通用属性(文本通用)

在HarmonyOS 5.0中,ArkTS提供了一系列的文本通用属性,这些属性可以应用于文本组件,以实现丰富的文本显示和样式效果。本文将详细解读这些通用属性,并提供示例代码进行说明。 文本通用属性 textAlign属性 textAlign属性用于设置…