STM32学习笔记(输入捕获之测量电平时间)

使用hal库编辑的时候,要学会使用普通的库编程的方法,这样可以用hal库来初始化引脚,配置寄存器,这样hal库的应用方法更加灵活。
经过硬石资料可知Cube编程生成的定时器输入捕获寄存器配置代码十分完善,
以下为主函数main.c中的补充函数,十分完善:

**void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
strCapture .usPeriod ++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
TIM_IC_InitTypeDef sConfigIC;

if ( strCapture .ucStartFlag == 0 )
{
// LED1_TOGGLE;

__HAL_TIM_SET_COUNTER(htim,0); 
strCapture .usPeriod = 0;			
strCapture .usCtr = 0;

sConfigIC.ICPolarity = GENERAL_TIM_END_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);
__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx);
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);    
strCapture .ucStartFlag = 1;			

}

else
{
// LED1_TOGGLE;

strCapture .usCtr = HAL_TIM_ReadCapturedValue(&htim5,GENERAL_TIM_CHANNELx);
sConfigIC.ICPolarity = GENERAL_TIM_STRAT_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);

__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx); 
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);    
strCapture .ucStartFlag = 0;			
strCapture .ucFinishFlag = 1;    

}
}**

在int main中的代码补充如下:

/ USER CODE END 2 /
/
Infinite loop /
/
USER CODE BEGIN WHILE /
ulTmrClk = HAL_RCC_GetHCLKFreq()/GENERAL_TIM_PRESCALER;
/
启动定时器 /
HAL_TIM_Base_Start_IT(&htim5);
/
启动定时器通道输入捕获并开启中断 /
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);

以下为tim.h中的代码补充
/* USER CODE BEGIN Private defines

typedef struct
{
uint8_t ucFinishFlag;
uint8_t ucStartFlag;
uint16_t usCtr;
uint16_t usPeriod;
}STRUCT_CAPTURE;
#define GENERAL_TIMx TIM5
#define GENERAL_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM5_CLK_ENABLE()
#define GENERAL_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM5_CLK_DISABLE()
#define GENERAL_TIM_GPIO_RCC_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();
#define GENERAL_TIM_CHANNELx TIM_CHANNEL_1
#define GENERAL_TIM_IT_CCx TIM_IT_CC1
#define GENERAL_TIM_IRQn TIM5_IRQn
#define GENERAL_TIM_IRQHANDLER TIM5_IRQHandler
#define KEY1_RCC_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define KEY1_GPIO_PIN GPIO_PIN_0
#define KEY1_GPIO GPIOA
//
#define GENERAL_TIM_PERIOD 0xFFFF
#define GENERAL_TIM_STRAT_ICPolarity TIM_INPUTCHANNELPOLARITY_RISING //
#define GENERAL_TIM_END_ICPolarity

以下为Cube中配置的图片:在这里插入图片描述
芯片主频依然是72M
定时器5具体配置如下
在这里插入图片描述
注意事项:在使用定时器输入捕获的时候一定要使能定时器中断,并且对于脉冲宽度来书只需要打开输入捕获的一个功能即可,添加函数的时候一定要注意,不要丢下任何东西。而且在主函数中一定要使能定时器输入捕获中断开启函数,否贼定时器不能正常使用。
输入捕获测量脉冲时间的主要应用模块是超声波模块,经过实验发现超声波Trig引脚(距离测量使能引脚)使能时间不要过长,规定要求是大于等于10us使能,但是经过测试如果使能时间达到1ms,模块就不能正常使用,因此使能时间最好是20us左右:
在这里插入图片描述
超声波采集代码如下,注意一定要初始化定时器中断,定时器输入捕获通道中断开启,GPIO口复位,超声波初始化函数如下所示:
在这里插入图片描述
主函数中的定时器中断输入捕获回调函数:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值