当前位置: 首页 > news >正文

单片机--实战练习

目录

【1】GPIO

1.定义

2.应用 

     I  -   Input   -  输入采集

    O -   Output - 输出控制

​编辑​编辑

3.GPIO结构框图

4.功能描述

    输入功能

输出功能

5.相关寄存器

【2】点亮一盏LED灯

1.实验步骤

2.编程实现

3.编译下载

4.复位上电

练习:实现LED灯闪烁

练习:实现流水灯效果

练习:实现流水灯效果 (HAL库版)

【3】输入采集实验

实验:按键点灯实验

1.查看开发板

2.查看原理图

3.配置STM32CubeMX

 4.代码编写

练习:火焰感应器

1.查看开发板,找到火焰感应器 FLAME1

2.查看原理图

3.配置STM32CubeMX

4.代码编写

【4】HAL库函数分析


 问:  单片机上电后第一个执行的程序是?

   1、初始化堆栈指针SP=_initial_sp

           2、初始化PC 指针=Reset_Handler

           3、初始化中断向量表

           4、配置系统时钟SystemInit

           5、调用C 库函数_main 初始化用户堆栈,从而最终调用main 函数去到C 的世界

【1】GPIO

1.定义

  在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU读取其输入信号,因此在嵌入式微处理器上提供了一种“通用可编程I/O端口”,也就是GPIO(General-purpose input/output)  。

2.应用 

     I  -   Input   -  输入采集

     DO -  数字量输出口  0 or 1   有火/没火

    O -   Output - 输出控制

3.GPIO结构框图

补充:

      问:VDD、VSS、VCC分别表示什么意思?

           VCC :接入电路的电压

           VDD :  元器件内部的工作电压

           VSS :  公共接地端电压

      问:施密特触发器的作用?

       由于外部输入的信号,可能会出现脉冲等噪声的影响,为了让信号更加清晰,所以就设置了TTL施密特触发器来进行整形

 “施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形,而且由于施密特触发器具有滞回特性,所以可用于抗干扰,其应用包括在开回路配置中用于抗扰,以及在闭回路正回授/负回授配置中用于实现多谐振荡器。”

4.功能描述

    输入功能

           浮空输入

       通俗讲就是让管脚什么都不接,悬空着。

此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉,所以当IO口没有接输入的时候,此时的电平状态会是一个不确定的值,完全由外部输入决定。

一般实际运用时,引脚不建议悬空,易受干扰。 

      优势:这一种输入模式的电平会完全取决于外部电路而与内部电路无关。

      缺点:在没有外部电路接入的时候,IO脚浮空会使得电平不确定

     应用:该模式是STM32复位之后的默认模式,一般用作对开关按键的读取或用于标准的通讯协议,比如IIC、USART的等。

         上拉输入

            IO端口  -   上拉电阻  -  施密特触发器 - 输入数据寄存器 - 读

 输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,上拉电阻会将输入信号钳在高电平,此时引脚始终读到高电平信号。

          下拉输入

  IO端口  -   下拉电阻  -  施密特触发器 - 输入数据寄存器 - 读

输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。

       模拟输入

      信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。 所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。

应用:当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。

输出功能

    开漏输出 

     输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将端口置于高阻状态 (P-MOS 从不被激活 )。 

无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。

可以利用改变上拉电源的电压来适应所需,进而提高外部电路的驱动能力。

  推挽输出 

     输出寄存器上的’0’激活 N-MOS,而输出寄存器上的’1’将激活 P-MOS,具备输出高低电平的能力。

    当上面的MOS管导通时,GPIO输出高电平1,称为“推

    当下面MOS管导通时,GPIO输出低电平0,称为“挽”

5.相关寄存器

4 个 32 位 配 置 寄 存 器 

     GPIOx_MODER 模式寄存器

 GPIOx_OTYPER  输出类型寄存器

 GPIOx_OSPEEDR  输出速度寄存器

   GPIOx_PUPDR 上拉下拉寄存器

   2 个 32 位数据寄存器 

    GPIOx_IDR  输入数据寄存器

    GPIOx_ODR 输出数据寄存器

1 个32 位置位 / 复位寄存器

     GPIOx_BSRR

 1 个 32 位锁定寄存器 

GPIOx_LCKR

 2 个 32 位替代功能寄存器 

 GPIOx_AFRH 

 GPIOx_AFRL

【2】点亮一盏LED灯

1.实验步骤

     1.查看开发板,找到LED灯

 2.查看原理图

分析得到结论:只需要讲PB1引脚配置成输出功能且输出低电平信号即可点亮蓝灯。

2.编程实现

    1)寄存器配置

 2)代码编写

RCC->IOPENR |= 1<<1; //使能GPIOB组时钟

      GPIOB->MODER  &=  ~(0X3 << 2);   //配置输出模式

      GPIOB->MODER  |=  1<<2;

      GPIOB->OTYPER &= ~(1<<1);     //推挽输出模式

       GPIOB->ODR &= ~(1<<1);    //输出低电平

3.编译下载

4.复位上电

练习:实现LED灯闪烁

先实现初始化函数、开关控制函数、延时函数:

 声明函数:

再while(1)死循环中,调用开关函数,并通过延时保持一段时间,即可看到闪烁效果。

练习:实现流水灯效果

实现初始化函数,将PB0/PB1/PB2分别初始化为推挽输出模式。

/* USER CODE BEGIN 4 */
void GPIO_Init()
{RCC->IOPENR |= 1<<1; //使能GPIOB组时钟  1左移1位==将第二位置1//PB0GPIOB->MODER |=1<<0;  //配置输出模式  将第0位置1GPIOB->MODER &=~(1<<1);   //将第1位置0GPIOB->OTYPER &= ~(1<<0); //推挽输出模型//PB1GPIOB->MODER |=1<<2;  //配置输出模式GPIOB->MODER &=~(1<<3);GPIOB->OTYPER &= ~(1<<1); //推挽输出模型//PB2GPIOB->MODER |=1<<4;  //配置输出模式GPIOB->MODER &=~(1<<5);GPIOB->OTYPER &= ~(1<<2); //推挽输出模型
}

实现三盏LED灯的亮灭函数:

//LED2 - PB1
void LED2_ON()
{GPIOB->ODR &= ~(1<<1);  //输出低电平 将第二位置0
}
void LED2_OFF()
{GPIOB->ODR |= 1<<1;  //输出高电平   将第二位置1
}
//LED3 - PB2
void LED3_ON()
{ GPIOB->ODR &= ~(1<<2); //输出低电平 将第三位置0
}
void LED3_OFF()
{GPIOB->ODR |= 1<<2;  //输出高电平  将第三位置1
}
//LED4 - PB0
void LED4_ON()
{GPIOB->ODR &= ~(1<<0); //输出低电平 将第一位置0
}
void LED4_OFF()
{GPIOB->ODR |= 1<<0; //输出高电平 将第一位置1
}

实现延时函数:

main函数调用:

  /* USER CODE BEGIN 2 */GPIO_Init(); //初始化GPIO/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){LED2_ON(); //点亮LED2LED3_OFF(); //熄灭LED3、LED4LED4_OFF(); Delay();    //延时LED3_ON(); //点亮LED3LED2_OFF();//熄灭LED2、LED4LED4_OFF();Delay();   //延时LED4_ON();//点亮LED4LED2_OFF();//熄灭LED2、LED3LED3_OFF();Delay();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

实现效果:

练习:实现流水灯效果 (HAL库版)

打开STM32CubeMX新建工程配置引脚功能

引脚功能详细配置

生成代码

代码编写:

【3】输入采集实验

实验:按键点灯实验

1.查看开发板

      找到五向按键 丝印 - S1

2.查看原理图

  SN74HC32D: 四路或门电路

 //只要有一个方向键被按下,D3&KEY则输出高电平信号。

   //只要有方向键被按下,PA8引脚则会输入一个高电平信号。

  3.配置STM32CubeMX

 

 4.代码编写

 while (1){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)){HAL_Delay(100);//延时消抖//读取数据if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8));//抬手监测}}	}

练习:火焰感应器

1.查看开发板,找到火焰感应器 FLAME1

2.查看原理图

 3.配置STM32CubeMX

  4.代码编写

 while (1){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);//监测到火焰黄灯亮起HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);//绿灯熄灭}else{		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);//监测不到火焰绿灯亮起HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);	//黄灯熄灭		}			}

【4】HAL库函数分析

      HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件   

 

void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t  GPIO_Pin, 

                                                  GPIO_PinState PinState) 

    功能:设置或清除指定的端口位   (让指定引脚输出高低电平)  

    参数:GPIO_TypeDef * GPIOx   端口号

                uint16_t  GPIO_Pin         引脚号

                GPIO_PinState PinState 电平状态

                         GPIO_PIN_RESET    0    低电平

                         GPIO_PIN_SET         1    高电平

    返回值:无

    void HAL_Delay(uint32_t Delay)

     功能:实现毫秒级延时

     参数:延时时间(ms)

     返回值:无

   GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx,  uint16_t GPIO_Pin) 

     功能:读取指定引脚的电平状态

     参数: GPIO_TypeDef * GPIOx  端口号

                   uint16_t GPIO_Pin          引脚号

     返回值:GPIO_PinState  电平状态

                   GPIO_PIN_RESET    0  

                   GPIO_PIN_SET         1 

   void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t  GPIO_Pin) 

     功能:翻转指定引脚的电平状态

     参数: GPIO_TypeDef * GPIOx  端口号

                   uint16_t GPIO_Pin          引脚号

     返回值:无

相关文章:

单片机--实战练习

目录 【1】GPIO 1.定义 2.应用 I - Input - 输入采集 O - Output - 输出控制 ​编辑​编辑 3.GPIO结构框图 4.功能描述 输入功能 输出功能 5.相关寄存器 【2】点亮一盏LED灯 1.实验步骤 2.编程实现 3.编译下载 4.复位上电 练习&#xff1a;实现LED灯闪烁…...

Go Etcd 分布式锁实战

1 分布式锁概述 谈到分布式锁&#xff0c;必然是因为单机锁无法满足要求&#xff0c;在现阶段微服务多实例部署的情况下&#xff0c;单机语言级别的锁&#xff0c;无法满足并发互斥资源的安全访问。常见的单机锁如Java的jvm锁Lock、synchronized&#xff0c;golang的Mutex等 对…...

Windows环境下pcl点云库 安装配置教程

本文为Windows配置点云库pcl步骤&#xff0c;具体win10、visual studio 2019、pcl1.11.1。 【1】下载安装包 Releases PointCloudLibrary/pcl GitHub 其中&#xff0c;AllInOne是一个包含了PCL库所有模块的单独下载包&#xff0c;方便快速获取整个PCL库&#xff0c;而pdb则…...

岗位分析与可视化系统(三)

五、可视化 5.1薪资页面 在views,编写薪资分析的代码 def salary(request): uname = request.session[username] userInfo = User.objects.get(username=uname) edus, workexps = getSalary.getPageDt() defaultedu = 不限 defaultworkexp = 不限 if request.G…...

unity进阶学习笔记:json和xml

1早期的数据格式 在早期程序开发中一个简单且常用的数据格式为CSV。该格式单纯依靠逗号来分割数据。目前windows的office依然支持CSV解析&#xff0c;我们可以试着新建一个txt文件&#xff0c;在里面加入逗号分隔的信息&#xff1a; a, 1, 15, 30, true 将txt文件后缀改为csv&…...

数据结构之初识树与堆

前言&#xff1a;前面学习了顺序表&#xff0c;队列&#xff0c;栈&#xff0c;链表&#xff0c;我们知道他们都是一种线性表&#xff0c;是一种线性结构&#xff0c;而除此之外&#xff0c;仍有许多我们还没认识的结构&#xff0c;比如树形结构&#xff0c;不同于线性结构&…...

虚拟化技术 — VirtIO 虚拟设备接口标准

目录 文章目录 目录VirtIOVirtIO 虚拟设备接口标准VirtIO 的前后端分层架构标准VirtIO 的数控路径分离架构标准VirtIO 的传输层标准VirtIO 标准在 Linux 中的实现VirtIO VirtIO 由 Rusty Russell 开发,最初是为了支持自己开发的 lguest Hypervisor,其设计目标是在虚拟化环境…...

Dubbo——SpringBoot集成Dubbo(@Autowired和@Reference的区别、Dubbo的服务治理)

Dubbo——原生API实现远程调用_Strine的博客-CSDN博客 在上一篇文章中我们讲了如何使用原生API发起远程调用&#xff0c;显然这种方式肯定是非常麻烦的&#xff0c;因此我们这里就讲如何使用SpringBoot去集成Dubbo将这些配置简化。 生产者服务 添加配置文件 dubbo:applicat…...

高并发系统的三把利器

目录 1.限流 2.缓存 2.1.缓存的使用场景 3.降级 3.1.什么是降级&#xff1f; 3.2.服务降级方式 4.其他高并发手段 4.1. 集群 4.2.拆分 4.2.1 应用拆分 4.2.2 数据库 4.3. 静态化 4.4.削峰 4.5.限流 5.总结 参考 保护高并发系统的三大利器&#xff1a;限流、熔…...

AppiumWinAppDriver自动化测试 Failed to locate opened application window with appid问题

问题产生原因&#xff1a;1.期望能力选项参数丢失 例如&#xff1a;capabilities.setCapability("appWorkingDir", "C:\\Program Files (x86)\\Tencent\\app")) 某些app需要设置目录属性才可以启动。 问题产生原因&#xff1a;2.访问权限不足 例如&…...

渗透测试--6.1.aircrack-ng破解wifi密码

目录 1.Aircrack-ng简介 1.1 airdump-ng 1.2 aireplay-ng 1.3 aircrack-ng 2.Deauth攻击 3.aircrack-ng工具破解无线网络密码 步骤一&#xff1a;虚拟机连接实验需要用到的网卡 步骤二&#xff1a;设置网卡为监听模式 步骤三&#xff1a;使用wlan0mon网卡扫描附近wif…...

C++中的继承、以及赋值兼容转换。

一、继承的概念及定义 继承可以使代码复用&#xff0c;允许在保持原有类特性的基础上进行扩展。 举个例子&#xff1a;就好比我现在要封装老师、学生等这些人的属性和方法&#xff0c;但是这些人都有重复的属性和方法&#xff0c;比如name、age、sex等等&#xff0c;那么我可…...

js浏览器实现简单的实时扫一扫功能

描述&#xff1a;利用vue-qrcode-reader插件实现h5/wap端简单的扫一扫功能 参考文档&#xff1a;https://gruhn.github.io/vue-qrcode-reader/demos/Validate.html官方文档 安装插件 npm i --save vue3-qr-reader 或 yarn add vue3-qr-reader 注意项目运行必须在https下&…...

unity愤怒的小鸟学习制作(二)

终于又开始了啦啦啦&#xff0c;我有一个自己的相机了&#xff0c;真开心&#xff0c;诶嘿 视频链接和素材如下&#xff1a;视频 小鸟的飞出 想要让小鸟在拉开弹弓之后能飞出去&#xff0c;就必须让这个组件失活&#xff0c;如下 所以我们更改脚本内容&#xff0c;加入&#…...

干外包3年,彻底寄了...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…...

软考高项论文范文(三)

论信息系统项目的沟通管理 【摘要】&#xff08;该摘要共313个字符&#xff09; 本文讨论了ⅹⅹ省社保系统民政统一软件开发项目的沟通管理。该项目是在国家大社会保险政策指导下于2018年10月份正式启动的。该系统为用户提供了优抚安置、救灾救济等十大主要业务功能。在本文中…...

浅谈谈谈OTA召回2023

近日&#xff0c;国家市场监督管理总局发布特斯拉召回公告&#xff0c;一下子掀起了互联网热议&#xff0c;这次召回的范围是在2019年1月12日至2023年4月24日期间国内销售特斯拉汽车&#xff08;含国产和进口共计110万辆车&#xff09;&#xff0c;在这个召回公告中有两点值得关…...

【GDI+】旋转文本/斜体字

一、需求 想要绘制如下所示的斜体字&#xff0c;45度 二、分析&思路 Graphics类有个 RotateTransform方法&#xff0c;可以传入任意角度的值来旋转画板。但是这个方法的旋转中心是画板的左上角&#xff0c;所以直接单单用这个方法不能满足我们的需求。此外&#xff0c; G…...

python3 面试题总结

Python global 语句的作用lambda 匿名函数好处Python 错误处理Python 内置错误类型简述 any() 和 all() 方法Python 中什么元素为假&#xff1f;提高 Python 运行效率的方法Python 单例模式为什么 Python 不提供函数重载实例方法/静态方法/类方法__new__和 __init __方法的区别…...

select poll epoll有什么区别

select/poll select 实现多路复用的方式是&#xff0c;将已连接的 Socket 都放到一个文件描述符集合&#xff0c;然后调用 select 函数将文件描述符集合拷贝到内核里&#xff0c;让内核来检查是否有网络事件产生&#xff0c;检查的方式很粗暴&#xff0c;就是通过遍历文件描述…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...