利用STM32HAL库发送一定频率的脉冲并用主从模式进行计数

一、实验目的

    使用两个TIM时钟分别发送不同频率的脉冲,并使用从定时器对两路脉冲分别计数。

二、实验内容

2.1 引脚配置

    初始化配置:三件套

    配置TIM1时钟通道3作为第一路脉冲发送,配置TIM2时钟通道1作为第二路脉冲发送。

    TIM1的Clock Source(时钟源)为内部时钟,频率为168MHZ, Prescaler(预分频系数):即PSC寄存器值设为168-1,计数脉冲频率:168MHz÷168=1MHz,即每秒产生1百万个计数信号,每个计数脉冲的时长:1秒/1M=1us,Counter Period (计数周期):  即ARR寄存器值,多少个计数脉冲作为1个波形周期。

    TIM2的Clock Source(时钟源)为内部时钟,频率为84MHZ。

    Repetition Counter(重复计数器):   简单地理解,多少个周期才触发1次中断;

    auto-reload preload (自动重载值的预装载):  当改变周期值ARR时,是否等到下一个更新事件再写入数值,使得数值的更改不影响执行中的波形。

注:

  • TIM1、8、9、10、11的时钟频率是168MHz;
  • 其它TIM的时钟频率是84MHz。 

    设置TRGO(Trigger Outpu)参数,Enable 主从模式,Update Event 作为触发事件。

    配置TIM4作为TIM1的从定时器,计数脉冲 ,配置TIM8作为TIM2的从定时器,计数脉冲 。

    配置从模式和触发源 ,打开中断

 

 2.2 发送脉冲并计数程序

       设置ARR的值来设定发送脉冲的频率,1M/(ARR+1) = fpwm;设置CCR的值为(ARR+1) *0.5来设定发送脉冲的占空比为50%。

  uint16_t pwmVal1=500;   //PWM??? 
  uint16_t ARR1=1000-1;   //PWM???
  
  uint16_t pwmVal2=500;   //PWM??? 
  uint16_t ARR2=1000-1;   //PWM???


void set_pwm_param(uint16_t f1,uint16_t f2) 
{			
			 ARR1 = 1000000/f1 - 1;
			 pwmVal1 = (ARR1+1)*0.5;
			
				
			 ARR2 = 1000000/f2 - 1;
			 pwmVal2 = (ARR2+1)*0.5;
				
			 TIM1->CCR3 = pwmVal1;
			 TIM1->ARR  = ARR1;
				
			 TIM2->CCR1 = pwmVal2;
			 TIM2->ARR  = ARR2;

}

    调用函数设定两路脉冲的频率,并开启脉冲发送。 开启TIM4和TIM8的中断,并设定两个定时器的自动重装载计数值作为输出脉冲的个数

	set_pwm_param(5000,10000);              //set pwm1 frequence and pwm2 frequence 

    __HAL_TIM_SET_AUTORELOAD(&htim4,1000-1); //ÉèÖÃÒªÊä³öµÄPWMÂö³åÊý1000¸ö
	__HAL_TIM_SET_AUTORELOAD(&htim8,5000-1); //ÉèÖÃÒªÊä³öµÄPWMÂö³åÊý1000¸ö
	HAL_TIM_Base_Start_IT(&htim4);               //Æô¶¯´Ó¶¨Ê±Æ÷
	HAL_TIM_Base_Start_IT(&htim8);               //Æô¶¯´Ó¶¨Ê±Æ÷

    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);	

    在中断回调函数里面编写程序,当两个计数脉冲的时钟触发更新中断,清除定时器中断标志位并停止主定时器的脉冲输出。这样使得主定时器输出给定数目的脉冲。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	
 if(__HAL_TIM_GET_FLAG(&htim4, TIM_FLAG_CC2) != RESET)  //????????   
        {
            __HAL_TIM_CLEAR_FLAG(&htim4, TIM_FLAG_CC2);      //??????
            HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);   //??????
            HAL_TIM_Base_Stop_IT(&htim4);         //??????
//			HAL_GPIO_WritePin(GPIOE, EN1_Pin, GPIO_PIN_RESET);
        }
   if(__HAL_TIM_GET_FLAG(&htim8, TIM_FLAG_CC2) != RESET)  //????????   
        {
            __HAL_TIM_CLEAR_FLAG(&htim8, TIM_FLAG_CC2);      //??????
            HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);   //??????
            HAL_TIM_Base_Stop_IT(&htim8);         //??????
//			HAL_GPIO_WritePin(GPIOE, EN12_Pin, GPIO_PIN_RESET);
        }
}			

 

 

 

 

### STM32 HAL定时器外部计数配置方法STM32微控制器中,通过HAL可以方便地实现定时器的外部计数功能。以下是详细的配置说明以及示例代码。 #### 1. 外部时钟源的选择 为了使定时器能够响应外部信号进行计数,需设置其输入捕获通道为外部时钟源模式。通常情况下,TIMx_ETR(External Trigger Input)被用来作为外部时钟输入端口[^1]。 #### 2. 初始化结构体参数设定 利用`TIM_HandleTypeDef`类型的句柄变量初始化外设资源,在此过程中需要特别关注以下几个成员属性: - `Instance`: 指定使用的具体定时器实例。 - `Init.CounterMode`: 设置计数模式为向上计数或其他适用选项。 - `Init.ClockDivision`: 设定分频系数,默认值一般满足需求无需修改。 - `Init.Prescaler`: 预分频器数值决定内部时基频率相对于系统核心时钟的比例关系。 - `SlaveMode`: 当采用从属模式控制时定义如何同步主从设备间操作逻辑。 另外还需调用函数来指定ETR引脚映射及其滤波特性等相关细节[^2]。 #### 示例代码展示 下面给出了一段完整的C语言程序片段用于演示如何基于STM32CubeMX工具生成的基础框架之上完成上述提到的各项配置工作: ```c // 定义全局变量 htim2 表征 TIM2 的状态信息 TIM_HandleTypeDef htim2; void MX_TIM2_Init(void){ TIM_MasterConfigTypeDef sMasterConfig; // 基本初始化部分省略... /* 配置 ETR 输入 */ __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE); __HAL_TIM_SET_CLOCKSOURCE(&htim2,TIM_CLOCKSOURCE_EXTERNAL); // 清除标志位防止误触发中断事件发生 __HAL_TIM_CLEAR_FLAG(&htim2, TIM_SR_UIF); // 开启 IT 中断服务并启动计时过程 HAL_TIM_Base_Start_IT(&htim2); } /* 用户自定义处理回调函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM2){ static uint8_t count=0; printf("Count:%d\r\n",++count); } } ``` 以上即为一个简单的例子展示了怎样借助于ST官方提供的HAL驱动层接口快速搭建起支持外部脉冲输入统计的应用场景解决方案[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值