版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目3智能小车运动控制系统设计与实现嵌入式技术及应用可控LED流水灯设计引导案例在嵌入式系统应用中,经常会遇到以下情况:周期性执行某任务,如每隔固定时间完成一次AD采集;延时一定时间执行某个任务,如交通灯信号变化;显示实时时间,如万年历;产生不同频率的波形,如MP3播放器;产生不同脉宽的波形,如驱动伺服电机;测量脉冲的个数,如测量转速;测量脉冲的宽度,如测量频率;以上情况,可以归纳为两种情况:一种是定时(即对内部脉冲的计数操作),完成与时间相关的任务(如以上前5种情况);另一种是计数(即对外部输入的计数操作),完成脉冲个数、宽度和频率的测量等(如以上后2种情况)。定时器是非常重要的组件,用于实现各种与时间相关的功能。以下是一些定时器的常见应用场景。01任务调度02定时中断03计时和延时04脉冲宽度调制可以用来按照设定的时间间隔执行特定的任务。可以设置一个特定的时间间隔,在到达预定时间时触发一个中断信号用于计时操作。如测量某个操作的执行时间;还可以用于实现精确的延时操作。PWM信号广泛应用于电机控制、LED亮度调节、音频信号发生器等领域性。05计数器用于计算某个事件的频率或者脉冲数量。定时器本项目以“智能小车运动控制系统的设计与实现”为例,学习STM32F4系列微控制器的定时器应用开发。任务3.1智能小车循迹状态获取的应用开发任务描述:要求设计一个应用程序,以实现周期性地获取智能小车循迹的状态。任务要求使用反射式红外光电传感器电路板作为智能小车的循迹模块,实现智能小车的巡线前进功能。测试场地路面有黑白两色,其中黑色路面为跑道,宽30mm,智能小车可循此跑道前进。智能小车所用红外光电管、循迹模组及整车如图3-1所示。任务分析03如果要求智能小车以一定的速度沿着黑色跑道前进,则微控制器需要以较短的周期频繁地获取循迹板上8路二进制数字信号,进而才能通过及时判断车身状态以调整电机的转向。智能小车的此要求可通过定时器的基本定时功能来实现,因此本任务涉及的知识点如下。(1)STM32F4系列微控制器定时器的基本功能特性。(2)STM32F4系列微控制器定时器的基本定时功能的编程配置方法。3.1.2 定时器概述7知识链接041 基本概念8--
南昌大学“卓越”辅导员培养工程建设Timer基本概念时钟定时器和计数器的区别定时器是对周期固定的脉冲信号进行计数,如MCU内部的外设时钟(APB)。计数器是对周期不确定的脉冲信号进行计数,如MCU的I/O引脚所引入的外部脉冲信号。结论:定时器和计数器本质上都是计数器,定时器是计数器的一种特例。周期固定或者不固定9南昌大学“卓越”辅导员培养工程建设Timer滴水实例定时器和计数器的区别假如有一个水容器1000滴水刚好装满问:如果每秒滴入1滴水,还需多长时间才能将其装满?计数的概念计数初值定时的概念计数终值答:还需滴入500滴水才能将其装满,第501滴水时容器溢出。答:还需500秒时间才能将其装满,第501秒时容器溢出。问:还需滴入多少滴水才能将其装满?初始值已经装入500滴水10--
南昌大学“卓越”辅导员培养工程建设定时器(容器容量)的计数范围16位定时器的最大计数值为65535位宽计数值处理关注问题定时器初值(容器初始已有水滴数)的设置定时器终值(容器溢出时的水滴数)的设置定时器(容器)溢出以后的需要完成的操作关注问题Timer定时器使用所关注的三个问题11两个概念Timer时钟频率计数时间在定时器模式下,计数单元记一次数所花费的时间,它是时钟频率的倒数定时器模式的两个概念在定时器模式下,送入定时器的周期性时钟信号的频率定时时间
=
计数值
*
计数时间定时时间
=
计数值
/
时钟频率定时时间计算公式以STM32F407微控制器为例,送入定时器的时钟频率为168M假设计数单元在1s内计数1680000次,则计数时间为1us122 STM32微控制器的定时器概述13--
南昌大学“卓越”辅导员培养工程建设Timer分类STM32定时器家族外设定时器常规定时器高级定时器通用定时器基本定时器专用定时器看门狗定时器实时时钟低功耗定时器内核定时器系统节拍定时器STM32定时器家族按照定时器的位置按照定时器的功能14--
南昌大学“卓越”辅导员培养工程建设Timer几乎没有任何输入/输出通道,常用作时基,实现基本的定时/计数功能除具备通用定时器的功能外,还具备带死区控制的互补信号输出、紧急刹车关断输入等功能,可用于电机控制和数字电源设计基本定时器通用定时器高级定时器常规定时器常规定时器分类具有多路独立的捕获比较通道,可以完成定时计数,输入捕获,输出比较等功能。15--
南昌大学“卓越”辅导员培养工程建设Timer2
个
16
位
高级定时器2
个
32
位
通用定时器8
个
16
位
通用定时器应用:数字频率计智能家用电器定时控制设备电机驱动STM32F40716定时器应用--
南昌大学“卓越”辅导员培养工程建设Timer详细特性STM32F407定时器的详细特性17定时器类型Timer计数器分辨率计数器类型预分频系数DMA请求生成捕获比较通道互补输出通道最大接口时钟最大定时器时钟(MHz)高级TIM1TIM816位递增、递减、增/减1~65536有4有84(APB2)168通用TIM2TIM532位递增、递减、增/减1~65536有4无42(APB1)84TIM3TIM416位递增、递减、增/减1~65536有4无42(APB1)84TIM916位递增1~65536无2无84(APB2)168TIM10TIM1116位递增1~65536无1无84(APB2)168TIM1216位递增1~65536无2无42(APB1)84TIM13TIM1416位递增1~65536无1无42(APB1)84基本TIM6TIM716位递增1~65536有0无42(APB1)84Timer时钟频率定时器的时钟频率TIM2/3/4/5/6/7/12/13/14TIM1/8/9/10/11注意:TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84MHz;APB2总线时钟为2分频即84M,TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168MHz。--HCLK:高速总线时钟,提供给存储器、DMA和Cortex内核外设总线时钟APB1外设总线时钟APB218Timer主要功能定时计数输出比较输入捕获计数内部时钟,即定时器模式计数外部脉冲,即计数器模式捕获时保存定时器的当前计数值捕获时,可选择触发捕获中断触发捕获的信号边沿类型可选择(上升沿,下降沿,双边沿)--
南昌大学“卓越”辅导员培养工程建设定时器PWM输出电平翻转单脉冲输出强制输出193.1.2 HAL库外设模块设计方法20Timer简单外设设计GPIO外设使用引脚初始化数据类型GPIO_InitTypeDef来描述GPIO引脚的属性:引脚编号、工作模式、输出速度等简单外设定时/计数功能输出比较功能输入捕获功能复杂外设定时器外设具有三类功能:每一类功能都需要单独的初始化数据类型简单外设的设计方法21--
南昌大学“卓越”辅导员培养工程建设复杂外设设计设计了统一的外设句柄数据类型PPP_HandleTypeDef(PPP代表外设名称)句柄设计编程模型通用接口函数复杂外设设计了轮询、中断和DMA三种编程模型设计四类通用的接口函数Timer三种基本设计方法22--
南昌大学“卓越”辅导员培养工程建设外设句柄Timer外设句柄数据类型的组成12345Handle
structureInstance(外设实例)Initialization(初始化配置参数)Status(外设状态)DMA通道句柄I/O
Buffer(I/O缓冲区)TIM1TIM2orErroror …时间基准功能Ready or BusyI/Obufferon
addressLinkedtoDMA
channel捕获/比较通道or可选模块,串口和A/D转换器包含该模块,而定时器没有包含231.typedef
struct
2.
{*hdma[7];Lock;
TIM_TypeDef*Instance;TIM_Base_InitTypeDef Init;HAL_TIM_ActiveChannel
Channel;DMA_HandleTypeDefHAL_LockTypeDef7.IO
HAL_TIM_StateTypeDef State;//
定时器寄存器的基地址定义//
时基功能的配置参数定义//捕获/比较通道的定义//
DMA通道句柄定义//
保护锁类型定义//定时器运行状态定义9.}
TIM_HandleTypeDef;定时器句柄Timer定时器句柄结构的组成定时器实例,如TIM1和TIM2等24--
南昌大学“卓越”辅导员培养工程建设定时器句柄Timer定时器句柄结构的组成1.typedef
struct
2.
{*Instance;*hdma[7];Lock;TIM_TypeDefTIM_Base_InitTypeDef Init;HAL_TIM_ActiveChannel
Channel;DMA_HandleTypeDefHAL_LockTypeDef7.IO
HAL_TIM_StateTypeDef State;//
定时器寄存器的基地址定义//
时基功能的配置参数定义//捕获/比较通道的定义//
DMA通道句柄定义//
保护锁类型定义//定时器运行状态定义9.}
TIM_HandleTypeDef;定时器的初始化配置参数251.typedef
struct
2.
{*Instance;Init;TIM_TypeDefTIM_Base_InitTypeDefHAL_TIM_ActiveChannel
Channel;DMA_HandleTypeDef *hdma[7];HAL_LockTypeDef Lock;IO
HAL_TIM_StateTypeDef State;//
定时器寄存器的基地址定义//
时基功能的配置参数定义//捕获/比较通道的定义//
DMA通道句柄定义//
保护锁类型定义//定时器运行状态定义9.}
TIM_HandleTypeDef;定时器句柄Timer定时器句柄结构的组成DMA通道句柄261.typedef
struct
2.
{*Instance;Init;//
定时器寄存器的基地址定义//
时基功能的配置参数定义// /TIM_TypeDefTIM_Base_InitTypeDefHAL_TIM_ActiveChannel
Channel;DMA_HandleTypeDef *hdma[7];HAL_LockTypeDef Lock;IO
HAL_TIM_StateTypeDef State;9.}
TIM_HandleTypeDef;定时器句柄Timer定时器句柄结构的组成外设状态保护锁是HAL库提供的一种安全机制,以避免对外设的并发访问27--
南昌大学“卓越”辅导员培养工程建设外设编程模型Timer三种外设编程模型轮询方式中断方式DMA方式编程模型HAL_TIM_Base_Start_IT(TIM_HandleTypeDef*htim);HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef
*htim);HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef*htim,uint32_t*pData,uint16_t
Length);特点1:以后缀区分编程模型特点2:入口参数均为外设句柄的指针HAL_TIM_Base_Start(TIM_HandleTypeDef*htim);HAL_TIM_Base_Stop(TIM_HandleTypeDef*htim);28--
南昌大学“卓越”辅导员培养工程建设通用接口函数Timer根据用户配置参数完成外设的初始化操作与外设进行数据交互,包括轮询、中断和DMA三种编程模型动态配置外设参数用于获取外设的运行状态以及出错信息四种类型的通用接口函数初始化函数I/O操作函数控制函数状态函数29--
南昌大学“卓越”辅导员培养工程建设扩展接口函数Timer① 兼顾STM32各产品系列的特有功能和扩展性能② 兼顾同一个产品系列中不同芯片的特有功能设计目的扩展接口函数的设计单独定义后续为ex的文件stm32fxxx_hal_ppp_ex.cstm32fxxx_hal_ppp_ex.h设计方法stm32f4xx_hal_tim.cstm32f4xx_hal_tim_ex.c303.1.3 定时器的定时/计数功能3132通用定时器框图F4中文参考手册Page3941时钟源控制器时基单元234输入捕获输出比较51 时基单元33--
南昌大学“卓越”辅导员培养工程建设Timer时钟源内部时钟CK_INT外部输入引脚CHx外部触发输入ETR内部触发信号ITRx时钟源选择时基单元的预分频时钟CK_PSC外部时钟模式1:捕获/比较通道CH1/CH2外部时钟模式2:外部触发引脚ETR内部触发输入:使用一个定时器作为另一个定时器的预分频器内部时钟:来自外设总线APB提供的时钟CK_INT(定时器时钟TIM_CLK)定时模式34计数模式计数模式从模式--
南昌大学“卓越”辅导员培养工程建设时基单元Timer预分频计数器预分频寄存器核心计数器计数器寄存器预分频时钟CK_PSC自动重载寄存器自动重载模块时基单元功能框架35计数模块预分频模块计数时钟CK_CNT工作在定时模式时:内部时钟CK_INT定时器时钟TIM_CLK--
南昌大学“卓越”辅导员培养工程建设Timer预分频模块预分频计数器预分频寄存器对预分频时钟CK_PSC进行分频TIMx_PSC:设置预分频系数PSCTIM_CLK为100MHz,16位定时器的最大定时时间为0.65ms,经过预分频以后,可以降低计数时钟CK_CNT的频率作用1:扩大定时器的定时范围作用2:获取精确的计数时钟TIM_CLK为72MHz,可以通过设置预72分频寄存器,使计数时钟CK_CNT变为1MHz,从而获得精确的计数时钟预分频模块x表示定时器的编号如TIM1或TIM236--
南昌大学“卓越”辅导员培养工程建设Timer工作原理定时器启动后,预分频计数器的初值为0,预分频时钟CK_PSC每来一个时钟,预分频计数器的值就加1。当计数值等于预分频寄存器所设定的预分频系数PSC时,预分频计数器的值将清零,开始下一轮计数。预分频模块预分频模块工作原理37Timer预分频模块预分频时序图38分频公式从0计数到PSC实际计数值为PSC+13假设预分频系数PSC=3计数时钟预分频时钟预分频系数CK_CNT=CK_PSC/(PSC+1
)--
南昌大学“卓越”辅导员培养工程建设Timer计数模块核心计数器计数器寄存器对计数时钟CK_CNT进行二次计数TIMx_CNT:存放核心计数器运行时的当前计数值计数模块39--
南昌大学“卓越”辅导员培养工程建设Timer自动重载模块递增计数模式递减计数模式TIMx_ARR的值作为核心计数器的计数终值TIMx_ARR的值作为核心计数器的计数初值自动重载模块由自动重载寄存器TIMx_ARR组成自动重载模块40--
南昌大学“卓越”辅导员培养工程建设Timer计数模式0→
ARR-1ARR→
10→
ARRARR→
0定时器的三种计数模式41上溢下溢下溢上溢--
南昌大学“卓越”辅导员培养工程建设Timer计数模式42计数模式计数器溢出值计数器重载值递增计数CNT=
ARRCNT=
0递减计数CNT=
0CNT=
ARR中心对齐计数CNT=
ARR-1CNT=
ARRCNT=
1CNT=
0溢出值CNT与自动重载值ARR的关系列表从0计数到ARR实际计数值为ARR+1上溢事件定时器时序图43更新中断/定时中断PSC=
1对CK_PSC两分频PSC=1,ARR=
36递增计数,CNT
=
0--
南昌大学“卓越”辅导员培养工程建设Timer定时时间公式𝐀𝐑𝐑
+
𝟏 ∗ 𝐏𝐒𝐂+
𝟏𝐓𝐈𝐌_𝐂𝐋𝐊(𝐇𝐳)T
(s)
=定时时间
=
计数值
*
计数时间定时时间
=
计数值
/
时钟频率计数值
=
ARR
+1时钟频率=TIM_CLK/(PSC+1
)计数时钟CK_CNT定时器时钟,等于预分频时钟CK_PSC自动重载值预分频系数定时器时钟定时器的定时时间公式44--
南昌大学“卓越”辅导员培养工程建设Timer相关寄存器TIMx_PSC:设置预分频系数,将预分频时钟(CK_PSC)进行1~65536之间的任意值分频,得到计数时钟(CK_CNT)预分频寄存器TIMx_CNT
:存放核心计数器运行时的当前计数值,便于用户实时掌握核心计数器的当前计数值计数器寄存器TIMx_ARR:为计数器设置计数边界或重载值。比如计数器递增计数时,记到多少发生溢出;递减计数时,从多少开始往下计数自动重载寄存器寄存器PSCCNTARR452 外部脉冲计数46--
南昌大学“卓越”辅导员培养工程建设Timer时钟源内部时钟CK_INT外部输入引脚CHx外部触发输入ETR内部触发信号ITRx时钟源选择时基单元的预分频时钟CK_PSC外部时钟模式1:对来自捕获/比较通道CH1/CH2的外部脉冲信号进行计数外部时钟模式2:对来自外部触发引脚ETR的外部脉冲信号进行计数时基单元的四种时钟源47计数模式计数模式--
南昌大学“卓越”辅导员培养工程建设Timer内部结构1边沿选择2分频3滤波送入时基单元的预分频时钟注意:外部脉冲信号的分频和滤波并不是必需的,可以根据它的频率高低及信号干净程度来决定外部触发引脚ETR的内部结构48--
南昌大学“卓越”辅导员培养工程建设TimerETR引脚定时器的ETR引脚对应GPIO引脚TIM1_ETRPA12TIM2_ETRPA0/PA5/PA15TIM3_ETRPD2STM32F411芯片的ETR引脚49查询芯片的数据手册Datasheet3
定时/计数功能的数据类型和接口函数50时基单元Timer时基单元初始化类型51结构体类型,包括6个成员变量Period的值不能设置为0,否则定时器将不会启动信号滤波Timer宏常量定义含义TIM_CLOCKDIVISION_DIV1对定时器时钟TIM_CLK进行1分频TIM_CLOCKDIVISION_DIV2对定时器时钟TIM_CLK进行2分频TIM_CLOCKDIVISION_DIV4对定时器时钟TIM_CLK进行4分频成员变量ClockDivision的取值范围52主要用于输入信号的滤波,一般使用默认值:1分频计数模式Timer成员变量CounterMode的取值范围53宏常量定义含义TIM_COUNTERMODE_UP递增计数模式TIM_COUNTERMODE_DOWN递减计数模式TIM_COUNTERMODE_CENTERALIGNED1中心对齐计数模式1TIM_COUNTERMODE_CENTERALIGNED2中心对齐计数模式2TIM_COUNTERMODE_CENTERALIGNED3中心对齐计数模式3三种中心对齐计数模式的区别主要是输出比较中断标志位的设置方式预装载功能Timer宏常量定义含义TIM_AUTORELOAD_PRELOAD_DISABLE预装载功能关闭TIM_AUTORELOAD_PRELOAD_ENABLE预装载功能开启成员变量AutoReloadPreload的取值范围54用于设置自动重载寄存器TIMx_ARR的预装载功能,即自动重装寄存器的内容是更新事件产生时写入有效,还是立即写入有效;预装载功能在多个定时器同时输出信号时比较有用,可以确保多个定时器的输出信号在同一个时刻变化,实现同步输出;单个定时器输出时,一般不开启预装载功能。--
南昌大学“卓越”辅导员培养工程建设时基初始化551 时基单元初始化函数:HAL_TIM_Base_InitTimer接口函数:HAL_TIM_Base_Init函数原型HAL_StatusTypeDefHAL_TIM_Base_Init(TIM_HandleTypeDef*htim
)功能描述按照定时器句柄中指定的参数初始化定时器时基单元入口参数htim:定时器句柄的地址返回值HAL状态值注意事项该函数将调用MCU底层初始化函数HAL_TIM_Base_MspInit完成引脚、时钟和中断的设置该函数由CubeMX自动生成--
南昌大学“卓越”辅导员培养工程建设轮询模式启动562 轮询模式启动函数:HAL_TIM_Base_StartTimer接口函数:HAL_TIM_Base_Start函数原型HAL_StatusTypeDefHAL_TIM_Base_Start(TIM_HandleTypeDef
*htim)功能描述在轮询方式下启动定时器运行入口参数htim:定时器句柄的地址返回值HAL状态值注意事项该函数在定时器初始化完成之后调用函数需要由用户调用,用于轮询方式下启动定时器运行--
南昌大学“卓越”辅导员培养工程建设中断模式启动573 中断模式启动函数:HAL_TIM_Base_Start_ITTimer接口函数:HAL_TIM_Base_Start_IT函数原型HAL_StatusTypeDefHAL_TIM_Base_Start_IT(TIM_HandleTypeDef
*htim)功能描述使能定时器的更新中断,并启动定时器运行入口参数htim:定时器句柄的地址返回值HAL状态值注意事项该函数在定时器初始化完成之后调用函数需要由用户调用,用于使能定时器的更新中断,并启动定时器运行启动前需要调用宏函数
HAL_TIM_CLEAR_IT来清除更新中断标志--
南昌大学“卓越”辅导员培养工程建设通用处理函数584 定时器中断通用处理函数HAL_TIM_IRQHandlerTimer接口函数:HAL_TIM_IRQHandler函数原型voidHAL_TIM_IRQHandler(TIM_HandleTypeDef
*htim);功能描述作为所有定时器中断发生后的通用处理函数入口参数htim:定时器句柄的地址返回值无注意事项函数内部先判断中断类型,并清除对应的中断标志,最后调用回调函数完成中断处理该函数由CubeMX自动生成5 定时器更新中断回调函数HAL_TIM_PeriodElapsedCallback59接口函数:HAL_TIM_PeriodElapsedCallback函数原型voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef
*htim)功能描述回调函数,用于处理所有定时器的更新中断,用户在该函数内编写实际的任务处理程序入口参数htim:定时器句柄的地址返回值无注意事项该函数由定时器中断通用处理函数HAL_TIM_IRQHandler调用,完成所有定时器的更新中断的任务处理函数内部需要根据定时器句柄的实例来判断是哪一个定时器产生的本次更新中断函数由用户根据具体的处理任务编写--
南昌大学“卓越”辅导员培养工程建设计数值读取6 计数值读取函数
HAL_TIM_GET_COUNTER60Timer#define)
(( HANDLE )->Instance->CNT)带参数的宏HAL_TIM_GET_COUNTER( HANDLE定时器句柄的地址该函数通过直接访问计数器寄存器TIMx_CNT来获取计数器的当前计数值辅导员培养工程建设--
南昌大学“卓越”中断标志清除7 定时器中断标志清除函数
HAL_TIM_CLEAR_IT61Timer#define
__HAL_TIM_CLEAR_IT( HANDLE__,INTERRUPT )带参数的宏宏常量定义含义TIM_IT_UPDATE更新中断标志TIM_IT_CC1通道1的捕获/比较中断标志TIM_IT_CC2通道2的捕获/比较中断标志TIM_IT_CC3通道3的捕获/比较中断标志TIM_IT_CC4通道4的捕获/比较中断标志定时器句柄的地址定时器中断标志(( HANDLE )->Instance->SR
=
~( INTERRUPT ))常用中断标志3.1.3 任务:智能小车运动控制系统设计与实现62基础任务01任务目标掌握CubeMX软件配置定时器实现基本定时的方法02任务内容为了让小车能够正常地在黑色跑道上行驶,需要设置定时器每1ms产生一次中断,在中断服务程序中读取光电对管的状态,然后调整小车姿态,不让小车跑偏。在仿真实验中,用PF9驱动LED灯翻转,同时用示波器观察PF9的波形,若设计正确,PF9的频率应该为500Hz。Timer智能小车运动控制系统设计与实现63任务分析Timer定时时间计算公式ARR
+
𝟏 ∗ PSC +
𝟏𝐓𝐈𝐌_𝐂𝐋𝐊(𝐇𝐳)T
(s)
=分析:1.本任务使用定时器9,挂接在APB2总线,时钟频率为168MHz;2.任务要求的定时时间为1ms,由于TIM_CLK为168MHz,可以假设PSC为(168-1),根据公式计算可得ARR的值也为(1000-1)。注意:PSC和ARR参数的选取,以不超过它们的计数范围为准。TIMx_PSC为16位寄存器,最大预分频系数为65536。TIMx_ARR寄存器的位数由定时器位数决定:16位定时器,ARR的最大值为65535;32位定时器,ARR的最大值为4294967295。64引脚分配65步骤二:引脚分配Timer在引脚分配图中选择PF9(LED)为OutputPushPull(推挽输出)、Nopull_upnopull_down(不上拉、不下拉)、Medium(翻转速度中),PF7~PF0(连接8对光电管)为inputmode(输入模式)、Pullup(默认上拉)。定时器9的配置66预分频系数PSC自动重载值ARR123其余参数使用默认配置:计数模式为递增计数内部时钟不分频不使能自动重载功能勾选4使能定时器9的中断中断优先级使用默认值中断使能Timer定时器9的配置67------------主程序代码68步骤六:程序编写添加用户初始代码定时器更新中断回调函数使用句柄的实例来判断发生更新中断的定时器PF9用于波形观察,测试用读取8只光电对管的状态定时中断流程70定时器9递增计数,从0开始记到自动重载值ARR时,产生计数器上溢事件,触发更新中断在启动文件中根据中断类型号找到对应的中断服务程序TIM1_BRK_TIM9_IRQHandler在中断服务程序中再调用定时器通用处理函数HAL_TIM_IRQHandler在函数内部先判断中断类型,并清除对应的中断标志,然后调用更新中断回调函数HAL_TIM_PeriodElapsedCallback完成具体的任务处理Timer定时器初始化函数71本任务为基本定时功能,只进行了时基单元的初始化,初始化参数根据用户在CubeMX中的设置决定由CubeMX自动生成运行测试72Timer将程序编译链接,生成可执行代码,通过ST-Link仿真器下载到STM32F407ZET6核心板,连接示波器探头到PF9,观察波形为方波,频率为500Hz,符合题目要求,验证结果如图所示。图3-6TIM9产生1ms中断的实验结果后续任务Timer73请分别设置10ms、50ms、100ms定时中断,看小车能否正常行驶。请参照之前的任务,在嵌入式虚拟仿真平台绘制好电路,上传你编制的代码,仿真运行,如图3-7所示,能否看到PF9连接的LED灯闪烁。图3-7TIM9产生1ms中断的虚拟仿真平台验证74拓展任务Timer可以设置定时器TIM9每1s中断一次,在中断回调函数中,处理小时、分钟、秒的进位关系,通过串口输出“[时]-[分]-[秒]”。TIM9的PSC可设为(16800-1),ARR设为(10000-1),即可每1s中断一次。定时器中断回调函数中输出时间。请参照3.1.3,重新创建一个任务,按照设计思路,配置好定时器TIM9、USART1,生成基础工程,这里给出主函数main.c的参考代码,加粗显示的代码需要读者手动添加,串口重定向不再赘述。程序清单3-2:请在3.1.3的基础上修改定时器配置,增加串口输出,制作一个电子时钟,通过串口输出。设计思路:程序清单3-2:程序清单/*Privatetypedef*//*USERCODEBEGINPTD*/typedef
struct{ uint8_thour; uint8_tminute; uint8_tsecond;}CLOCK_TypeDef;/*USERCODEENDPTD*//*USERCODEBEGINPV*//*definestructuralvariable*/CLOCK_TypeDefclock={23,59,50};/*USERCODEENDPV*//*Privatefunctionprototypes*/voidSystemClock_Config(void);/*USERCODEBEGINPFP*/intmain(void){HAL_Init();
SystemClock_Config();MX_GPIO_Init();MX_TIM9_Init();MX_USART1_UART_Init();75
/*USERCODEBEGIN2*/__HAL_TIM_CLEAR_IT(&htim9,TIM_IT_UPDATE);HAL_TIM_Base_Start_IT(&htim9);
/*USERCODEEND2*/
/*USERCODEBEGINWHILE*/
while(1){
/*USERCODEENDWHILE*/
/*USERCODEBEGIN3*/}
/*USERCODEEND3*/}Timer/*USERCODEBEGIN4*/voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){
if(htim->Instance==TIM9) { clock.second++;
if(clock.second==60) { clock.second=0; clock.minute++;
if(clock.minute==60) { clock.minute=0; clock.hour++;
if(clock.hour==24) clock.hour=0; } }printf("CurrentTimer:%2d-%2d-%2d\r\n",clock.hour,clock.minute,clock.second); }}/*USERCODEEND4*/76程序清单3-2:运行测试77Timer实验结果如图3-8所示。图3-8简易时钟实验结果小结78Timer本节结束--
南昌大学“卓越”辅导员培养工程建设79任务3.2智能小车电池电量检测模块的应用开发任务描述:要求设计一个可对小车电池电压进行监测的应用程序,电路如图3-10所示。在图3-10中,供电电池的电压为待测电压Vx,通过“PIN”端接入。电池电压经过分压后,通过“VM_ADC”与微控制器的PA6引脚相连,作为ADC采集输入。要求每隔1s对电池电压进行采集,采集到的电压值通过串行通信的方式发送至上位机显示。图3-10实验电路任务分析03使用STM32微控制器检测小车电池电量,主要是通过读取电池电压来实现。具体的任务分析如下。(1)采集电池电压:设计电路将电池正极与ADC引脚相连接,使用ADC模块对电压进行采样和转换,得到数字电压值。(2)数字电压转换为实际电压值:根据ADC输入范围和分辨率,以及参考电压值,将得到的数字电压值转换为实际电压值。(3)电压阈值判断:设置合适的电压阈值,判断电池的当前电量状态。可以根据需求设计不同的阈值,如低电量、中等电量和充足电量。(4)提供可视化显示:通过LCD屏幕或其他合适的显示工具,将电池电量信息以易于理解的方式显示出来,方便用户查看。(5)报警功能(可选):当电池电量低于设定的阈值时,可以触发报警功能,提醒用户及时充电或更换电池。(6)电池管理功能(可选):可以增加电池管理功能,如记录历史电量数据、电池寿命预测等。(7)故障处理:处理可能出现的异常情况,如ADC采样异常、电压传感器故障等,并进行相应的告警或错误处理。任务3.2智能小车电池电量检测模块的应用开发任务描述:要求设计一个可对小车电池电压进行监测的应用程序,电路如图3-10所示。在图3-10中,供电电池的电压为待测电压Vx,通过“PIN”端接入。电池电压经过分压后,通过“VM_ADC”与微控制器的PA6引脚相连,作为ADC采集输入。要求每隔1s对电池电压进行采集,采集到的电压值通过串行通信的方式发送至上位机显示。本任务设计的必备知识点如下。ADC(模数转换器)的基本知识。STM32F407的ADC相关知识。
定时采样(触发)A/D转换。3.2.1ADC基础理论知识3.2.1ADC基础理论知识A/D转换过程A/D转换的主要技术参数知识链接04本节知识与能力要求理解和掌握ADC的转换过程、主要技术参数;理解STM32的ADC内部结构;掌握基于HAL库的ADC开发。第10章ADCADC基础理论知识STM32的ADC模块ADC模块的HAL库接口函数及应用123采样保持量化编码对模拟信号周期性地抽取样值,要求满足抽样定理,即fS≥2fImax转换过程中抽样信号不变保持用有限个电平来表示样值脉冲的过程将量化后的信号转换成二进制代码采样保持电路A/D转换器ADC(AnalogtoDigitalConverter)即模数转换器,用来将模拟信号转换为数字信号。1A/D转换过程ADC(AnalogtoDigitalConverter)即模数转换器,用来将模拟信号转换为数字信号。A/D转换过程1A/D转换过程A/D转换器对输入模拟量微小变化的分辨能力,通常用二进制数的有效位表示。2A/D转换的主要技术参数技术参数转换精度用分辨率和转换误差转换速度转换时间或转换速率分辨率在最大输入电压一定时,位数越多,量化单位越小,分辨率越高。下表以输入10v电压为例说明:位数级数分辨率(精度)说明828=25639.1mV8位、12位ADC常用于工控领域、语音处理领域10210=10249.77mV12212=40962.44mV14214=163840.61mV16216=655360.15mV16位或更高的ADC常用于医学领域中微弱生理信号的采集
转换时间是指从转换控制信号到来到A/D转换器输出端得到稳定的数字量所需要的时间。转换时间的倒数即为转换速率。2A/D转换的主要技术参数转换时间/转换速率转换时间与A/D转换器类型有关:双积分型A/D转换器的转换时间一般在几十毫秒数量级,属于低速A/D转换器;逐次比较型在几十微秒,属于中速A/D转换器;并行比较型一般在几十纳秒。由于A/D转换器的有限分辨率而引起的误差,反映A/D转换器实际输出数字量和理想输出之间的差异。转换误差通常为1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。2A/D转换的主要技术参数量程精度量程指ADC所能转换的模拟输入电压的范围,分为单极性和双极性两种类型。单极性的量程为0~3.3V、0~5V等;双极性的量程为-5~+5V等。精度是指对于ADC的数字输出(二进制代码),其实际模拟输入值与理论上要求的模拟输入值之差。需要注意的是,精度和分辨率是两个不同的概念,不要把两者混淆。通俗地说,“精度”是用来表述物理量的准确程度的,而“分辨率”是用来描述刻度大小的。做一个简单的比喻,一把量程是10cm的尺子,上面有100个刻度,最小能读出1mm的有效值,那么我们就说这把尺子的分辨率是1mm或者量程的1%;而它的实际精度就不得而知了(不一定是1mm)。而对于一个ADC而言,即使它的分辨率很高,也可能由于温度漂移、线性度等原因,导致其精度不高。影响ADC精度的因素除了量化误差,还有非线性误差、零点漂移和增益误差等。ADC实际输出与理论上输出之差是这些误差共同相加的结果。2STM32的ADC集成有三个12位ADC逐次逼近型的A/D转换器多达18个通道,可实现16个外部模拟输入通道和2个内部信号源的A/D转换各通道的A/D转换可采用单次、连续、扫描或间断模式执行转换结果是一个12位的二进制数,可以以左对齐或右对齐两种方式存储在16位数据寄存器中2STM32的ADCADCADC引脚模拟多路开关ADC时钟注入或规则通道中断2STM32的ADC信号输入输入信号经ADC的输入通道ADCx_IN0~ADCx_IN15送入模拟至数字转换器功能模块。触发信号软件触发或EXTI外部触发或定时器触发。将硬件触发源分为两类:规则通道和注入通道。A/D转换在ADC时钟ADCCLK的驱动下,对输入通道的信号进行A/D转换,即完成采样—量化—编码等工作。数据保存A/D转换结束后,将转换结果的12位数据以左对齐或右对齐的方式保存到16位的寄存器中。STM32的ADC模块3ADC中断和DMA请求2ADC通道选择1ADC的引脚4ADC转换时间5ADC数据对齐6ADC的转换模式7ADC校准ADC的引脚ADCx_IN0~ADCx_IN15为ADC的输入信号通道,即为ADC的输入GPIO引脚,ADC的GPIO引脚均为复用功能,使用时需配置为模拟输入模式。ADC1还有两个内部通道:温度传感器通道和VREFINT。STM32F407ZGT6ADCIO分配ADC1I/OADC2I/OADC3I/O通道0PA0通道0PA0通道0PA0通道1PA1通道1PA1通道1PA1通道2PA2通道2PA2通道2PA2通道3PA3通道3PA3通道3PA3通道4PA4通道4PA4通道4PF6通道5PA5通道5PA5通道5PF7通道6PA6通道6PA6通道6PF8通道7PA7通道7PA7通道7PF9通道8PB0通道8PB0通道8PF10通道9PB1通道9PB1通道9PF3通道10PC0通道10PC0通道10PC0通道11PC1通道11PC1通道11PC1通道12PC2通道12PC2通道12PC2通道13PC3通道13PC3通道13PC3通道14PC4通道14PC4通道14PF4通道15PC5通道15PC5通道15PF5通道16连接内部温度传感器通道16连接内部VSS通道16连接内部VSS通道17连接内部VREFINT通道17连接内部VSS通道17连接内部VSSADC通道选择按组进行转换的模式,可以由程序设置实现对多个模拟通道自动地进行逐个采样转换,STM32分为两种组转换模式:规则组和注入组。规则组可通过编程来设定规则通道的数量n,n最多可设定为16。规则通道组最多允许16个规则通道进行转换转换结果保存在同一个16位的规则通道数据寄存器ADC_DR中,同时,EOC标志被置位,产生相应的中断或DMA请求。ADC通道选择规则组例如:设定n=3,规则通道组由1、2、3、5、6、7、9和11通道组成:第一次触发时,转换的序列为1、2和3通道;第二次触发,转换的序列为5、6和7通道;第三次触发,转换的序列为9和11通道,然后产生EOC事件;第四次触发,转换的序列为1、2和3通道,以此类推。10.2.2ADC通道选择注入组最多允许4个通道进行转换,并且对应有4个注入通道寄存器用来存放注入通道的转换结果,因此注入通道组没有DMA请求。转换结果保存数据寄存器ADC_JDRx中,同时产生ADC注入转换结束事件,即JEOC标志被置位,产生相应的中断。注入通道组的触发转换序列和规则通道一样规则通道组转换好比是程序的正常执行,注入通道组的转换则好比是一个中断处理程序3ADC中断和DMA请求ADC转换的触发信号的产生方式外部触发软件触发转换规则通道组的外部触发源可以是定时器的TIM1_CH1~TIM1_CH3,或者由外部中断线EXTI_11触发;注入组的外部触发源可以是外部中断线EXTI_15或TIM1_CH4定时器由软件编程控制,使能触发启动位3ADC中断和DMA请求ADC在每个通道转换完成后,可产生相应的中断请求。对于规则通道,如果ADC_CR1寄存器的EOCIE位被置“1”,则会产生EOC中断;对于注入通道,如果ADC_CR1寄存器的JEOCIE位被置“1”,则会产生JEOC中断;ADC1和ADC3的规则通道转换完成后还可产生DMA请求。3ADC中断和DMA请求中断事件事件标志使能控制位规则组转换结束中断ADC_IT_EOCEOC中断(EndofCoversion)EOCIE注入组转换结束中断ADC_IT_JEOCJEOC中断(EndofinjectedCoversion)JEOCIE模拟看门狗中断ADC_IT_AWDAWD中断(AnalogWatchDOG)AWDIEADC中断事件主要有三个,ADC_IT_EOC中断针对规则通道,ADC_IT_JEOC中断针对注入通道。3ADC中断和DMA请求只有ADC1和ADC3能产生DMA请求,ADC2转换数据可以在双ADC模式中使用ADC1的DMA请求在每次产生转换结束事件EOC标志后,DMA控制器会把保存在ADC_DR寄存器中的规则组通道的转换数据传送到SRAM中(用户指定的目标地址)规则通道的转换只有一个数据寄存器ADC_DR,每个通道转换完成后,将覆盖以前的数据,所以,可以使用DMA方式处理数据及时地将已完成转换的数据读出。适用情况使用原因应用DMA请求4ADC转换时间ADC总的转换时间可以表示为:ADC总的转换时间=采样时间+12.5个周期STM32的ADC的采样时间可选择为采样周期的1.5、7.5、13.5、28.5、41.5、55.5、71.5或239.5倍。ADC的时钟ADCCLK最大不能超过14MHz,因此STM32F103系列微控制器的ADC最短转换时间为1us。若采样时间为1.5个周期,PCLK2=72MHz,且ADCCLK为APB2的6分频,即12MHz,则
总的转换时间=(1.5+12.5)/12MHz=1.17us如果ADCCLK=14MHz,采样时间为1.5个周期,则
总的转换时间=(1.5+12.5)/14MHz=1us举例注意5ADC数据对齐转换结果12位数据寄存器16位数据对齐问题右对齐方式左对齐方式一般建议采用右对齐,因为数据传输一般是从最低位开始(也即右边开始),如果数据位是从高位开始传输的,可以采用左对齐方式。6ADC的转换模式单次模式连续模式扫描模式间断模式ADC只执行一次转换当前ADC转换一结束就会立即启动下一个转换扫描一组模拟通道:单次模式:扫描完本组所有通道后,ADC自动停止;连续模式:扫描完本组所有通道后,再从第一个通道继续扫描。用于多个通道的规则组和注入组6ADC的转换模式间断模式
在间断模式下,转换也有其特殊的规则:当以间断模式转换一个规则组时,转换序列结束后不自动从头开始;当所有子组被转换完成,下一次触发启动第一个子组的转换;规则组和注入组不能同时设置为间断模式。
以规则组为例,若被转换的通道为0、1、2、3、6、7、9、10,n=3,则第一次触发:进行转换的通道序列为0、1、2;第二次触发:进行转换的通道序列为3、6、7;第三次触发:进行转换的通道序列为9、10,并产生EOC事件;第四次触发:进行转换的通道序列0、1、2。3.2.3ADC模块的HAL库接口函数及应用ADC的HAL库接口函数1ADC的HAL库应用实例2ADC的HAL库接口函数定义在stm32f4xx_hal_adc.c源文件在stm32f4xx_hal_adc.h头文件中可以查看HAL库中DMA库函数的声明以及相关的结构体定义和串口一样可以通过轮询、中断和DMA三种方式进行操作。查询方式中断方式DMA方式ADC的HAL库常用接口函数初始化及复位函数HAL_ADC_Init(ADC_HandleTypeDef*hadc);功能描述:ADC初始化函数HAL_ADC_DeInit(ADC_HandleTypeDef*hadc);功能描述:ADC复位函数voidHAL_ADC_MspInit(ADC_HandleTypeDef*hadc);功能描述:ADC初始化配置函数,该函数被HAL库内部调用ADC的HAL库接口函数ADC的HAL库常用接口函数类型函数及功能描述引脚功能操作函数轮询方式HAL_ADC_Start(ADC_HandleTypeDef*hadc);功能描述:启动ADC转换HAL_ADC_Stop(ADC_HandleTypeDef*hadc);功能描述:停止ADC转换HAL_ADC_PollForConversion(ADC_HandleTypeDef*hadc,uint32_tTimeout);功能描述:等待转换结束,采用超时管理机制中断方式HAL_ADC_Start_IT(ADC_HandleTypeDef*hadc);功能描述:中断方式下启动ADC转换HAL_ADC_Stop_IT(ADC_HandleTypeDef*hadc);功能描述:中断方式下停止ADC转换DMA方式HAL_ADC_Start_DMA(ADC_HandleTypeDef*hadc,uint32_t*pData,uint32_tLength);功能描述:DMA方式下启动ADC转换HAL_ADC_Stop_DMA(ADC_HandleTypeDef*hadc);功能描述:DMA方式下停止ADC转换
uint32_tHAL_ADC_GetValue(ADC_HandleTypeDef*hadc);功能描述:轮询或中断方式下获取ADC转换值ADC的HAL库接口函数ADC的HAL库常用接口函数类型函数及功能描述中断处理函数(回调函数)voidHAL_ADC_IRQHandler(ADC_HandleTypeDef*hadc);功能描述:ADC中断处理函数voidHAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc);功能描述:ADC中断回调函数,用户在该函数内编写实际的中断处理程序voidHAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef*hadc);功能描述:ADC转换一半时调用的中断回调函数
外设配置函数HAL_ADC_ConfigChannel(ADC_HandleTypeDef*hadc,ADC_ChannelConfTypeDef*sConfig);功能描述:ADC配置函数外设状态函数uint32_tHAL_ADC_GetState(ADC_HandleTypeDef*hadc);功能描述:获取ADC转换状态函数uint32_tHAL_ADC_GetError(ADC_HandleTypeDef*hadc);功能描述:获取ADC错误函数10.3.1ADC的HAL库接口函数ADC的HAL库接口函数HAL_StatusTypeDefHAL_ADC_Start(ADC_HandleTypeDef*hadc);1.启动ADC转换函数HAL_ADC_Start()
if(HAL_ADC_Start(&hadc1)!=HAL_OK){Error_Handler();}/*等待转换结束*/HAL_ADC_PollForConversion(&hadc1,10);if(HAL_ADC_GetState(&hadc1)==HAL_ADC_STATE_EOC_REG){/*获取转换结果*/ADCx_ConvertedValue=HAL_ADC_GetValue(&hadc1);}使用范例函数原型10.3.1ADC的HAL库接口函数ADC的HAL库接口函数HAL_StatusTypeDefHAL_ADC_Start_IT(ADC_HandleTypeDef*hadc);2.启动ADC中断转换函数HAL_ADC_Start_IT()
if(HAL_ADC_Start_IT(&hadc1)!=HAL_OK){Error_Handler();}voidHAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc){/*获取ADC转换结果*/ADCx_ConvertedValue=HAL_ADC_GetValue(&hadc1);}使用范例函数原型10.3.1ADC的HAL库接口函数ADC的HAL库接口函数HAL_StatusTypeDefHAL_ADC_Start_DMA(ADC_HandleTypeDef*hadc,uint32_t*pData,uint32_tLength);3.启动ADC的DMA转换函数HAL_ADC_Start_DMA()if(HAL_ADC_Start_DMA(&hadc1,&ADCx_ConvertedValue,1)!=HAL_OK){Error_Handler();}voidHAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc){/*DMA传输结束,指示灯LED亮*/HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);} 使用范例函数原型10.3.1ADC的HAL库接口函数ADC的HAL库接口函数10.3.2ADC的HAL库应用实例内部有一个温度传感器,测量范围为:-40℃~125℃,测量精度范围为±1.5℃,用来测量芯片内部的温度,连接在ADC1_IN16的输入通道上。本实例将采集到的温度数据通过串口发送到PC机。功能描述STM32内部温度传感器说明ADC的HAL库接口函数10.3.2HAL库ADC应用实例V25为温度传感器在25℃时的输出电压,典型值为0.76V;Avg_Slope为温度传感器输出电压与温度曲线的平均斜率的关联参数,典型值为2.5mV/℃ADC的HAL库接口函数Temperature(in°C)={(VSENSE–V25)/Avg_Slope}+2510.3.2HAL库ADC应用实例通过连接在ADC1的通道16上的STM32F407内部温度传感器获取芯片内部的温度;通过串口将采集到的温度数据显示出来。硬件设计ADC的HAL库接口函数HAL库ADC应用实例软件设计新建STM32CubeMX工程,选择MCUSTM32CubeMX功能参数配置生成工程代码编写应用程序配置RCC配置ADC设置STM32时钟系统和ADC的时钟串口USART1配置软件设计——新建STM32CubeMX工程,选择MCU新建STM32CubeMx工程,选择MCU,这里选择STM32F407ZETx芯片,读者可根据自己的目标板选择相应的芯片软件设计——STM32CubeMX功能参数配置HSE选择“Crystal/CeramicResonator”(晶振/陶瓷谐振器),LSE选择“Disable”RCC配置软件设计——STM32CubeMX功能参数配置本实例采用ADC1的“TemperatureSensorChannel”通道(即连接在ADC1_IN16)ADC配置——设置ADC1的通道软件设计——STM32CubeMX功能参数配置在ADC1参数配置“Configuration”选项配置页的“ParameterSettings”中对ADC1的相关参数进行设置,本例配置ADC1为独立模式,设置数据对齐方式为右对齐,禁止扫描转换模式,使能连续转换模式,在“Rank”项中设置采样周期为55.5CyclesADC配置——配置ADC1的参数ADC的模式选择:独立模式ADC时钟分频系数选择配置ADC的分辨率配置ADC转换结果的对齐方式配置ADC是否需要扫描,单通道不需要,多通道需要配置是否启动
自动连续转换配置是否使用间断模式是否使用DMA传输外部触发选择,一般选软件触发规则组ADC转换总的通道数ADC的注入通道转换模式选择本次转换的位序为1,单通道总为1软件设计——STM32CubeMX功能参数配置使用的外部晶振为8MHz配置系统时钟为168MHzAPB2为84MHzAPB1为42MHzADC为APB2的四分之一即21MHz设置STM32时钟系统和ADC的时钟软件设计——STM32CubeMX功能参数配置设置USART1为“Asychronous”模式波特率设置为115200,数据位数为8校验位选择无校验停止位为1位串口USART1配置软件设计——生成工程代码配置工程名称和存放位置,输入“ProjectName”为“Poling_ADC_Intempture”,“Toolchain/IDE”选择“MDK-ARMV5”配置keil工程名称和存放位置软件设计——生成工程代码在“CodeGenerator”选项栏中找到“Generatedfiles”框,勾选“Generateperipheralinitializationasapairof’.c/.h’filesperIP”,将外设初始化的代码设置生成为独立的.c源文件和.h头文件。软件设计——编写应用程序在main.c文件中的添加代码。/*USERCODEBEGINPD*/#defineV250.76//V25=Vsense在25度时的数值(典型值为:0.76)。#defineAvg_Slope0.0025//Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/℃,典型值为2.5mV/℃)。/*USERCODEENDPD*//*USERCODEBEGINPV*/floattemperate=0.0;/*USERCODEENDPV*/软件设计——编写应用程序在while语句中的/*USERCODEBEGIN3*/和/*USERCODEEND3*/之间添加代码
while(1)
{
/*USERCODEBEGIN3*/
HAL_ADC_Start(&hadc1);//开启ADC电压转换(软件触发)HAL_ADC_PollForConversion(&hadc1,50);//等待ADC转换结束
//判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC为转换完成标志位
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026济南干部面试题目及答案
- 2026禁养宠物面试题及答案
- 人工智能在保险产品设计中的创新应用-第1篇
- 保险AI在智能承保中的技术突破
- 2026年通化市二道江区住房和城乡建设局人员招聘笔试备考试题及答案详解
- 2026年洛阳市西工区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 人工智能风险管理-第34篇
- 2026年沈阳市东陵区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 2026年菏泽单县二中教育集团面向社会公开招聘教师(12人)笔试备考试题及答案详解
- 2026年上犹县社区工作者(专职网格员)公开招聘【18人】考试模拟试题及答案详解
- DB62T 25-3111-2016 建筑基坑工程技术规程
- 企业法人的特别离职证明(6篇)
- 电子化学品系列报告之四:湿电子化学品高端产品国产进程有望加速
- T-CAZG 010-2022 动物园鸟类人工孵化和育雏技术规范
- 顺丰SHL在线测评题库
- 校园保安服务投标方案
- 高架车使用安全规定
- 天津高考英语词汇3500
- 2023年四川日报报业集团招聘笔试备考试题及答案解析
- 食品工程原理-传热
- GB/T 77-2007内六角平端紧定螺钉
评论
0/150
提交评论