STM32库函数TIM_SetCompare()的工作机制测试

一、TIM_SetCompare()函数的定义

  • 其中,TIM_SetCompareX()这个函数有四个,它们为:TIM_SetCompare1、TIM_SetCompare2、TIM_SetCompare3、TIM_SetCompare4,同时分别对应:CH1、CH2、CH3、CH4。
/**
  * @brief  Sets the TIMx Capture Compare1 Register value
  * @param  TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
  * @param  Compare1: specifies the Capture Compare1 register new value.
  * @retval None
  */
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
{
  /* Check the parameters */
  assert_param(IS_TIM_LIST8_PERIPH(TIMx));
  /* Set the Capture Compare1 Register value */
  TIMx->CCR1 = Compare1;
}

二、各定时器下能输出PWM的GPIO口汇总

在这里插入图片描述
三、实验程序

  • 该例程通过TIM_SetCompare()这个函数可以产生PWM波,该波形的理论周期为12.5毫秒。细心的读者可以发现,TIM_SetCompare()函数是放在while这个大循环中的,我们知道程序执行的速度是非常快的,以该例程为例,也意味着在12.5毫秒以内,TIM_SetCompare()这个函数会被执行多遍,那么会不会出现某一个PWM周期还没有完全执行完毕,TIM_SetCompare()这个函数又传递了新的占空比,将上一个未执行完毕的PWM周期给打断呢?
  • 本文就将探索该问题,一起来看看吧~
 int main(void)
 {		
 	u16 led0pwmval=0;
	u8 dir=1;	
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
 	TIM3_PWM_Init(899,0);	 //不分频。PWM频率=72000000/900=80Khz
	 
   	while(1)
	{	 
		if(dir)led0pwmval++;
		else led0pwmval--;
 		if(led0pwmval>300)dir=0;
		if(led0pwmval==0)dir=1;										 
		TIM_SetCompare2(TIM3,led0pwmval);		
	}	 
 }

四、示波器测试结果分析
在这里插入图片描述
在这里插入图片描述

- 从示波器结果可以看出:
1.执行TIM_SetCompare()函数会将每个PWM周期完整的运行完毕,不会存在还未运行完毕就被打断的情况;

2.TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)函数中的第二个入口参数“uint16_t Compare2”,它的值是在上一个周期运行完毕之后,系统再给它赋值的;

3.TIM_SetCompare()函数的运行,并不会影响其他函数的正常运行,例如本例程中,运行TIM_SetCompare()函数并不会影响上面“if 函数”,TIM_SetCompare()在产生一个PWM周期的过程中,其他程序正常运转。

### TIM_OCStructInit 的定义与用法 `TIM_OCStructInit` 是一个用于初始化 `TIM_OC_InitTypeDef` 类型结构体的宏或函数。它的主要作用是将该结构体的所有成员变量设置为默认值,从而简化开发者的配置过程并减少潜在错误的发生。 以下是关于其定义和用法的具体说明: #### 定义 在 STM32 的标准外设库中,`TIM_OCStructInit` 被定义为一个宏,通常位于头文件 `stm32fxxx_tim.h` 中。它会自动填充 `TIM_OC_InitTypeDef` 结构体的各个字段为其默认值[^1]。这些默认值通常是满足基本功能需求的安全初始状态。 #### 默认值列表 对于 `TIM_OC_InitTypeDef` 结构体,默认值如下所示: - `TIM_OCMode`: 设置为 `TIM_OCMode_Timing` 表示定时模式。 - `TIM_OutputState`: 设置为 `TIM_OutputState_Disable` 表示关闭输出。 - `TIM_OCPolarity`: 设置为 `TIM_OCPolarity_High` 表示高电平有效。 - `TIM_Pulse`: 设置为 `0xFFFF` 表示占空比最大。 #### 使用方法 为了使用 `TIM_OCStructInit` 初始化结构体,开发者需按照以下方式操作: 1. 声明一个 `TIM_OC_InitTypeDef` 类型的结构体实例。 2. 调用 `TIM_OCStructInit` 将此结构体初始化为默认值。 3. 根据实际应用需求修改特定成员变量的值。 下面是一个完整的代码示例展示如何使用 `TIM_OCStructInit` 进行初始化: ```c // 声明结构体实例 TIM_OC_InitTypeDef TIM_OCInitStruct; // 调用 TIM_OCStructInit 函数将其初始化为默认值 TIM_OCStructInit(&TIM_OCInitStruct); // 修改所需参数以适配具体应用场景 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStruct.TIM_Pulse = 1999; // 占空比对应的脉冲宽度 // 调用 TIM_OC3Init 函数完成通道3的PWM初始化 TIM_OC3Init(TIM_Handle, &TIM_OCInitStruct); ``` 以上代码片段展示了从声明到最终调用的过程,并通过调整各成员变量实现了自定义的功能配置。 --- ### 配套资源补充 除了核心的 `TIM_OCStructInit` 和相关函数之外,在实际项目中可能还需要配合其他辅助工具来完善整个系统的构建。例如,可以通过包含如下的头文件引入必要的接口支持: ```c #include "PWM.h" ``` 其中包含了诸如 `PWM_Init`, `PWM_SetCompare1`, 及 `PWM_SetPrescal` 等实用函数[^2]。 另外需要注意的是,在硬件层面也需要做好相应的准备,比如启用时钟信号以及正确配置目标引脚的工作模式。典型做法可参见下述代码段: ```c /* 开启时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 启动 TIM3 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 启动 GPIOA 时钟 /* GPIO 初始化 */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;// PA6 和 PA7 引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大速度 50 MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 应用配置至 GPIOA ``` 这里特别强调了针对 **PA6** 和 **PA7** 引脚的操作细节[^3]。 最后值得一提的是,获取捕获寄存器或者比较寄存器的内容也可以借助专门设计的一系列 API 实现,像 `TIM_GetCaptureX` 或者 `TIM_SetCompareX` (此处 X=1~4)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值