初识STM32工作原理和基础编程

2023-05-16

一、初识STM32如何简单的点亮一个LED灯呢?如何用一个按键控制LED灯的点亮与否呢?本文将对这些问题做一个比较详细的解答,其中还有几个比较经典的例子,希望能帮助大家更好的理解STM32的工作原理!

注:本文以STM32F103R6为例,用keil5编程,用proteus8.1来展示结果。

二、如何简单点亮一个LED黄灯?

在这里插入图片描述

1. 首先如图所示在proteus中画好原理图,要注意的是电阻不易过大,电阻过大,电阻上分压过多,会导致LED很暗或者点不亮!
在这里插入图片描述
2. 编写和讲解代码
a. 首先讲解LED配置文件,图中的led.c文件
在这里插入图片描述
解释如下:

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量,名字为GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIOA引脚使能,即启动PA的时钟
	
	//给结构体的成员变量赋值
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//定义GPIO引脚的模式为输出模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//定义操作的引脚为第0号引脚,
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率
	GPIO_Init(GPIOA,&GPIO_InitStruct);//PA0 对PA0进行初始化	
}

:为什么led.c中定义的是第0号引脚?
:因为原理图中LED灯接的是引脚PA0;
b.编写让LED点亮的代码:在main.c中写入
在这里插入图片描述

int main(void)
{
	int i = 0;
	LED_GPIO_Config();//LED初始化
	while(1)//死循环
	{		
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);//功能 清零 PA0 LED亮
		main_delay(200);//延时,软件延时cpu空跑循环
		GPIO_SetBits(GPIOA,GPIO_Pin_0);//功能:置1 PA0 LED灭
		main_delay(200);//延时 
	}
} 

注:这里的GPIO_ResetBits()函数是清零,GPIO_SetBits()函数是置1
如此,简单的点亮LED灯就实现了!

例1:让一个黄灯和一个红灯交替闪烁

:同理先画好原理图然后在led.c中配置
在这里插入图片描述

在这里插入图片描述
解释:原理图中LED分别接在了PA0和PA6,所以在led.c中要同时定义PA0和PA6
:同时定义PA0和PA6,问什么是GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_6;这里面的GPIO_Pin_0 | GPIO_Pin_6怎么理解?
:本文中的STM32单片机有GPIOA,GPIOB,GPIOC三组引脚,每组有16个引脚,所以个引脚都是由16位2进制数来控制的。

0000000000000001,表示第0个引脚,;
0000000000000010,表示第1个引脚;
0000000000000100,表示第2个引脚;
……
1000000000000000,表示第16个引脚;
所以,同时定义PA0和PA6即GPIO_Pin_0 | GPIO_Pin_6=0000000001000001
在main.c中编写代码:
在这里插入图片描述

int main(void)
{
	int i = 0;
	LED_GPIO_Config();//LED初始化
	while(1)//死循环
	{		
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);//功能 清零 PA0 黄LED亮
		GPIO_SetBits(GPIOA,GPIO_Pin_6);//功能:置1 PA6 红LED灭
		main_delay(200);//延时,软件延时cpu空跑循环
		GPIO_SetBits(GPIOA,GPIO_Pin_0);//功能:置1 PA0 黄LED灭
		GPIO_ResetBits(GPIOA,GPIO_Pin_6);//功能 清零 PA6 红LED亮
		main_delay(200);//延时 
	}
}

例2:用运4个LED,实时显示4位2进制数+1操作

在这里插入图片描述
对题目的解释:
如原理图中的绿灯、蓝灯、红灯、黄灯,分别对应4位2进制数的最低位到最高位。如当为0001时路灯亮,当为0011绿灯蓝灯同时亮,然而0001的十进制数是1,0011的十进制数是3,如此这样十进制数从1–>10对应的灯亮,这就是题目要求!
开始编写代码:
led.c中:
在这里插入图片描述

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//启动PA的时钟
	//给结构体的成员变量赋值
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//输出模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_6;//同时选中了0和6
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率
	GPIO_Init(GPIOA,&GPIO_InitStruct);//PA0 对PA0进行初始化
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//启动PA的时钟
	//给结构体的成员变量赋值
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//输出模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_5;//选中了0和5
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率
	GPIO_Init(GPIOB,&GPIO_InitStruct);//PB0 对PA0进行初始化
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);		
}

main.c中:
在这里插入图片描述

int main(void)
{
	int num;
		for(num = 0; num < 16; num++)
		{			 //真 灯亮								//假 灯灭
			//第一个高位黄灯
			num & 8 ? GPIO_ResetBits(GPIOA,GPIO_Pin_0) : GPIO_SetBits(GPIOA,GPIO_Pin_0);
			//第二个 红灯
			num & 4 ? GPIO_ResetBits(GPIOA,GPIO_Pin_6) : GPIO_SetBits(GPIOA,GPIO_Pin_6);
			//第三个 蓝灯
			num & 2 ? GPIO_ResetBits(GPIOB,GPIO_Pin_0) : GPIO_SetBits(GPIOB,GPIO_Pin_0);
			//第四个 绿灯
			num & 1 ? GPIO_ResetBits(GPIOB,GPIO_Pin_5) : GPIO_SetBits(GPIOB,GPIO_Pin_5);
		}
}

三、如何使用按键控制LED灯的亮灭?

例:两个按键 点KEY1,黄灯亮 点KEY2 黄灯灭

在这里插入图片描述
开始代码的编写:
同样接入了按键,也需要对按键进行初始化,不同于LED的是,按键直接在main.c中初始化即可。

void keyInit()
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义一个结构体变量
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//启动PC的时钟
	//给结构体的成员变量赋值
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//输入模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_7;//选中了1和7引脚
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//工作频率
	GPIO_Init(GPIOC,&GPIO_InitStruct);//PA0 对PA0进行初始化
}

int main(void)
{
	keyInit();//按键初始化
	LED_GPIO_Config();//LED初始化
	while(1)
	{
		//读取按键
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)//KEY1
		{
			GPIO_ResetBits(GPIOA,GPIO_Pin_0);//LED黄灯亮 
		}
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == 0)//KEY2
		{
			GPIO_SetBits(GPIOA,GPIO_Pin_0);//LED黄灯灭
		}
	}
	
	return 0;
}

在这里插入图片描述

例:如何实现一个按键控制一个灯的亮灭?按一下亮,按一下灭,再按一下亮,再按一下灭?

答:用flag状态标志位
代码如下:


int main(void)
{
	int flag = 1;//相当于标志位
	keyInit();//按键初始化
	LED_GPIO_Config();//LED初始化
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)//按了key1
		{
				if(flag)//第一次点按键,flag==1,条件成立
				{
					GPIO_ResetBits(GPIOA,GPIO_Pin_0);
					flag = 0;
				}
				else
				{
					GPIO_SetBits(GPIOA,GPIO_Pin_0);
					flag = 1;
				}
		}
		main_delay(200);//按键消抖
	}
	
	return 0;
}

以上就是本文所有内容,其中包含有经典例题,能够很好的认知STM32,希望能够帮助大家!!!

感谢您长期以来对博主冰河的支持,博主会再接再厉!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初识STM32工作原理和基础编程 的相关文章

  • Ubuntu搭建gitlab-Ci教程

    本文参考gitlab官方教程搭建CI GitLab Runner是一款开源工具 xff0c 用于在GitLab上运行CI CD xff08 持续集成 持续交付 xff09 作业 它可以在多个操作系统上安装和使用 xff0c 并且可以在容器中
  • 常用命令汇总

    tar gz 压缩包 解压 xff1a tar zxvf FileName tar gz 压缩 xff1a tar zcvf FileName tar gz DirName 删除远程分支 span class token function
  • 问题解决:import serial提示 ImportError: No module named serial

    问题 xff1a 在Ubuntu系统中运行python脚本 xff0c 出现如下提示说明pythoh的serial模块没有安装 ImportError No module named serial 解决 网上大部分的解决方法都是安装pyse
  • An Introduction to Deep Learning for the PhysicalLayer

    An Introduction to Deep Learning for the PhysicalLayer I INTRODUCTION 这段主要讲了文章的主要工作 将发射机 通道和接收器作为一个自动编码器 xff0c 对于给定的损失函数
  • 机器学习调制解调器:ML将如何改变我们设计下一代通信系统的方式

    所以 xff0c 我听到你们都在问 xff0c 我们都失业了吗 通信工程师是机器崛起的又一个受害者吗 幸运的是 xff0c 本文中的答案是否定的 但是Nathan Ben和Tim指出了一种新的方式来指定和设计通信系统 xff0c 这可能会永
  • git clone指定分支

    技术背景 Git是代码版本最常用的管理工具 xff0c 此前也写过一篇介绍Git的基本使用的博客 xff0c 而本文介绍一个可能在特定场景下能够用到的功能 直接拉取指定分支的内容 Git Clone 首先看一下如果我们按照常规的操作去拉取一
  • PX4最新版ubuntu编译环境搭建

    PX4最新版ubuntu编译环境搭建 本博客的撰写主要也是博主的自己血泪之路 xff0c 参考了各种博客 xff0c 然而对于我并没有什么卵用 xff0c 简直是成功的都一样 xff0c 不成功的各有各的不同 xff0c 最后在快要放弃而转
  • RTOS滴答Tick设置多少才合适

    本文转载 xff0c 留作笔记 xff0c 如有侵权 xff0c 请联系删除 xff0c 原文链接地址 xff1a 嵌入式开发 RTOS滴答Tick设置多少才合适 xff1f qq com https mp weixin qq com s
  • Darknet-Deep_sort_pytorch 无人机跟踪识别记录

    创建数据集 使用labelme 构造voc数据集格式 转换txt为xml 开始训练 span class token function sudo span span class token function nohup span darkn
  • Docker安装Ubuntu

    local footstep 64 ubuntu ifconfig docker0 flags 61 4163 lt UP BROADCAST RUNNING MULTICAST gt mtu 1500 inet 172 17 0 1 ne
  • MSCKF学习记录

    MSCKF相关资料 1 github参考实现 xff1a daniilidis group msckf mono https github com daniilidis group msckf mono 2 CSND参考博客 xff1a m
  • ARM linux 串口接收

    C语言read函数的使用以及串口初始化的调用 废话不多说 xff0c 直接上代码 xff0c 有疑问可以看我之前的文章 https blog csdn net m0 38053897 article details 108816643 ht
  • 设计模式--状态模式(C语言实现)

    原创 亚索老哥 embed linux share 模式动机 状态模式 状态机 是嵌入式开发中最重要 最核心的设计模式之一 xff0c 毫不夸张的说 xff0c 是否熟练掌握状态模式 xff0c 很大程度上直接决定了嵌入式工程师的代码掌控能
  • 张正友相机标定 及 一文讲透鱼眼相机畸变矫正,及目标检测项目应用

    参考链接 xff1a 相机标定 张正友标定法 一文讲透鱼眼相机畸变矫正 xff0c 及目标检测项目应用
  • select在ios中选项空白

    出现这个问题是因为粗心吧 解决了好久 最后发现是个笑话 lt select name 61 span class hljs string 34 34 span id 61 span class hljs string 34 34 span
  • RTOS中消息、信号量、互斥量、事件使用区别(类比理解)

    RTOS中消息 信号量 互斥量 事件使用区别 xff08 类比理解 xff09 注 xff1a 本文仅代表本人学习中的理解 xff0c 未必正确 xff0c 欢迎指正 xff01 1 消息 1 1 对FreeRTOS 就像往火车上装货卸货
  • PuTTY/Xshell连接远程服务器提示connection time out的解决方案

    刚注册一台云服务器时 xff0c 想使用PuTTY Xshell来在本地远程连接服务器 xff0c 发现会出现以下错误提示 xff1a Network error Connection time out 对于新注册的云服务器 xff0c 什
  • Ubuntu编译环境配置

    1 升级gcc sudo apt get update sudo apt get install software properties common sudo apt get install gcc 5 g 43 5 sudo apt g
  • 多传感器融合的四种经典结构

    人一生的成长过程中 xff0c 也不总是只有一种必然性 xff0c 很多时候 xff0c 人生需要选择 请选择有尊严的活着 xff0c 告别卑微 xff01 转一篇信息融合的结构概述 xff1a 多传感器信息融合的结构模型一般有四种基本形式
  • 认识Make、Makefile、CMake和CMakeLists

    一 Make 在 认识编译器和C C 43 43 编译 一文中介绍过 xff0c 一个 c cpp 文件从源文件到目标文件的过程叫做编译 xff0c 但是一个项目中不可能只存在一个文件 xff0c 这就涉及到多个文件的编译问题 xff0c

随机推荐

  • 卡尔曼滤波基础---MATLAB

    Karl Gauss xff08 1795年 xff09 行星轨道测量 最小二乘估计法 Norbert Wiener xff08 1942年 xff09 火力控制系统精确跟踪 Wiener Kolmogorov滤波 Rudolf Kalma
  • 位姿估计 -- PPF算法的OpenCV实现

    给出cpp代码 xff0c 复制粘贴改一下文件路径记得 1 pose cpp span class token comment span span class token comment Created by yaohua on 2020
  • 针对ROS配置VScode开发环境(catkin_make 或 catkin build)

    针对ROS配置VScode开发环境 xff08 catkin make 或 catkin build xff09 使用catkin make ubuntu 18的vscode配置ros开发环境 xff1a catkin make span
  • 电脑双系统即在windows系统与Linux系统中如何设置默认启动系统

    来源 xff08 https www bilibili com read cv5277001 xff09
  • Ubuntu添加/删除PPA源

    一 PPA介绍 PPA xff08 Personal Package Archives xff0c 个人软件包文档 xff09 xff0c 是Ubuntu Launchpad网站提供的一项源服务 xff0c 允许个人用户上传软件源代码 xf
  • 操作系统之进程概念及其组成

    一 进程 在多道程序环境下 xff0c 允许多个程序并发执行 xff0c 此时它们将失去封闭性 xff0c 并具有间断性及不可 再现性的特征 为此引入了进程 Prnccss 的概念 xff0c 以便更好地描述和控制程序的并发执行 xff0c
  • GTSAM中imu预积分及其因子图优化过程

    前言 使用IMU和llidar或者相机进行多传感器融合的slam方案中 xff0c 主要分为紧耦合和松耦合方案 目前 xff0c 主流的方案都是紧耦合的 而紧耦合方案中主要分为基于滤波 xff08 比如 xff0c ESKF xff09 和
  • Python 学习笔记 模块 & 目录遍历 & 包

    一 模块 xff1a 1 概述 xff1a 为了解决维护问题 xff0c 一般情况下 xff0c 在一个完整的项目中 xff0c 会将特定的功能分组 xff0c 分别放到不同的文件中 xff0c 在使用的过程中 xff0c 可以单独维护 x
  • realsense-ros环境配置

    项目场景 xff1a 相机型号RealsenseD435i 环境 xff1a ubuntu1604 xff0c 内核4 15 0 126 generic uname r可查看内核 参考链接 xff1a https github com In
  • realsense相机SDK——librealsense使用方法及bug解决(ubuntu)

    realsense环境配置参考https blog csdn net m0 43436602 article details 110930512 一 librealsense在哪里 xff1f 安装完环境之后 xff0c 可以去根目录下搜一
  • uCOS消息队列相关函数的理解

    OSQCreate xff1a 创建消息队列函数 有四个入口参数 xff1a 消息队列指针 xff1b 消息队列名称 xff1b 消息队列大小 xff08 不能为0 xff09 xff1b 返回错误类型 函数过程 xff1a 首先进行安全检
  • uCOS任务信号量相关函数代码理解

    强调任务信号量思想 xff1a 任务信号量只是一个标志 xff0c 获取成功就是指把信号量计数值减1 xff1b 释放就是指把信号量计数值加1 xff08 溢出则计数值不变 xff09 获取信号量需要判断信号量是否可用 xff08 大于0
  • (二)灰度图像二值化

    灰度图像二值化 一 知识简介 图像二值化 xff08 Image Binarization xff09 就是将图像上的像素点的灰度值设置为0或255 xff0c 也就是将整个图像呈现出明显的黑白效果的过程 在数字图像处理中 xff0c 二值
  • Modbus RS485 设备的串口调试

    Modbus RS485 设备的串口调试 准备Modbus功能码二 使用步骤1 接线2 串口调试 温湿度的计算 准备 硬件设备 xff1a 电脑 RS485 温湿度传感器 RS485 土壤温湿度传感器 RS485 继电器控制模块 TTL转R
  • Linux为什么区分内核空间和用户空间

    程序如果要被CPU执行 xff0c 就得编译成CPU可以执行的指令 xff0c 一大堆的程序就变成了一堆的指令 一个操作系统它也是一堆程序组成的 xff0c 可以想象CPU的指令是很多的 xff0c 但是这么多的指令中 xff0c 有些指令
  • 【Docker】镜像的保存(save)到文件 与 加载(load)到宿主机

    背景 xff1a 我们制作好的镜像会存储在宿主机上 xff0c 那么在迁移的过程中 xff0c 我们应该如何 保存自定义的镜像到宿文件 或 加载自定义的镜像到宿主机呢 xff1f 制作镜像 xff1a docker build t 镜像名
  • 手把手教你学会闭包

    前言 MDN对闭包的解释是这样的 xff1a 一个函数和对其周围状态 xff08 lexical environment xff0c 词法环境 xff09 的引用捆绑在一起 xff08 或者说函数被引用包围 xff09 xff0c 这样的组
  • 从高考到程序员:选择专业三要素:擅长、喜欢、有价值

    参与从高考到程序员征文 xff1a http blog csdn net blogdevteam article details 72917467 从高考到程序员 xff1a 选择专业三要素 xff1a 擅长 喜欢 有价值 选择工作三要素
  • 舍选抽样法

    对于一个随机变量X xff0c 对其直接进行抽样比较困难时 xff0c 我们可以选择一个比较容易产生随机数且逼近f很好的一个分布f y 来对其进行抽样 xff0c 下面以贝塔分布为例进行舍选抽样 ps 实际上 应该是先找了一个f y 使得c
  • 初识STM32工作原理和基础编程

    一 初识STM32如何简单的点亮一个LED灯呢 xff1f 如何用一个按键控制LED灯的点亮与否呢 xff1f 本文将对这些问题做一个比较详细的解答 xff0c 其中还有几个比较经典的例子 xff0c 希望能帮助大家更好的理解STM32的工