STM32初识---概念了解(下)

news2024/11/25 19:25:42

复位和时钟控制(RCC)

系统复位

当发生以下任一事件时,产生一个系统复位:

1. NRST引脚上的低电平(外部复位)

2. 窗口看门狗计数终止(WWDG复位)

3. 独立看门狗计数终止(IWDG复位)

4. 软件复位(SW复位)

5. 低功耗管理复位

电源复位

当以下事件中之一发生时,产生电源复位:

1. 上电/掉电复位(POR/PDR复位)

2. 从待机模式中返回

备份区复位

备份区域拥有两个专门的复位,它们只影响备份区域

当以下事件中之一发生时,产生备份区域复位。

1. 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)(见6.3.9节)中的 BDRST位产生。

2. 在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。

时钟控制

什么是时钟?时钟打开,相应的设备工作。

时钟来源?

三种不同的时钟源可被用来驱动系统时钟(SYSCLK)

1. HSI振荡器时钟(高速内部时钟)

2. HSE振荡器时钟(高速外部时钟)

3. PLL时钟(锁相环倍频时钟)

二级时钟源:

1. 40kHz低速内部RC(LSIRC)振荡器

2. 32.768kHz低速外部晶体(LSE晶体)

使用CubeMX来配置时钟:

1. 创建一个新的工程:

 2. 打开SYS,将Debug改成 Serial Wire:

3. 打开RCC配置时钟,将HSE振荡器时钟 配置成 “Crystal ....”:

 4. 打开上方的“Clock Configuration"大选项:

 

 4.1 按照下图,橙色圈中是需要修改的配置,橙色圈中修改完毕后按下回车其他会自动配置:

 4.2 配置完之后的时钟图:

 5. 点击上方的“Project Manager"大选项, 进行每个项目都需要的设置:

 

6. 生成代码:

7. Keil被自动打开,查看main函数中关于时钟部分的代码:

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

中断和事件

什么是中断?         

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的 程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

什么是EXTI?         

外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线。每个中断/事件线都对应有一 个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断/事 件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI的结构体:

1.  EXTI_Line 就是中断/事件线,共23条

2. EXTIMode_TypeDef EXTI_Mode 就是EXTI模式

3. EXTITrigger_TypeDef EXTI_Trigger 就是触发的类型

4. FunctionalState EXTI_LineCmd 就是EXTI的控制

什么是优先级?         

抢占优先级响应优先级的区别:

高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

这两句也就是说,响应优先级再高也不能打断原有的中断,但是当抢占优先级相同时,响应优先级的高低可以决定中断执行的顺序

如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行

什么是优先级分组?        

 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把 指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:

第一种分组 第0组:所有4位用于指定响应优先级

第二种分组 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

第三种分组 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

第四种分组 第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

第五种分组 第4组:所有4位用于指定抢占式优先级

什么是NVIC?        

STM32通过中断控制器NVIC(Nested Vectored Interrupt Controller)进行中断的管理 。 NVIC是属于Cortex内核的器件,不可屏蔽中断(NMI)和外部中断都由它来处理,但是SYSTICK 不是由NVIC控制的

NVIC的结构体:

1. NVIC_IRQChannel 就是选择中断中断/事件线,共23条

2/3. 分别配置抢占优先级和响应优先级

4. FunctionalState NVIC_IRQChannelCmd 就是NVIC的控制(ENABLE 代表 打开)

什么是中断向量表?         

每个中断源,都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程 序入口的跳转指令构成一张表,称为中断向量跳转表。

使用中断的方式点亮LED

之前使用的是轮询的方式,即不断WHILE(1)中查询按钮是否被按下,这样实现虽然看起来没什么问题,但是其实 实际会有一些小小的时间延迟,比如我按下按钮2,系统还是会先检测是否按下按钮1,如果代码一多,时间的滞后就会更加明显,所以使用中断的方式是一种更好的解决方法。

1. 在CubeMX进行时钟和GPIO口的配置:

1.1 

1.2 

1.3

1.4  

 

1.5(这步很重要,因为之前的轮询法此处配置的是GPIO_Input)

 

根据原理图可知,按键按下时对应GPIO口会被拉低,所以可以将PA0和PA1EXTI模式配置成下降沿触发

1.6 (打开中断)

 由于现在只有两个中断,所以抢占优先级和响应优先级可以先不用设置!

1.7

1.8

2. 在Keil5进行main函数的编写:

2.1 打开gpio.c 可以看到对于刚刚四个GPIO口的设置:

2.2 打开stm32f1xx_it.c 可以看到各种中断相关的函数(Handler),拉到最低,可以看到EXTI0和EXTI1的中断相关函数:

 可见,两个中断处理函数都跳转到了一个函数,不同的就是输入的参数,右键跳转这个HAL_GPIO_EXTI_IRQHandler():(跳转前先编译,否则识别不到)

 可见,这个函数又在调用这个HAL_GPIO_EXTI_Callback的函数,而这个函数的定义也就在下面,并附上了前缀“__weak”,这个意思是这个函数可以被重写,其实这就是中断处理函数,只需要在main函数中,重写这个函数达到想要的目的就可以:

2.3  编写中断处理函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin)
	{
		HAL_Delay(50); //在检测到按键被按下的低电平的时候,先延迟50ms,再进行判断
		case GPIO_PIN_0: //如果A0对应的按钮按下
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){ //如果延迟过后依然是低电平
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); //反转LED1的状态
			}
		break;
		
		case GPIO_PIN_1: //如果A1对应的按钮按下
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == GPIO_PIN_RESET){ //如果延迟过后依然是低电平
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); //反转LED2的状态
			}
		break;
	}
	
}

2.4 编译并烧录 

3. 实现效果

用更好的方法实现了之前轮询实现的按键点灯!

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

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

相关文章

XML文档详解

目录 XML文档 一、XML文件 二、Dom4J解析XML文件 三、Sax解析XML文件 四、使用Dom4j的XPath解析XML文件 4.1XPath语法 4.2 获取sys-config.xml文件的配置信息 4.3 获取server.xml文件的配置信息 4.4 获取bookstore.xml文件的配置信息 XML文档 一、XML文件 1.1 学习重…

s3fs安装使用

s3fs安装使用 前言 最近在预研将对象存储桶挂载到本地文件系统的需求,查阅了一些相关的资料,找到s3fs-fuse开源组件,可以满足需求,本文主要记录一下s3fs的部署以及使用。 s3fs简介 s3fs 是一个 C 开发的开源工具,可…

Amplify-Shader-Pack下载

ASE相关效果资源https://download.csdn.net/download/mayzhengxi/87915649?spm1001.2014.3001.5503

[linux] ebtables技术

Linux系统中使用ebtables技术 ebtables就是以太网桥防火墙,以太网桥工作在数据链路层(MAC层),ebtables主要过滤数据链路层数据包,ebtables能过滤桥接流量。ebtables每个阶段的过滤时机都比iptables早。 ebtables的配置…

centos7.9修改ssh默认的端口号

多开几个ssh,防止配置文件错误,将自己关在服务器外面了 netstat -ntlp|grep ssh # ssh对应的端口号 修改sshd_config配置文件 /etc/ssh/sshd_config,重启sshd服务 #Port 22 Port 10011 # 端口号自己定义,不能超过65535&#xf…

基于Java+Swing+Mysql影院购票系统

基于JavaSwingMysql影院购票系统 一、系统介绍二、功能展示1.用户登陆2.用户订票管理3.电影售票中心4.电影上映管理4.退票记录查询 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看管理员登陆、用户订票管理、电影上映管理、电影售票中心、退票记录查询…

重定义/自定义printf到串口输出实现的三种方法(cubeide)

重定义/自定义printf到串口输出实现的三种方法(cubeide) 文章目录 重定义/自定义printf到串口输出实现的三种方法(cubeide)1.重写_write函数2.重定义PUTCHAR_PROTOTYPE宏3.va_list自定义printf总结: 1.重写_write函数 注释掉syscalls.c文件中…

Java中Map使用增强for循环和迭代器获取key和value

加油,新时代打工人! java中List集合三种获取集合元素方式 本文运行代码使用 jdk1.8 for 语句比较简单,用于循环数据。 Java迭代器(Iterator)是 Java 集合框架中的一种机制,是一种用于遍历集合&#xff08…

非线程安全问题

目录 实例变量共享导致的“非线程安全问题” 如何解决这个问题? i--与System.out.println()出现引起的“非线程安全问题” 非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流…

科目一速通技巧笔记,简记

常规 累计积分制度(12满)周期12月 虚假材料1年,假1吊二撤三醉五逃终身 假1500 骗三2k以下 初次领证1年实习期、实习标志,18~70岁 拼装车、报废车,吊销 200~2k 没有中心线(一条路)城市道路3…

路径规划算法:基于白鲸优化的路径规划算法- 附代码

路径规划算法:基于白鲸优化的路径规划算法- 附代码 文章目录 路径规划算法:基于白鲸优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法白鲸…

Python、STK、MATLAB的连接和使用

写在前面 预备知识: Python通过命令行调用MATLAB的简单实现。这篇文章讲明了如何使用 Python 调用 MATLAB 的原理和过程,并给出相应代码。 STK、MATLAB、SQL的连接和使用。这篇文章讲明了STK 11.2、MATLAB 2014a、SQL 2019的安装过程,以及…

超越99%的程序员,chatgpt用C++写个线程安全无锁环形队列

​肝了一个周末,我们一起来欣赏chatgpt写的代码吧。让其用C为我们写一个线程安全的环形队列,并逐步提出一些需求。 先看带锁的实现。 带锁版本 我对chatgpt的需求是: 用C实现线程安全的环形队列,提供代码注释,以及g…

Meetup 报名|07.22 StarRocks Friends 与你相约广州

夏日炎炎,经历了杭州和上海两站的成功活动后,社区开发者的热情依旧如火如荼!在更加炽热的七月,我们即将迎来 StarRocks & Friends 的第三站--广州! 社区依旧秉持连接 StarRocks 社区专家与用户共同探讨大数据领域…

MySQL数据库 - 基本数据类型

目录 一、数据类型分类 二、数据类型 1、tinyint 类型 有符号 tinyint 范围测试 无符号 tinyint 范围测试 2、bit 类型 3、float 类型 有符号 float 范围测试 无符号 float 范围测试 4、decimal 类型 5、char 类型 6、varchar 类型 7、日期类型 8、enum类型、set类型…

Codeforces Round 739 (Div. 3)

A.Dislike of Threes AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N2e510; int f[N]; int cnt; int main() {for(int i1;;i){if(i%3!0&&i%10!3) f[cnt]i;if(cnt>1000) break…

第一阶段-第六章 Python的数据容器

目录 一、数据容器入门  1.学习目标  2.为什么要学习数据容器  3.什么是数据容器  4.本小节的总结 二、数据容器&#xff1a;list&#xff08;列表&#xff09;  2.1列表的定义  1.学习目标  2.为什么需要列表  3.列表的定义  4.本节的代码演示  5.本小节的…

【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~

Java练习题 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一、填空题 面向对象的三大特征&#xff1a;_______ 、_______ 、_______。类由_______和_______组成。运算符_______的作用是根据对象的类型分配内存空间。当对象拥有内存空间时&#xff0c;会自动调…

oceanbase基础

与mysql对比 分布式一致性算法 paxos 存储结构&#xff08;引擎&#xff09;用的是两级的 数据库自动分片功能&#xff0c;提供独立的obproxy路由写入查询等操作到对应的分片 多租户 方便扩展 存储层 http://www.hzhcontrols.com/new-1391864.html LSM tree&#xff0c;is very…

CnOCR 使用教程

目录 一、 简介二、使用教程三、效果展示 一、 简介 CnOCR 是 Python 3 下的文字识别&#xff08;Optical Character Recognition&#xff0c;简称OCR&#xff09;工具包&#xff0c;支持简体中文、繁体中文&#xff08;部分模型&#xff09;、英文和数字的常见字符识别&#…