STM32_标准库转hal库

1.串口UART

注:

阻塞:当要发送或接收数据时cpu会一直访问寄存器,看看是否数据发送出去了或接收到了,当数据发送了或接收到了,cpu就会将数据放进寄存器或从寄存器中拿出数据,这样会占用cpu资源

非阻塞:当接收数据后程序会进入中断,告诉cpu数据来了,让cpu将数据从寄存器中拿出,当发送完数据后,程序也会进入中断,cpu会将数据放进寄存器中继续发送,这样会最大限度利用cpu资源,不会让cpu一直访问寄存器,要启用中断回调函数必须在配置串口时配置串口的中断,图中的nvic,当使用非阻塞式接收函数和发送函数带IT的函数,就会进入这个函数,这个函数是所有串口共用的,使用时要判断是那个串口触发的这个函数但是同样有缺点:只能发送和接收规定大小的数据

接受不定长数据 :当串口发送数据发送完,才会进入中断,这个函数的最后一个参数是最大接受数据的长度,这个模式的中断回调函数是另外的,其中与dma配合的函数当传输的数据过设定最大传输数据的长度一半时会自动进行中断函数,但是__HAL_DMA_DISABLE_IT()这个函数可以关闭传输过半中断,

与DMA配和:就全程不需要cpu干扰,数据直接发送或接受

接收:

阻塞式:HAL_UART_Receive( )

非阻塞式HAL_UART_Receive_IT()

与DMA配合:HAL_UART_Receive_DMA()

接受不同大小的数据:HAL_UARTEx_ReceiveToIdle()

HAL_UARTEx_ReceiveToIdle_IT()

HAL_UARTEx_ReceiveToIdle_DMA()

中断回调函数: HAL_UART_RxCpltCallback ()

HAL_UART_TxCpltCallback()

HAL_UARTEx_RxEventCallback ()

发送

阻塞式:HAL_UART_Transmit( )

非阻塞式HAL_UART_Receive_IT()

与DMA配合:HAL_UART_Receive_DMA()

2.ADC

过程

ADC使用整体过程:校准--->开启ADC转换------>读取ADC值

校准:HAL_ADCEx_Calibration_Start()

开启转换模式

规则组普通转换:HAL_ADC_Start()

注入组:HAL_ADCEx_InjectedStart()

规则组转换后进回调函数:HAL_ADC_Start_IT()

注入组:HAL_ADCEx_InjectedStart_IT()

规则组与DMA配合:HAL_ADC_Start_DMA()

注入组:HAL_ADCEx_InjectedStart_DMA()

这个函数有两个参数,ADC句柄,接收数据的地址,这个函数也会触发ADC的回调函数

获取值

规则组:HAL_ADC_GetValue()

注入组:HAL_ADCEx_InjectedGetValue()

回调函数

注入组ADC回调函数:HAL_ADCEx_InjectedConvCpltCallback( )

规则组ADC回调函数 :void HAL_ADC_ConvCpltCallback ()

ADC的回调函数也是一样,全部ADC共用这个函数,所有使用时也要判断一下是那个触发的函数

3.定时器

注:

时钟源:

时钟源选择:定时器的时钟源选择可以从,内部时钟(APB1/APB2),外部时钟模式1,外部时钟模式2,外部时钟可以用来级连定时器,也可以用来测编码器的值

外部时钟模式1 :这个模式时钟源来自该定时器的输入通道的TI1的TI1FP1和TI2的TI2FP2,两个通道,还有一条通道是TI1_ED 从TI1中经过滤波后直接传进从模式控制器这条通道是规定双边沿触发的 ,这三个通道的信号会发送到从模式控制器中,如果要使用外部时钟模式1,要在从模式中配置

外部时钟模式2:当要选择这个模式就要将定时器的时钟源选择,选择成ETR,这样定时器的时钟源就来设定好的引脚,自每个定时器都有规定的ETR引脚,ETR模式只能检测上升沿,要检测下降沿要和极性选择配合,极性选择可以将上升沿和下降沿身份互换 ,ETR这条通道除了可以从外部时钟中配置还可以从从模式中配置

从模式:

从模式的信号源:TI1_ED ,TI1FP1 ,TI2FP2 ,ETR

外部时钟模式1:顾名思义,当从模式选择外部时钟源模式1,此时从模式的信号源会成为定时器的时钟源

复位模式 :当从模式选择复位模式,当有从信号源传来设定电平,就会触发从模式,此时会将计数器归零,并且如果设定有中断或更行事件,也会各自触发一次

门模式 :当从模式选择门模式时,从模式的信号源传设定电平时门就打开 ,定时器的时钟源正常运行定时器正常工作,当传的不是设定电平时门关闭,定时器时钟源无法正常运行,定时器停止工作

触发模式: 当从模式选择触发模式,当检测到信号源传进来的是设定的电平 后定时器开始工作,但是触发模式只能启动定时器不能停止定时器,这个模式经常和定时器的单脉冲模式(One Pulse Mode) 配合,单脉冲模式就是定时器不再循环计数,当计数器计到自动重装器的值后不再计数,计数器归零

输入捕获:

四个通道的关系:TI1,TI2的TI1FP1和TL2FP2信号可以传入外部时钟模式1,进行更多操作

而TI3和TI4没有此功能,这四个通道都可以输出两条信号,TI1和TI2是一对,TI3和TI4是一对,

他们的输出的两条信号的其中一条都可以进入和自己匹配另外一条通道的寄存器中,传入自己寄存器的那条信号叫直接模式,传入另外一条信号的寄存器角间接模式,

作用:当我们要检测一个引脚的高电平持续时间时,因为四条通道的边沿检测不能启用双边沿检测,所有用两条通道来计算,当来高电平时计数器的值会复制到直接模式的寄存器中,来低电平时,本通道的另外一条信号会进入与本通道匹配的通道的寄存器,此时会将计数器的值复制到间接模式的寄存器中,这样间接模式的寄存器的值-直接模式寄存器的值就是高电平持续的时间,间接模式通道的启动函数要是输入捕获中断,这样接收到低电平直接进入中断,进行距离计算

输出比较(PWM)

PWM模式:模式1,模式2(在向上计数的前提下)

模式1:当设置的CCR的值大于计数器的值时,输出高电平,

当设置CCR的值低于计数器的值时,输出低电平

模式2:当设置的CCR的值小于计数器的值时,输出高电平,

当设置CCR的值大于计数器的值时,输出低电平

PWM的频率:1/自动重装器的值

占空比:CCR/自动重装器的值

向下计数相反

一个定时器有四个输出比较通道,也有四个输入捕获通道,其通道都是对应的,用的寄存器也是同一个,所以,如果要同时用输入捕获和输出比较,其通道不能重合,如:通道1用来输出PWM,通道1就不能拿来用输入捕获

编码器:

用定时器计算编码器:单片机已经设置好了,把定时器的TI1FP1和TI2FP2设置成编码器的A相和B相,

除了用单片机自带的编码器,也可以用GPIO中断来计数编码器

编码器计数: 正转 A相上升沿B相高电平 A相下降沿B相低电平

B相上升沿A相低电平 B相下降沿A相高电平

反转 A相上升沿B相低电平 A相下降沿B相高电平

B相上升沿A相高电平 B相下降沿A相低电平

RTC时钟:

简介:

RTC的计数器是32位的,RTC计数器还有一个分频器,他会自动将频率设置成1hz,当把单片机的断电,只要继续给Vbat引脚供电,RTC时钟就会继续走,

RTC时钟来源:低速外部时钟(LSE),低速内部时钟(LSI),高速外部时钟(HSE),虽然RTC有三个时钟源,但只有LSE能在单片机掉电后给RTC提供时钟信号,所以我们通常使用LSE作为RTC时钟信号

RTC还有闹钟功能,把闹钟寄存器设置一个时间,当RTC计数器到时间后,会产生闹钟中断,提醒CPU时间到了

单片机有一片后备区域, Vbat就是专门为单片机突然断电使后备区域能保存重要数据不被丢失而设计的,其中RTC就在其中,Vbata还有入侵检测功能

定时器函数:

开启

普通开启:HAL_TIM_Base_Start(),只开启时基单元只能计时,进不了中断

中断开启:HAL_TIM_Base _Start_IT() 开启后可进中断回调函数

与DMA配合:HAL_TIM_Base_Start_DMA()

输入捕获开启:HAL_TIM_IC_Start (); 开启后开始进行,但不会进入中断

输入捕获中断:HAL_TIM_IC_Start _IT(); 当接收到相应电平后会进入中断回调函数

输入捕获与DAM配合: HAL_TIM_IC_Start _DAM();

PWM:HAL_TIM_PWM_Start()

PWM中断:HAL_TIM_PWM_Start_IT()

PWM配合DAM:HAL_TIM_PWM_Start_DMA ()

编码器: HAL_TIM_Encoder_Start ();

编码器中断:HAL_TIM_Encoder_Start_IT();

编码器与DAM:HAL_TIM_Encoder_Start_DAM ();

关闭

HAL_TIM_Base_Stop()

HAL_TIM_Base_Stop_IT()

HAL_TIM_Base_Stop_DAM

设置参数

计数器:__HALTIM_SET_COUNTER()

自动重传器 :__HAL_TIM_SET_AUTORELOAD ( )

设置CRR:__HAL_TIM_SET_COMPARE ();

设置占空比:__HAL_TIM_COMPARE();

获取标志位:__HAL_TIM_GET_FLAG()

清除标志位:__HAL_TIM_CLEAR_FLAG()

回调函数

更新中断回调函数: HAL_TIM_PeriodElapsedCallback()

输入捕获中断回调函数:HAL_TIM_IC_CaptureCallback()

相关推荐
智者知已应修善业2 小时前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机
嵌入式软硬件攻城狮3 小时前
6.单片机回调函数
单片机·嵌入式硬件
就是蠢啊3 小时前
单片机入门实验——点灯
单片机·嵌入式硬件
@曾记否4 小时前
瑞控FPVF405飞控开发板硬件功能整理
stm32·嵌入式硬件
oshan20124 小时前
小华HC32L136K8TA 单片机LED(三)
单片机·嵌入式硬件
小齐勇闯天涯4 小时前
STM32--PWM原理机制
stm32·单片机·嵌入式硬件
全球通史5 小时前
[特殊字符] RISC-V实战:从0到100+FPS!进迭时空(Spacemit)开发板YOLOv8部署终极指南
嵌入式硬件·yolo·risc-v
brave and determined8 小时前
可编程逻辑器件学习(day22):“让ARM穿上FPGA的马甲“:赛灵思Zynq的命名哲学与技术革命
arm开发·嵌入式硬件·fpga开发·zynq·fpga设计·嵌入式设计·fpga开发流程
余生皆假期-10 小时前
SPWM 与 SVPWM 电压利用率简谈
单片机·嵌入式