3.外设GPIO、中断

news/2024/9/22 16:45:10/文章来源:https://www.cnblogs.com/aQxiong/p/18379060

GPIO:通用输入输出端口
GPIO特点:
1.快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
2.每个IO口都可以做中断
3.支持8种工作模式
GPIO电气特性:
STM32工作电压范围:2 V ≤ VDD ≤ 3.6 V
GPIO识别电压范围:
  COMS端口:-0.3V ≤ VIL ≤ 1.164V(0);1.833V ≤ VIH ≤ 3.6V(1)
  TTL端口:电平TF,5V
GPIO输出电流:单个IO最大25mA,总最大150mA,如果大于要考虑扩流方案:接三极管、MOS管、继电器

STM32引脚类型:电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚
IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚

施密特触发器:整形电路,非标准方波->方波

MOS管是压控型元件,通过控制栅源电压( Vgs )来实现导通或关闭
    G:栅极
    S:源极
    D:漏极
导通条件:
    P:Vgs < 0
    N:Vgs > 0
 
GPIO工作模式
输入模式:
    1.输入浮空:空闲时,IO状态不确定,由外部环境决定
    2.输入上拉:空闲时,IO呈现高电平
    3.输入下拉:空闲时,IO呈现低电平
模拟输入:
    4.模拟功能:专门用于模拟信号输入或输出,如:ADC和DAC
通用输出模式:
    5.开漏输出:不能输出高电平,必须有外部(或内部)上拉才能输出高电平
    6.推挽输出:可输出高低电平,驱动能力强
复用功能模式:
    7.开漏式复用功能:不能输出高电平,必须有外部(或内部),上拉才能输出高电平;由其他外设控制输出
    8.推挽式复用功能:可输出高低电平,驱动能力强;由其他外设控制输出
 

GPIO寄存器介绍
F1系列:
CRL、CRH:配置工作模式,输出速度
IDR:输入数据,用于判断IO引脚电平
ODR:输出数据,用于设置IO引脚输出电平
BSRR:ODR寄存器的值

F4/F7/H7系列:
MODER:设置模式
OTYPER:输出类型
OSPEEDR:输出速度
PUPDR:上下拉电阻
IDR:输入数据
ODR:输出数据
BSRR:ODR寄存器值

建议使用BSRR寄存器控制输出
使用ODR,在读和修改访问之间产生中断时,可能会发生风险;BSRR则无风险。

设置通用外设驱动模型(四步法)
1,初始化:时钟设置、参数设置、IO设置、中断设置(开中断、设NVIC)
2,读函数(可选):从外设读取数据
3,写函数(可选):往外设写入数据
4,中断服务函数(可选):根据中断标志,处理外设各种中断事务

GPIO配置步骤:
1,使能时钟:__HAL_RCC_GPIOx_CLK_ENABLE()
2,初始化GPIO:HAL_GPIO_Init()
3,设置输出状态(可选):控制IO输出高/低电平--HAL_GPIO_WritePin() 、每次调用IO输出电平翻转一次--HAL_GPIO_TogglePin()
4,读取IO电平(可选):HAL_GPIO_ReadPin()

结构体

typedef struct 
{ uint32_t Pin;              /* 引脚号 */ uint32_t Mode;         /* 模式设置 */ uint32_t Pull;            /* 上拉下拉设置 */ uint32_t Speed;       /* 速度设置 */uint32_t Alternate; /* 复用功能 */
} GPIO_InitTypeDef;

中断:打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行
中断的作用:1,实时控制;2,故障处理;3,数据传输
中断的意义:高效处理紧急程序,不会一直占用CPU资源

GPIO外部中断简图:GPIO->AFIO(F1)、SYSCFG(F4/F7/H7)->EXTI->NVIC->CPU

NVIC:嵌套向量中断控制器,属于内核
中断向量表:定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址
中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数
NVIC还有:中断挂起,解挂,激活标志等非常用功能。

 

内部中断
    Reset:复位
    NMI:不可屏蔽中断
    HardFault:硬件失效
    MemManage:存储器管理
    BusFault:预取指失败,存储器访问失败
    UsageFault:未定义的指令或非法状态
    SVCall:通过SWI指令的系统服务调用
    DebugMonitor:调试监控器
    PendSV:可挂起的系统服务
    SysTick:系统滴答定时器
外部中断
    WWDG:连到EXTI的电源电压检测(PVD)中断
    PVD:连到EXTI的电源电压检测(PVD)中断
    TAMPER:侵入检测中断
    RTC:实时时钟(RTC)全局中断
    FLASH:闪存全局中断
    RCC:复位和时钟控制(RCC)中断
    EXTI0:EXTI线0中断
    DMA1通道1:DMA1通道1全局中断
    ADC1_2:ADC1和ADC2的全局中断
    USB_HP_CAN_TX:USB高优先级或CAN发送中断
    CAN_RX1:CAN接收1中断
    EXTI9_5:EXTI线[9:5]中断
    TIM1_BRK:TIM1刹车中断
    I2C1_EV:I2C1事件中断
    SPI1:SPI1全局中断
    USART1:USART1全局中断
    RTCAlarm:连到EXTI的RTC闹钟中断
    USB唤醒:连到EXTI的从USB待机唤醒中断
    FSMC:FSMC全局中断
    SDIO:SDIO全局中断

 

中断优先级:
抢占优先级(pre)>响应优先级(sub)>自然优先级
数值越小,优先级越高

NVIC的使用:
1,设置中断分组(SCB_AIRCR):HAL_NVIC_SetPriorityGrouping
2,设置中断优先级(NVIC_IPRx):HAL_NVIC_SetPriority
3,使能中断(NVIC_ISER):HAL_NVIC_EnableIRQ

EXTI基本概念:
外部(扩展)中断事件控制器,包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1)
中断和事件的理解:
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC
EXTI主要特性:
  F1/F4/F7系列
每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位
  H7系列
由其它外设对 EXTI 产生的事件分为可配置事件和直接事件。
可配置事件:简单概括,基本和F1/F4/F7系列类似
直接事件:固定上升沿触发、不支持软件触发、无挂起状态位(由其它外设提供)

AFIO:复用功能IO,主要用于重映射和外部中断映射配置
配置AFIO寄存器之前要使能AFIO时钟:__HAL_RCC_AFIO_CLK_ENABLE();
1,调试IO配置
2,重映射配置
3,外部中断配置

SYSCFG:系统配置控制器,用于外部中断映射配置等
使能SYSCFG时钟:__HAL_RCC_SYSCFG_CLK_ENABLE(); 
外部中断配置

如何使用中断:
GPIO外部中断:设置输入模式(GPIO)->设置EXTI和IO映射关系(AFIO或SYSCFG)->EXTI->
外设中断:开启外设相关中断(USART/TIM/SPI…)->
设置中断分组、优先级、使能(NVIC)->按优先级顺序,依次处理中断(CPU)

EXTI的配置步骤(外部中断):
1,使能GPIO时钟:__HAL_RCC_GPIOx_CLK_ENABLE
2,设置GPIO输入模式
3,使能AFIO/SYSCFG时钟
4,设置EXTI和IO对应关系
5,设置EXTI屏蔽,上/下沿
6,设置NVIC
  设置中断分组:HAL_NVIC_SetPriorityGrouping,此函数仅需设置一次
  设置中断优先级:HAL_NVIC_SetPriority
  使能中断:HAL_NVIC_EnableIRQ
7,设计中断服务函数:EXTIx_IRQHandler,中断服务函数,清中断标志
步骤2 - 5使用HAL_GPIO_Init一步到位

STM32有:EXTI0~4(5)、EXTI9_5(1)、EXTI15_10(1),7个外部中断服务函数

 

数据通信:
按数据通信方式分类:串行通信、并行通信
按数据传输方向分类:单工通信、半双工通信、全双工通信
    单工通信:数据只能沿一个方向传输
    半双工通信:数据可以沿两个方向传输,但需要分时进行
    全双工通信:数据可以同时进行双向传输
按数据同步方式分类:同步通信、异步通信
    同步通信:共用同一时钟信号
    异步通信:没有时钟信号,通过在数据信号中加入起始位和停止位等一些同步信号

 

1,比特率:每秒钟传送的比特数,单位bit/s
2,波特率:每秒钟传送的码元数,单位Baud
3,比特率 = 波特率 * log2 M ,M表示每个码元承载的信息量
4,二进制系统中,波特率数值上等于比特率
 
串行通信接口:指按位发送和接收的接口。如:RS-232/422/485等
RS-232接口(DB9)
数据:
    TXD(pin 3):串口数据输出
    RXD(pin 2):串口数据输入
握手:
    RTS(pin 7):请求发送
    CTS(pin 8):清除发送
    DSR(pin 6):数据发送就绪
    DCD(pin 1):数据载波检测
    DTR(pin 4):数据终端就绪
地线:GND(pin 5):信号地
其他:RI(pin 9):振铃指示

RS-232电平与COMS/TTL电平对比
1,RS-232电平--逻辑1:-15V ~ -3V;逻辑0:+3V ~ +15V
2,COMS电平(3.3V)--逻辑1:3.3V;逻辑0:0V
3, TTL电平(5V)--逻辑1:5V;逻辑0:0V

RS-232通信示意图:
控制器A<-(TTL/COMS电平)->电平转换芯片<-(RS-232电平)->DB9接口<-(RS-232电平)->DB9接口<-(RS-232电平)->电平转换芯片<-(TTL/COMS电平)->控制器B
电平转换芯片:MAX3232或者SP3232等

串口与电脑USB口通信示意图:
USB接口(安装CH340 USB 虚拟串口驱动)<-(USB电平标准)->Type-c接口<-(USB电平标准)->USB/串口转换电路(CH340C)<-(TTL/COM电平)->STM32开发板(TXD/RXD)

USART简介
USART:通用同步异步收发器
UART:通用异步收发器
USART/UART都可以与外部设备进行全双工异步通信
USART,常用的也是异步通信

USART主要特征:
1,全双工异步通信
2,单线半双工通信
3,单独的发送器和接收器使能位
4,可配置使用DMA的多缓冲器通信
5, 多个带标志的中断源

STM32F1/F4/F7/H7的USART框图:
外部设备->串行数据输入(RXD)->接收移位寄存器->接收数据寄存器(RDR)->
F7/H7:CPU->
F1/F4:数据寄存器(DR)->
发送数据寄存器(TDR)->发送移位寄存器->串行数据输出(TXD)->外部设备

 设置USART/UART波特率(F1):
波特率计算公式:baud=fck /(16∗USARTDIV)
USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
fck 是串口的时钟,如:USART1的时钟是PCLK2,其他串口都是PCLK1
USARTDIV的值写入USART_BRR寄存器

/*波特率为115200为例:115200=72000000/(16∗USARTDIV)->USARTDIV=39.0625*/
uint16_t mantissa; 
uint16_t fraction; 
mantissa=39; 
fraction=0.0625*16+0.5=0x01;          /* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) */
USART1->BRR = (mantissa << 4) + fraction;

寄存器版本例程的写法:USART1->BRR =(fck  +(baud/2))/baud

USART/UART波特率(F4):
波特率计算公式:baud=fck /(8∗(2−OVER8)∗USARTDIV)
USARTDIV=DIV_Mantissa+(DIV_Fraction/8∗(2−OVER8))

USART/UART波特率(F7):
16倍过采样波特率计算公式:baud=fck /USARTDIV
8倍过采样波特率计算公式:baud=(2∗fck )/USARTDIV

USART/UART波特率(H7):
16倍过采样波特率计算公式:baud=(usart_ker_ckpres)/USARTDIV
8倍过采样波特率计算公式:baud=(2∗usart_ker_ckpres)/USARTDIV
usart_ker_ckpres是串口的工作时钟

波特率寄存器(BRR):把USART_CR1寄存器的位15设置为0,即使用16倍过采样。

HAL库外设初始化MSP回调机制:
HAL_PPP_Init()->调用MSP回调函数:HAL_PPP_MspInit()
MSP回调函数作用:配置PPP外设用到的硬件,如:GPIO、NVIC、CLOCK等,用户可选择是否使用并重新定义该函数

HAL库外设初始化MSP回调机制- USART为例:
HAL_UART_Init()->HAL_UART_MspInit()->

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if(huart->Instance == USART1)                /* 如果是串口1,进行串口1 MSP初始化 */{/* (1)使能USART1和对应IO时钟,(2)初始化IO,(3)使能USART1中断,设置优先级 */}
}

HAL库中断回调机制:
HAL_PPP_IRQHandler()->HAL_PPP_xxxCallback()

HAL库中断回调机制 - USART为例(F1):
USARTx_IRQHandler()或者UARTx_IRQHandler()->HAL_USART_IRQHandler()或者HAL_UART_IRQHandler()->调用中断回调函数

UART中断回调函数:
HAL_UART_TxCpltCallback()                      /* 发送完成回调函数 */
HAL_UART_TxHalfCpltCallback()                  /* 半发送完成回调函数 */
HAL_UART_RxCpltCallback()                      /* 接收完成回调函数 */
HAL_UART_RxHalfCpltCallback()                  /* 半接收完成回调函数 */
HAL_UART_ErrorCallback()                       /* UART错误回调函数 */
HAL_UART_AbortCpltCallback()                   /* UART中止回调函数 */
HAL_UART_AbortTransmitCpltCallback()           /* UART发送中止回调函数 */
HAL_UART_AbortReceiveCpltCallback()            /* UART接收中止回调函数 */

USART/UART异步通信配置步骤:
1,配置串口工作参数:HAL_UART_Init()
2,串口底层初始化:HAL_UART_MspInit()    配置GPIO、NVIC、CLOCK等
3,开启串口异步接收中断:HAL_UART_Receive_IT()
4,设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,编写中断服务函数:USARTx_IRQHandler()、 UARTx_IRQHandler()
6,串口数据发送:USART_DR, HAL_UART_Transmit()

USART/UART异步通信相关函数介绍:
1,HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)

关键结构体(F1):
typedef struct 
{    uint32_t BaudRate; 		/* 波特率 */ uint32_t WordLength; 	    /* 字长 */uint32_t StopBits; 		/* 停止位 */ uint32_t Parity; 			/* 奇偶校验位 */ uint32_t Mode; 			/* UART 模式 */ uint32_t HwFlowCtl; 		/* 硬件流设置 */ uint32_t OverSampling; 	/* 过采样设置 */ 
}UART_InitTypeDef

2,HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
作用:以中断的方式接收指定字节的数据
形参 1 是 UART_HandleTypeDef 结构体类型指针变量
形参 2 是指向接收数据缓冲区
形参 3 是要接收的数据大小,以字节为单位

 3,HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
作用:以阻塞的方式发送指定字节的数据
形参 1 :UART_HandleTypeDef 结构体类型指针变量
形参 2:指向要发送的数据地址
形参 3:要发送的数据大小,以字节为单位
形参 4:设置的超时时间,以ms单位 

IO引脚复用:IO端口的输入或输出是由其它非GPIO外设控制,我们称之为复用
通用:IO端口的输入或输出是由GPIO外设控制,我们称之为通用

串口接收数据过程:
HAL_UART_Receive_IT()->以中断的方式接收一个字节数据:uint8_t g_rx_buffer[1]->在接收完成回调函数中处理接收到的数据:HAL_UART_RxCpltCallback()->接收数据引入接收数据状态变量(制定接收协议):uint16_t    g_usart_rx_sta ->bit15,接收到0x0A(换行),接收完成标志;bit14,接收到0x0D(回车);bit13~0,接收到的有效字节数目:uint8_t g_usart_rx_buf[200]

串口发送数据过程:
如果收到数据,获取数据长度:uint16_t g_usart_rx_sta ->等待SR寄存器TC位置1(即等待发送完成):HAL_UART_Transmit()->发送完成,清标志->->

IWDG简介 :独立看门狗
本质:能产生系统复位信号的计数器
特性:递减的计数器;时钟由独立的RC振荡器提供(可在待机和停止模式下运行);看门狗被激活后,当递减计数器计数到0x000时产生复位
喂狗:在计数器计数到0之前,重装载计数器的值,防止复位:IWDG有什么作用
作用:主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题
独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生

IWDG溢出时间计算:
IWDG溢出时间计算公式(HAL库):Tout =(psc∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
  Tout:溢出时间
  f𝐼𝑊𝐷𝐺:时钟源频率
  psc:预分频系数
  rlr:重装载值
寄存器设置分频系数的方法:"psc" =4∗2^prer
  prer是IWDG_PR 的值
IWDG溢出时间计算公式(寄存器):Tout =((4∗2^prer)∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺

IWDG配置步骤:
1,使能IWDG,设置预分频系数和重装载值等(IWDG_PR/RL/KR):HAL_IWDG_Init()

typedef struct 
{ IWDG_TypeDef *Instance; /* IWDG 寄存器基地址 */IWDG_InitTypeDef Init;       /* IWDG 初始化参数 */
}IWDG_HandleTypeDef;


2,把重装载寄存器的值重载到计数器中,喂狗(IWDG_KR):HAL_IWDG_Refresh()

typedef struct
{ uint32_t Prescaler;  /* 预分频系数 */ uint32_t Reload;       /* 重装载值 */ 
} IWDG_InitTypeDef;






 

 

 

 

 

 

 

 

 

->->->->

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桌面软件/exe程序软件自动化大宝剑--lackey之初识

C/S架构端下的软件在IT发展长河中,渐渐的在大多数从业者已经淡忘。现有的PC端上的软件 也是在极力的前浪推后浪,更新替代一些老派的语言追寻潮流。互联网的软件开发就是IOT,HTTPclient ,鲜有 exe的桌面软件;某也喜欢追新潮学互联网技 术,自动化就接触APP WEB API并使用网…

全网最适合入门的面向对象编程教程:40 Python常用复合数据类型-枚举和enum模块的使用

在 Python 中,枚举(Enumeration, Enum)是一种复合数据类型,用于表示一组相关但不同的常量值。枚举类型允许我们使用人类可读的名称代替代码中的魔法数字或字符串,Python 提供了 enum 模块来实现枚举类型。全网最适合入门的面向对象编程教程:40 Python 常用复合数据类型-…

rn node 版本问题

报错信息:Command PhaseScriptExecution failed with a nonzero exit codeFailed to construct transformer: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:79:19)at Object.createHash (node:crypto:139:10)at sta…

替代BeyondCompare,四款免费文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…

替代BeyondCompare,免费四款文件代码对比工具分享

Beyond Compare是一套内容比较工具软件。除了可以作文件比较以外,还可以比对文件目录、FTP目录及压缩包案的内容等,但是由于要收费且比较贵,很多公司也在规避工作电脑使用非授权软件的风险,所以分享四款平替Beyond Compare的文件代码对比软件工具。1、WinMerge WinMerge是一…

markdown格式测试

Editor.md hhh换行TEST 1 2 3 a bq d HEAD TEST Smart Test ...--目录 (Table of Contents) [TOCM] 目录Editor.md换行TESTHEAD TESTSmart TestHeading 1Heading 2Heading 3Heading 4Heading 5Heading 6Heading 1 link Heading linkHeading 2 link Heading linkHeading 3 link …

一图速览9种API接口测试

一图速览9种API接口测试,大家都懂了吗?值得收藏!

Serilog文档翻译系列(一) - 入门指南

保持优质文档是 Serilog 的优先事项。如果你发现文档中有缺失或不准确的内容,或者希望通过添加主题或教程来扩展 wiki,请通过问题追踪系统告知我们。 为什么选择Serilog? 与许多其他 .NET 库一样,Serilog 提供了基本的诊断日志记录功能,支持文件、控制台等多种方式。它易于…

数据分析1

数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律数据分析三剑客:Numpy,Pandas,MatplotlibNumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。一、…

CSS调试 (1)

https://www.bilibili.com/video/BV1KM4y1G7EF/内容转自【浏览器调试工具精讲】Chrome Dev Tools精讲,前端必看! 橙色:外边距 蓝色:本体。 绿色:内边距。CTRL+ F 可以搜索 输入某一个string 或者 css,section#someid xpath: //section/p 编辑样式

多线程四-Lock锁及其原理分析

JUC是什么 可能有些不太关注底层代码,会不太理解juc是啥,比如之前的我,只知道是跟并发相关。juc其实就是并发包路径的缩写,java.util.concurrent.而Lock是其中锁的接口,有比如重入锁,读锁,写锁等一些具体实现。 这部分源码理解起来还是有些难度,暂时先理解其大概思路,…

Dijkstras algorithm All In One

Dijkstras algorithm All In One 迪杰斯特拉算法Dijkstras algorithm All In One迪杰斯特拉算法Dijkstra Dijkstras algorithm (/ˈdaɪkstrəz/ DYKE-strəz) is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for e…