1.开发环境

(1)Cube5.24

(2)Keil5

(3)STM32F103

2.Cube配置

Cube配置很简单,只要打开TIM4通道1的引脚,设置为输入捕获模式,在配置是高或低电平沿触发

TIM的定时器时钟可根据自己的需要来配置,触发模式为上升沿触发

最后把中断给打开

Cube生成的代码如下:

void MX_TIM4_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {};
TIM_IC_InitTypeDef sConfigIC = {}; htim4.Instance = TIM4;
htim4.Init.Prescaler = ;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 0xffff;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_IC_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = ;
if (HAL_TIM_IC_ConfigChannel(&htim4, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
} } void HAL_TIM_IC_MspInit(TIM_HandleTypeDef* tim_icHandle)
{ GPIO_InitTypeDef GPIO_InitStruct = {};
if(tim_icHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspInit 0 */ /* USER CODE END TIM4_MspInit 0 */
/* TIM4 clock enable */
__HAL_RCC_TIM4_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE();
/**TIM4 GPIO Configuration
PD12 ------> TIM4_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); __HAL_AFIO_REMAP_TIM4_ENABLE(); /* TIM4 interrupt Init */
HAL_NVIC_SetPriority(TIM4_IRQn, , );
HAL_NVIC_EnableIRQ(TIM4_IRQn);
/* USER CODE BEGIN TIM4_MspInit 1 */ /* USER CODE END TIM4_MspInit 1 */
}
} void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef* tim_icHandle)
{ if(tim_icHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspDeInit 0 */ /* USER CODE END TIM4_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM4_CLK_DISABLE(); /**TIM4 GPIO Configuration
PD12 ------> TIM4_CH1
*/
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_12); /* TIM4 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM4_IRQn);
/* USER CODE BEGIN TIM4_MspDeInit 1 */ /* USER CODE END TIM4_MspDeInit 1 */
}
}

3.主程序

在写自己的代码之前要说一下HAL库的stm32f1xx_hal_tim.c里有一个BUG,他们这个宏定义——#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__)要改一下

原本如下:

#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP))) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P)) :\
((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P)))

改了如下:

#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P)) :\
((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P)))

两者唯一的区别就是原本的第一行后面多了一个括号!!!

输入捕获的功能就是当输入捕获引脚检测到上升沿或下降沿时进入中断服务函数,处理事务,该中断服务函数为void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

主函数:

  while ()
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
if(capture_Cnt==)
{
__HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING); //设置为上升沿捕获
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
capture_Cnt++; } }

中断函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
uint32_t a;
if(TIM4 == htim->Instance)
{
if(capture_Cnt==)
{
//capture_Buf[0] =HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_1); //获取当前的捕获值
HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_1); //停止捕获
capture_Cnt=;
Number++;
printf("\n%d",Number);
// printf("\n捕捉上升沿:%d",capture_Buf[0] ); } } }

我这里只是计算一下进入了多少次中断,你们可以根据自己的需求来写处理的程序。

最新文章

  1. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
  2. Android入门(十九)WebView
  3. Arcgis for android 离线查询
  4. Codeforces Round #313 (Div. 2) A. Currency System in Geraldion 水题
  5. 浅谈C中的指针和数组(一)
  6. js获得时间new Date()整理
  7. 201521123003《Java程序设计》第9周学习总结
  8. 基于.net EF6 MVC5+WEB Api 的Web系统框架总结(1)-Web前端页面
  9. 【php】php7新特性及其优化原理
  10. 应用调试(三)oops
  11. 马凯军201771010116《面向对象与程序设计Java》第十六周知识学习总结
  12. webpack打包和gulp打包工具详细教程
  13. 使用Java实现简单的局域网设备扫描
  14. The issus in Age Progression/Regression by Conditional Adversarial Autoencoder (CAAE)
  15. Easyui combobox下拉框默认选中第一项
  16. 2018.08.28 codeforces600E(dsu on tree)
  17. Chapter 8(查找)
  18. RPM 打包技术与典型 SPEC 文件分析
  19. 【转载】伪静态SQL注入
  20. ANR异常

热门文章

  1. JDK 13 都已经发布了,Java 8 依然是最爱
  2. vue知识点整理
  3. 基于Spark的电影推荐系统(电影网站)
  4. C#实现请求唯一性校验支持高并发
  5. java8 Stream使用总结
  6. layui内部定义的function,外部调用时候,提示某函数未定义现象解决方案
  7. java程序猿如何练习java版的易筋经?
  8. 从React-Native坑中爬出,我记下了这些
  9. ELK 学习笔记之 Kibana安装
  10. spring boot项目下的application.properties中的logging.level设置日志级别