- 脉冲计数配置步骤
1.硬件
2.软件
- 定时器HAL驱动层文件添加
- counter驱动文件添加
- GPIO常用函数
- main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "counter.h"
int main(void)
{
HAL_Init();
stm32_clock_init(RCC_PLL_MUL9);
led_init();
uart1_init(115200);
printf("hello world!\r\n");
counter_init(65536 - 1, 0);
while(1)
{
count_get();
}
}
- **
counter_init(65536 - 1, 0);
**语句定时参考
#include "counter.h"
#include "stdio.h"
TIM_HandleTypeDef counter_handle = {0};
uint16_t new_count = 0;
uint16_t old_count = 0;
void counter_init(uint16_t arr, uint16_t psc)
{
TIM_SlaveConfigTypeDef slave_config = {0};
counter_handle.Instance = TIM2;
counter_handle.Init.Prescaler = psc;
counter_handle.Init.Period = arr;
counter_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_IC_Init(&counter_handle);
slave_config.SlaveMode = TIM_SLAVEMODE_EXTERNAL1;
slave_config.InputTrigger = TIM_TS_TI2FP2;
slave_config.TriggerPolarity = TIM_TRIGGERPOLARITY_FALLING;
slave_config.TriggerFilter = 0;
HAL_TIM_SlaveConfigSynchro(&counter_handle, &slave_config);
HAL_TIM_IC_Start(&counter_handle, TIM_CHANNEL_2);
}
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
GPIO_InitTypeDef gpio_initstruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
gpio_initstruct.Pin = GPIO_PIN_0;
gpio_initstruct.Mode = GPIO_MODE_AF_PP;
gpio_initstruct.Pull = GPIO_PULLUP;
gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &gpio_initstruct);
}
}
void count_get(void)
{
new_count = __HAL_TIM_GET_COUNTER(&counter_handle);
if(old_count != new_count)
{
old_count = new_count;
printf("CNT: %d\r\n", new_count);
}
}
#ifndef __COUNTER_H__
#define __COUNTER_H__
#include "sys.h"
void counter_init(uint16_t arr, uint16_t psc);
void count_get(void);
#endif
3.实物效果
- 硬件模块接线
KEY一端—>PA0
KEY另一端—>GND
ST-Link下载方式
将定时器 2 通道 2 输入的低电平脉冲作为定时器 2 的时钟,并通过串口打印脉冲数
PSC=0,ARR=65535
外部时钟模式1、触发选择、上升沿触发、不分频、不滤波