STM32F105RBT6 使用定时器TIM3输出PWM波_stm32f105rbt6 demo

GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;

// Enable clock for TIM3 and GPIOB
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB2Periph_GPIOB, ENABLE);

// Initialize GPIOB to output PWM signal
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);

// Initialize TIM3 for PWM generation with interrupt on update
  TIM_InitStruct.TIM_Prescaler = 0; // Set PWM frequency to 72MHz (72 MHz / (0 + 1))
TIM_InitStruct.TIM_Period = 999;
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_InitStruct);

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 = 500; // Duty cycle = 50%
TIM_OC4Init(TIM3, &TIM_OCInitStruct);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);

}


### 3. 中断入口 TIM3\_IRQHandler


#### 3.1 在启动文件里面找到TIM3 对应的中断入口函数,也就是中断服务函数 TIM3\_IRQHandler


![在这里插入图片描述](https://img-blog.csdnimg.cn/ea491052be64475bb005b3f2ce40551a.png)


### 4. 编写中断服务函数



void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // overflow interrupt
{
printf(“龙傲天说,我三岁拳打南山不老院,四岁脚踢北海幼儿园\r\n”);
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); // clear interrupt flag

// Handle interrupt by updating PWM duty cycle value

// static uint16_t duty_cycle = 500; // Initial value of 50%
// duty_cycle = duty_cycle < 950 ? duty_cycle + 50 : 0; // Increase duty cycle by 5% every period
// TIM_SetCompare4(TIM3, duty_cycle);
}


#### 4.1 中断服务函数需要快速地执行完毕。中断服务函数应该避免执行太多的计算复杂度较高的操作,否则可能会导致中断响应时间过长,甚至因为延迟而导致系统不稳定。


#### 4.2 如果你需要在中断服务函数中访问全局变量,需要将这些变量定义为volatile类型。这是因为中断服务函数可能会在任何时间被外部中断所打断,如果没有使用volatile类型,就有可能导致变量值不准确。


#### 4.3 在中断服务函数的结尾处,需要调用NVIC\_ClearPendingIRQ()函数来清除中断挂起位。


#### 4.4 中断函数最好别用printf 函数等耗时、有可能阻塞的一些函数,printf函数本身就比较耗时,在中断服务函数中调用的话,可能会导致中断响应时间过长,使系统不稳定。如果在中断服务函数中使用了printf函数,可能会导致printf函数与被打断的低优先级代码发生冲突,造成数据异常。我这里用 printf 只是为了装13,我龙傲天谁都不服


#### 4.4 中断服务函数需要快速、简洁、有效地处理中断,并且需要小心地处理共享资源和全局变量。


### 5. 主函数调用一下初始化函数就可以了



int main(void)
{
TIM3_Init();
while (1)
{
printf(“剑圣来了,快跑”);
}
}


#### 5.1 如果没有成功输出pwm波,可能是初始化时序不对,前面已经操作过该IO口了,我有很多的例程放在一起,搞混了,需要把原来的操作去掉,屏蔽掉,或者调整一下 TIM3\_Init() 的位置,如果有很多别的初始化函数,就把TIM3\_Init() 放到后面一点试试


![在这里插入图片描述](https://img-blog.csdnimg.cn/1c43e76b6c474e9295a9cdba9145568a.png)


### 6. 串口数据


![在这里插入图片描述](https://img-blog.csdnimg.cn/9409f19a5de04db88eb81fa5db970ba6.png)


### 7. 拿示波器或者逻分仪去量PB1 引脚,看波形,有毛刺,我没滤波的,可以处理掉


![在这里插入图片描述](https://img-blog.csdnimg.cn/aeab930ef7cc49ac82be35bd3f455704.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/cce867a4019f45fba80d0e5c35d50136.jpeg)


### 8. PWM 波频率、周期计算


#### 8.1 频率 F = SYSCLK / ((TIM\_Prescaler + 1) / (TIM\_Period + 1))


#### 8.2 周期 T = 1 / F


#### 8.3 制造一个频率是1 Hz的PWM 波,周期 1s, 占空比50%,改下面三个参数值就行了



TIM_InitStruct.TIM_Prescaler = 7199;
TIM_InitStruct.TIM_Period = 10000;
TIM_OCInitStruct.TIM_Pulse = 5000;  // 占空比50% = 5000 / (TIM_Period + 1)

![在这里插入图片描述](https://img-blog.csdnimg.cn/3636b70995914a3eb2abfad466392df8.jpeg)


### 9. TIM3的四个通道输出四路PWM,各个通道之间输出的PWM是独立的,频率,占空比可单独设置



void TIM3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

嵌入式&物联网开发知识点,真正体系化!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值