3.外设GPIO、中断、串口

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.推挽输出:可以做电流型驱动,驱动电流最大可达 25mA
复用功能模式:
    7.开漏式复用功能:不能输出高电平,必须有外部(或内部),上拉才能输出高电平;由其他外设控制输出
    8.推挽式复用功能:可输出高低电平,驱动能力强;由其他外设控制输出
 
STM32F1最大驱动电流150mA
 
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
有源蜂鸣器:自带了震荡电路,一通电就会发声;蜂鸣器的驱动电流是 30mA 左右
无源蜂鸣器:没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动

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配置步骤:

void led_init(void)
{
    /* 句柄 */
    GPIO_InitTypeDef gpio_init_struct;
    /* 1.使能时钟 */

    /* 2.结构体 */

    /* 3.初始化GPIO */
}

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

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

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

M3 内核都是支持 256 个中断
ISER[8]: ISER 全称是: Interrupt Set Enable Registers,这是一个中断使能寄存器组
ICER[8]:全称是: Interrupt Clear Enable Registers,是一个中断除能寄存器组。
ISPR[8]:全称是: Interrupt Set Pending Registers,是一个中断使能挂起控制寄存器组。
ICPR[8]:全称是: Interrupt Clear Pending Registers,是一个中断解挂控制寄存器组。
IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。
IP[240]:全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。

内部中断
    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作用:管理芯片内外部中断唤醒事件

EXTI主要特性:
  F1/F4/F7系列
每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位
  H7系列
由其它外设对 EXTI 产生的事件分为可配置事件和直接事件。
可配置事件:简单概括,基本和F1/F4/F7系列类似
直接事件:固定上升沿触发、不支持软件触发、无挂起状态位(由其它外设提供)

EXTI和IO映射关系
AFIO:复用功能IO,主要用于重映射和外部中断映射配置
    配置AFIO寄存器之前要使能AFIO时钟:__HAL_RCC_AFIO_CLK_ENABLE();
    1,调试IO配置
    2,重映射配置
    3,外部中断配置:配置EXTI中断线0~15对应到哪个具体的IO
    使能AFIO时钟:__HAL_RCC_AFIO_CLK_ENABLE();
SYSCFG:系统配置控制器,用于外部中断映射配置等
    使能SYSCFG时钟:__HAL_RCC_SYSCFG_CLK_ENABLE();
 
core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中
HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数,一个工程里基本只调用一次,在程序 HAL 库初始化函数里面
HAL_NVIC_SetPriority 是设置中断优先级函数。
HAL_NVIC_EnableIRQ 是中断使能函数
HAL_NVIC_DisableIRQ 是中断除能函数。
HAL_NVIC_SystemReset 是系统复位函数。  

如何使用中断:

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

EXTI的配置步骤(外部中断):
1.使能GPIO时钟:__HAL_RCC_GPIOx_CLK_ENABLE
2.结构体HAL_GPIO_Init
  设置EXTI和IO对应关系
  设置EXTI屏蔽,上/下沿
  设置GPIO输入模式
  使能AFIO/SYSCFG时钟:HAL_GPIO_Init
3.配置中断优先级(NVIC),并使能中断
  设置中断分组:HAL_NVIC_SetPriorityGrouping,此函数仅需设置一次
  设置中断优先级:HAL_NVIC_SetPriority
  使能中断:HAL_NVIC_EnableIRQ
4.设计中断服务函数:EXTIx_IRQHandler,中断服务函数,清中断标志
5.编写中断处理回调函数 :HAL_GPIO_EXTI_Callback

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; 
/* +0.5四舍五入的作用,舍去整数 */
fraction=0.0625*16+0.5=0x01;          /* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) */
USART1->BRR = (mantissa << 4) + fraction;        /* *16和左移4位等价 */

寄存器版本例程的写法: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接收中止回调函数 */

UART异步通信配置步骤:
1,配置串口工作参数:HAL_UART_Init()
2,串口底层初始化:HAL_UART_MspInit()    配置GPIO、NVIC、CLOCK等
3,设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4,开启串口异步接收中断:HAL_UART_Receive_IT()
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()->发送完成,清标志->->

 

 

 

 

 

 

 

 

 

->->->->

 

 

 

 

 

 

posted @ 2024-08-28 01:00  阿Q熊  阅读(270)  评论(0)    收藏  举报