单片机:实战练习

news2024/11/20 0:46:19

目录

【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
     //PB0
	 GPIOB->MODER |=1<<0;  //配置输出模式  将第0位置1
	 GPIOB->MODER &=~(1<<1);   //将第1位置0
	 GPIOB->OTYPER &= ~(1<<0); //推挽输出模型
	 //PB1
	 GPIOB->MODER |=1<<2;  //配置输出模式
	 GPIOB->MODER &=~(1<<3);
	 GPIOB->OTYPER &= ~(1<<1); //推挽输出模型
	 //PB2
	 GPIOB->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(); //点亮LED2
		LED3_OFF(); //熄灭LED3、LED4
		LED4_OFF(); 
		Delay();    //延时
		LED3_ON(); //点亮LED3
		LED2_OFF();//熄灭LED2、LED4
		LED4_OFF();
		Delay();   //延时
		LED4_ON();//点亮LED4
		LED2_OFF();//熄灭LED2、LED3
		LED3_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          引脚号

     返回值:无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“视频AI+职业教育”会碰撞出什么样的火花?

玩过腾讯智影、用过D-ID、体验过Vega Al&#xff0c;终于等到要出“视频AI教育”类的应用型产品了&#xff0c;很振奋。 展望&#xff1a; 已经实现AI情绪分析、AI智能审核、AI视频内容检索、AI多语言实时字幕、AI会议速记、AI窄带高清编码多种功能。 “视频AI职业教育”&#…

ubantu22里面配置apache2的cgi

在 Ubuntu 22.04 中配置 Apache2 的 CGI 1.安装 Apache2 在终端中使用以下命令安装 Apache2&#xff1a; sudo apt-get update sudo apt-get install apache22.启用 CGI 模块 在 Ubuntu 中默认情况下&#xff0c;CGI 模块是禁用的。您需要手动启用它。在终端中使用以下命令来启…

为什么要使用Thrift与Protocol Buffers?

编码数据的格式 程序通常&#xff08;至少&#xff09;使用两种形式的数据&#xff1a; 在内存中&#xff0c;数据保存在对象、结构体、列表、数组、散列表、树等中。 这些数据结构针对 CPU 的高效访问和操作进行了优化&#xff08;通常使用指针&#xff09;。如果要将数据写…

centos7中安装mattermost

centos7中安装mattermost 步骤如下: 第一步安装依赖项&#xff1a;在终端中执行以下命令以安装所需的依赖项 sudo yum install epel-release sudo yum install yum-utils sudo yum install wget第二步&#xff0c;下载Mattermost安装包&#xff1a;执行以下命令以下载Mattermo…

PowerShell Install 二进制方式部署Python3

Python 前言 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python 由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。 Python downlo…

经典神经网络(3)Vgg-Net及其在Fashion-MNIST数据集上的应用

经典神经网络(3)VGG_使用块的网络 1 VGG的简述 1.1 VGG的概述 VGG-Net 是牛津大学计算机视觉组和DeepMind公司共同研发一种深度卷积网络&#xff0c;并且在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名。通过使⽤循环和⼦程序&#xff0c;可以很容易地在任…

JavaEE(系列6) -- 多线程(解决线程不安全系列1-- 加锁(synchronized)与volatile)

首先我们回顾一下上一章节引起线程不安全的原因 本质原因:线程在系统中的调度是无序的/随机的(抢占式执行) 1.抢占式执行 2.多个线程修改同一个变量. 一个线程修改一个变量>安全 多个线程读取同一个变量>安全 多个线程修改不同的变量>安全 3.修改操作,不是原子的.(最…

容器安装Datax+Datax-web2.1(一)

目录 简介1、安装Datax-web2.1.11&#xff09;安装docker-compose2&#xff09;创建Datax-web和MySQL容器 2、安装Datax-web2.1.21&#xff09;安装MySQL2&#xff09;初始化数据3&#xff09;安装datax和datax-web4&#xff09;浏览器登录 DataxDatax-web2.1实现MySQL数据库数…

LeetCode 21. 合并两个有序链表 | C++语言版

LeetCode 21. 合并两个有序链表 | C语言版 LeetCode 36&#xff1a; 两个链表的第一个公共结点题目描述解题思路思路一&#xff1a;使用前缀和代码实现运行结果参考文章&#xff1a; 思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a; LeetCode 36&#x…

CANoe-如何在Trace窗口显示SYN和FIN报文、同一条以太网报文在Trace窗口中的多条显示

1、如何在Trace窗口显示SYN和FIN报文 当我们使用CANoe实现TCP通信时,希望在Trace窗口直观显示报文的类型:SYN、ACK、FIN。显然Trace窗口也是支持这样的功能的。但很多时候由于一些人为的不正确的设置和配置,造成无法显示。 如果想解析出SYN报文,首先在Trace窗口选择正确的…

5个高清视频素材网站,免费下载~

免费高清视频素材网站&#xff0c;这几个你一定要知道&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多&#xff0c;像风景、…

dcdc降压电路原理及仿真

在之前的文章 DCDC 降压芯片基本原理及选型主要参数介绍 中已经大致讲解了dcdc降压电路的工作原理&#xff0c;今天再结合仿真将buck电路工作过程讲一讲。 基本拓扑 上图为buck电路的基本拓扑结构&#xff0c;开关打到1&#xff0c;电感充电&#xff1b;开关打到0&#xff0c;…

pdf怎么转换成jpg格式的图片,5种方法详细教程

pdf怎么转换成jpg格式的图片&#xff0c;为什么这样做呢&#xff1f;那是因为将PDF转换成JPG格式的主要原因是方便在演示文稿、网页或社交媒体等平台上展示和分享PDF文件的内容。JPG格式具有广泛的兼容性和易于传输的特点&#xff0c;而且可以轻松地进行编辑和调整大小。此外&a…

Java反射简单介绍_01

文章目录 1. 什么是反射2. Java中类加载的三个阶段3. 反射机制提供的相关类4. Java中获取Class类的三种方式5. Class类提供的功能5.1. 获取Field类方法5.2. 获取Method类方法5.3. 获取Constructor类方法5.4. Class中其他方法 1. 什么是反射 Java中的反射主要是体现在运行期间,…

uniapp 用css画五边形(app 小程序)

效果图 css .scoreLabel{ background: $yxs-theme-color; width: 64rpx; height: 69rpx; line-height: 32rpx; font-size: 28rpx; font-family: DINPro; f…

点亮未来明灯,引领绿色革命

随着全球气候变化日趋严重&#xff0c;能源转型成为解决气候问题和提高全球能源安全合理性的必要措施之一。可持续能源技术因其对环境的友好性和可再生性而成为了当前热点话题。可持续能源技术已经成为人们日益关注的焦点。这项技术可以帮助我们减少对化石燃料的依赖&#xff0…

如何选择适合自己的小程序开发框架

随着微信、支付宝等开放平台的壮大&#xff0c;移动应用生态市场的蓬勃发展&#xff0c;例如小程序已经成为各个企业和开发者的重要选择。为了提高小程序的开发效率和代码重用性&#xff0c;许多第三方开发框架应运而生。 准备为需要的朋友整理一些常见的小程序第三方开发框架…

能伸展脖子的机器人?东京大学最新研究成果:基于鸵鸟肌肉骨骼结构和行为,具有高度灵活性的新型机械臂—RobOstrich(附论文)

原创 | 文 BFT机器人 得益于高度灵活的颈部&#xff0c;鸟类可以做很多事情&#xff0c;无论是转过头梳理自己的后背&#xff0c;在飞行过程中“眼观六路”&#xff0c;还是在地面或树上难以触及的角落和缝隙寻找食物。而在所有鸟类中&#xff0c;鸵鸟以其结实灵巧的颈部脱颖而…

顶部菜单栏-popuwindows

效果 布局文件 猜想与步骤 1.通过.9.png 制作尖尖效果&#xff0c; 2.popuwindows弹出布局框 以及灰色背景 3.点击按钮进入不同功能

QT运行程序后出现无法打开输出文件问题

:-1: error: cannot open output file release\Dailin.exe: Permission denied collect2.exe:-1: error: error: ld returned 1 exit status 如上所示报错。这个是因为用户写的程序开辟空间后没有释放造成的。用户需要把开辟了空间释放就可以了。 我的例子如下。 My_Uart *Ua…