stm32的GPIO寄存器操作以及GPIO外部中断,串口中断

news2024/11/26 21:48:44

一、学习参考资料
       

        (1)正点原子的寄存器源码。

        (2)STM32F103最小系统板开发指南-寄存器版本_V1.1(正点)

        (3)STM32F103最小系统板开发指南-库函数版本_V1.1(正点)

        (4)Cortex-M3权威指南(中文)

        (5)STM32中文参考手册_V10

        (6)stm32cubemx可视化时钟树配置

        (7)其他博主文章

       本文主要以stm32f1系列单片机为研究对象,从寄存器层面对时钟树的配置、中断优先级的配置进行阐述。
        本文主要介绍GPIO口的寄存器配置,以及GPIO的外部中断的配置。        

 二、普通GPIO模式的配置

2.1、GPIO的基本知识点

      

        由图可以所有普通GPIO口的外设都挂载在APB2总线上,GPIO的普通模式配置是比较简单的。

        (1)使能APB2上对应GPIO的外设时钟。

        (2)对应GPIO的寄存器设置其模式,并且设置高低电平。

输入模式:

  1. 浮空输入(GPIO_Mode_IN_FLOATING)

浮空即逻辑器件既不接高电平也不接低电平,电压处于确定的情况,多用于外部按键ADC输入,减少上下拉电阻对结果的影响。

        2.上拉输入(GPIO_Mode_IPU)

上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。

        3.下拉输入(GPIO_Mode_IPD)

就是把电压拉低,拉到GND。与上拉原理相似。

        4.模拟输入(GPIO_Mode_AIN)

模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0、1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。

输出模式:

  1. 开漏输出(GPIO_Mode_Out_OD)

输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。开漏形式的电路有以下几个特点:

利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND,IC内部仅需很小的栅极驱动电流。

一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 ,阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

可以将多个开漏输出的Pin连接到一条线上,通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。

        2.开漏复用功能(GPIO_Mode_AF_OD)

可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)。

        3.推挽输出(GPIO_Mode_Out_PP)

可以输出高、低电平,连接数字器件;推挽结构一般是指两个三级管分别受到互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形方法任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出即可以向负载灌电流。推拉式输出级即提高电路的负载能力,又提高开关速度。

        4.推挽复用功能(GPIO_Mode_AF_PP)

可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)。

        GPIO与外设连接时的配置模式:STM32中文手册110页(外设的GPIO配置),配置不同的功能的时候可以参考。

2.2、普通GPIO模式的配置

            使能APB2上对应的GPIO的时钟。

        设置对应的GPIO模式。

        下面是GPIO的普通模式的配置代码(正点):

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟	   	 
	RCC->APB2ENR|=1<<6;    //使能PORTE时钟	
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出   	 
  GPIOB->ODR|=1<<5;      //PB.5 输出高
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽输出
	GPIOE->ODR|=1<<5;      //PE.5输出高 
}

 三、GPIO的外部中断模式

3.1、GPIO外部中断的基础知识

        STM32 的每个 IO 都可以作为外部中断 的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

        STM32F103 19 个外部中断为:

                                线 0~15 :对应外部 IO 口的输入中断。
                                线 16 :连接到 PVD 输出。
                                线 17 :连接到 RTC 闹钟事件。
                                线 18 :连接到 USB 唤醒事件。
        GPIO外部中断的配置的基本流程如下所示:
        (1) 辅助功能 IO 时钟使能。
        (2)设置GPIO映射到对应的外部中断EXTI。
        (3)开启line BITx上的中断。
        (4)外部中断的触发方式的选择(上升沿或者下降沿)。

3.2、GPIO外部中断的寄存器配置

(1)辅助功能IO时钟使能。
        
        注意,辅助功能IO时钟的使能是在APB2ENR使能寄存器的首位。其他外设的辅助功能IO时钟使能是在AFIO寄存器中。
(2) 设置GPIO映射到对应的外部中断EXTI。
        这里就了到了上面讲的,将外部中断划分成16组的形式,对应16个引脚。
 
        
(3)开启line BITx上的中断。
        中断的配置寄存器中和时间配置寄存器是在一起的,这里说明一下中断寄存器和事件寄存器之间的区别。
         事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。

(4)外部中断的触发方式的选择(上升沿或者下降沿)。

3.3、GPIO的中断配置代码

        下面是正点的GPIO中断配置代码:

        其中外部中断的映射寄存器是四个bit位对应设置,这里函数入口只会给对那个引脚进行设置,这时候设置对应位时,就需要进行处理一下。

        如上图所示,通过需要配置的引脚数PIN_NUM计算出来需要对那组寄存器进行配置(例如需要配置pin_5这个寄存器,5/4=1,所以需要配饰EXI5[3:0]),并且需要计算出来配置的寄存器的起始偏移地址位置(例如需要配置pin_5这个寄存器,(5%4)*4=4,所以配置寄存器位就是AFIO_EXTICR2的第五位,即数组下表为4)。

//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:
//GPIOx:0~6,代表GPIOA~G
//BITx:需要使能的位;
//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线   	    
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 
{
	u8 EXTADDR;
	u8 EXTOFFSET;
	EXTADDR=BITx/4;          //得到中断寄存器组的编号
	EXTOFFSET=(BITx%4)*4;       //获得中断寄存器组的首偏移地址
	RCC->APB2ENR|=0x01;         //使能io复用时钟			 
	AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);   //清除原来设置!!!
	AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;       //EXTI.BITx映射到GPIOx.BITx 
	//自动设置
	EXTI->IMR|=1<<BITx;     //  开启line BITx上的中断
	//EXTI->EMR|=1<<BITx;   //不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
 	if(TRIM&0x01)EXTI->FTSR|=1<<BITx;    //line BITx上事件下降沿触发
	if(TRIM&0x02)EXTI->RTSR|=1<<BITx;    //line BITx上事件上升降沿触发
} 	  

        下面是AFIO结构体寄存器的封装代码:

typedef struct
{
  __IO uint32_t IMR;
  __IO uint32_t EMR;
  __IO uint32_t RTSR;
  __IO uint32_t FTSR;
  __IO uint32_t SWIER;
  __IO uint32_t PR;
} EXTI_TypeDef;
#define EXTI                ((EXTI_TypeDef *) EXTI_BASE)

  四、串口配置

4.1串口的基础知识

        串口的主要配置参数有:波特率数据位奇偶校验位停止位数据流控制

数据流控制(介绍):
        通过串口传输数据时,由于计算机之间处理速度或其他因素的影响,会造成丢失数据的现象。例如,台式机与单片机之间的通信,接收端数据缓冲区已满的情况下,继续收到数据,新发送来的数据就会由于无法处理造成丢失。数据流控制用于解决这个问题。通过控制发送数据的速度,确保数据不会出现丢失。

        数据流控制可以分为软件流控制(Xon/Xoff)和硬件流控制,如图6.17所示,也可以选择不使用数据流控制。软件流控制使用特殊的字符作为启动或停止的标志。而硬件流控制通过使用硬件信号(CTR/RTS)来实现使用硬件流控制时,在接收端准备好接收数据后,设定CTS为1,否则CTS为0。同样,如果发送端准备好要发送数据,则设定RTS为1;如果还未准备好,设置CTS为0

         下面是usart配置的一些知识:    

● 总线在发送或接收前应处于空闲状态
● 一个起始位
● 一个数据字 (8 9 ) ,最低有效位在前
0.5 1.5 2 个的停止位,由此表明数据帧的结束
● 使用分数波特率发生器 —— 12 位整数和 4 位小数的表示方法。
● 一个状态寄存器 (USART_SR)
● 数据寄存器 (USART_DR)
● 一个波特率寄存器 (USART_BRR) 12 位的整数和 4 位小数
● 一个智能卡模式下的保护时间寄存器 (USART_GTPR)

可配置的停止位
随每个字符发送的停止位的位数可以通过控制寄存器 2 的位 13 12 进行编程。
        1. 1个停止位:停止位位数的默认值。
        2. 2个停止位:可用于常规 USART 模式、单线模式以及调制解调器模式。
        3. 0.5个停止位:在智能卡模式下接收数据时使用。
        4. 1.5个停止位:在智能卡模式下发送和接收数据时使用。
空闲帧包括了停止位。

单字节通信
        清零TXE 位总是通过对数据寄存器的写操作来完成的。 TXE 位由硬件来设置,它表明:
        ● 数据已经从TDR 移送到移位寄存器,数据发送已经开始
        ● TDR 寄存器被清空
        ● 下一个数据可以被写进USART_DR 寄存器而不会覆盖先前的数据
        如果TXEIE 位被设置,此标志将产生一个中断。

下面是串口的波特率的设置:

        CPU的时钟频率越低,则某一特定波特率的误差也越低

        根据上面的公式,知道波特率和PCLK1时钟就可以计算出来串口设置对应波特率时候,寄存器位USARTDIV的值应设置为多少。不同的串口挂载的的总线位置是不一样的,所以计算的时候fclk的值是不一样的。串口有挂载在PCLK1或者PCLK2上的。

        下面是DMA的收和发的配置的形式:

        下面是硬件控制流的知识点。

        

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

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

相关文章

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录 前言 七、指针 7.1 指针与变量 7.1.1 指针类型和指针变量 7.1.2 指针所指变量 7.1.3 空指针、无效指针 7.2 指针操作 7.2.1 指针的算术运算 7.2.2 指针的比较 7.2.3 指针的递增和递减 7.3 指向指针的指针 前言 指针是C语言中一个重要的概念正确灵活运用指针 可…

单元测试该怎么写

单元测试对于开发人员来说很熟悉&#xff0c;各种语言都提供了单元测试的框架&#xff0c;用于自动化执行单元测试并生成测试报告。它通常提供了一组API和工具&#xff0c;使开发人员能够编写和运行测试用例&#xff0c;比较预期行为和实际行为之间的差异&#xff0c;并准确地识…

Android Studio新建项目缓慢解决方案

关于Android Studio2022新建项目时下载依赖慢的解决方案 起因解决方案gradle下载慢解决方案kotlin依赖下载慢解决方案 结尾 起因 新建Android Studio项目时&#xff0c;常会因为网络问题导致部分依赖下载缓慢&#xff0c;其中gradle和kotlin最拖慢进度。 解决方案 gradle下载…

Spring源码解析——IOC属性填充

正文 doCreateBean() 主要用于完成 bean 的创建和初始化工作&#xff0c;我们可以将其分为四个过程&#xff1a; 最全面的Java面试网站 createBeanInstance() 实例化 beanpopulateBean() 属性填充循环依赖的处理initializeBean() 初始化 bean 第一个过程实例化 bean在前面一篇…

四位十进制数字频率计VHDL,仿真视频、代码

名称&#xff1a;四位十进制数字频率计VHDL&#xff0c;quartus仿真 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 使用直接测频法测量信号频率&#xff0c;测频范围为1~9999Hz&#xff0c;具有超量程报警功能 演示视频&#xff1a;四位十进制数字频…

5分钟理解什么是卷积的特征提取

大家好啊&#xff0c;我是董董灿。 卷积算法之所以重要&#xff0c;关键在于其提取特征的能力。 5分钟入门卷积算法中提到&#xff0c;卷积模仿的就是人眼识图的过程&#xff0c;以“感受野”的视角去扫描图片&#xff0c;从而获取不同区域的图片信息。 在这一过程中&#x…

Scratch3.0下载

通俗易懂&#xff0c;直接上链接 链接&#xff1a;https://pan.baidu.com/s/1n-QFEQWT8im8BHQu1wIjtg?pwd1016 提取码&#xff1a;1016

高级IO(Linux)

高级IO 五种IO模型高级IO重要概念同步通信 vs 异步通信阻塞 vs 非阻塞 非阻塞IOfcntl实现函数SetNoBlock轮询方式读取标准输入 I/O多路转接之select初识selectselect函数原型参数解释参数timeout取值关于fd_set结构关于timeval结构函数返回值三级目录 理解select执行过程socket…

多功能频率计周期/脉宽/占空比/频率测量verilog,视频/代码

名称&#xff1a;多功能频率计周期、脉宽、占空比、频率测量verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 多功能频率计&#xff0c;可测量信号的周期、脉冲宽度、占空比、频率&#xff0c;语言为verilog&#xff0c;quartus软件设计仿真…

B (1089) : DS单链表--合并

Description 假定两个单链表是递增有序&#xff0c;定义并实现以下函数&#xff0c;完成两个单链表的合并&#xff0c;继续保持递增有序 int LL_merge(ListNode *La, ListNode *Lb) Input 第1行先输入n表示有n个数据&#xff0c;接着输入n个数据 第2行先输入m表示有M个数据…

扭线机控制

扭线机属于线缆加工设备&#xff0c;线缆加工设备种类非常多。有用于网线绞合的单绞&#xff0c;双绞机等&#xff0c;有关单绞机相关算法介绍&#xff0c;大家可以查看专栏相关文章&#xff0c;有详细介绍&#xff0c;常用链接如下&#xff1a; 线缆行业单绞机控制算法&#…

MySQL命令行中文乱码问题

MySQL命令行中文乱码问题&#xff1a; 命令行界面默认字符集是gbk&#xff0c;若字符集不匹配会中文乱码或无法插入中文。 解决办法&#xff1a;执行set names gbk; 验证&#xff1a; 执行命令show variables like ‘char%’;查看默认字符集。 创建数据库设置字符集utf8&…

Nginx详细学习记录

1. Nginx概述 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 1.1 Nginx基础架构 Nginx默认采用多进程工作方式&#xff0c;Nginx启动后&#xff0c;会运行…

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…

HTTPS工作过程,国家为什么让http为什么要换成https,Tomcat在MAC M1电脑如何安装,Tomcat的详细介绍

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹&#xff08;这个要求按顺序&#xff09; zsh: permission denied TOMCAT的各部分含义&#xff1a; 引言 在密码中一般是&#xff1a;明文密钥->密文&#xff08;加密&#xff09; &#xff…

ubuntu 安装postgresql,增加VECTOR向量数据库插件 踏坑详细流程

PGSQL安装&#xff0c;删除&#xff0c;运行&#xff0c;修改密码流程 Ubuntu18.04安装与配置postgresql含远程连接教程&#xff08;含踩坑记录&#xff09;_sudo apt-get install postgresql-CSDN博客 详细安装流程以上博客&#xff0c;自己也记录下 安装vector扩展连接 声明…

微服务学习(十):安装Maven

微服务学习&#xff08;十&#xff09;&#xff1a;安装Maven 1、下载Maven 官网下载 2、将下载后的资源包上传到服务器 3、解压资源包并安装 tar -zxvf apache-maven-3.9.5-bin.tar.gz4、配置环境变量 vi /etc/profileexport MAVEN_HOME/home/maven/apache-maven-3.9.5 …

如何部署一个高可用高并发的电商平台

假设我们已经有了一个特别大的电商平台&#xff0c;这个平台应该部署在哪里呢&#xff1f;假设我们用公有云&#xff0c;一般公有云会有多个位置&#xff0c;比如在华东、华北、华南都有。毕竟咱们的电商是要服务全国的&#xff0c;当然到处都要部署了。我们把主站点放在华东。…

汇编语言是怎么一回事?

汇编语言基础 汇编指令和机器码的区别 数据的表示 各类汇编指令 数据传送和算法运算 位运算 条件分支指令 函数调用 字符串处理 流水线和指令调度 流水线实现指令级并行 编译器指令调度 CPU乱序与投机执行 汇编器将汇编语言翻译成 CPU 可以执行的机器码&#xff0c…

【软考】9.1 顺序表/链表/栈和队列

《线性结构》 顺序存储和链表存储 每个元素最多只有一个出度和一个入度&#xff0c;表现为一条线状链表存储结构&#xff1a;每个节点有两个域&#xff0c;即数据&#xff0c;指针域&#xff08;指向下一个逻辑上相邻的节点&#xff09; 时间复杂度&#xff1a;与其数量级成正…