STM32定时器输出比较(PWM)

发布者:温暖微笑最新更新时间:2021-11-29 来源: eefocus关键字:STM32  定时器  输出比较 手机看文章 扫描二维码
随时随地手机看文章

前言:

1.本博文基于ARM Cortex-M3内核的STM32F103ZET6处理器芯片和标准3.5.0库函数;

2.不介绍PWM的基础概念,但是需要知道一点的是,PWM是输出比较的一种特例;

3.如有不足指出,还望前辈多多指教;

4.要想学会这个知识点,必须要掌握下面这位博友写的博客里的几个概念,不然后来很有可能会懵逼;

http://blog.sina.com.cn/s/blog_3ba262a10101esd1.html


Ⅰ 定时器和PWM

(1)8个定时器中,除了TIM6和TIM7,其他定时器都可以产生PWM输出;

(2)高级定时器TIM1和TIM8可以同时输出7路PWM(CH1~7,共7个通道),通用定时器同时可产生4个PWM输出(CH1~4,共4个通道);也即是STM32F103ZET6最多同时产生30通道的PWM;

(3)本博客只用TIM3的CH2通道(为什么选择这个后来解释);


Ⅱ 相关寄存器

(1)捕获/比较模式寄存器1 TIMx_CCMR1(还有TIMx_CCMR2)

这里写图片描述

可以认为这是输入输出双功能的寄存器:OCxx代表输出模式(第一排),ICxx代表输入模式(第二排),也即是同一个位在不同的输入和输出模式下功能是不同的;PWM是用来输出的,所以这里只有第一排输出功能,而且是通道是CH2;

这里写图片描述
这里写图片描述
这里写图片描述

从寄存器图中可以看出来:

CCMR1的[15:8]位负责TIM3的CH2通道,[7:0]负责TIM3的CH1通道;

CCMR2的[15:8]位负责TIM3的CH4通道,[7:0]负责TIM3的CH3通道;

对于模式设置OCxM[2:0]如上图:OCxM[2:0] = 110或111的时候为PWM输出的两种方式;


(2)捕获/比较使能寄存器1 TIMx_CCER1(还有TIMx_CCER2)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这个寄存器涉及到的问题相当重要,开始看这个位解释的时候根本就不想去了解,因为实在是无从下手;后来搜到了一位大神的博客豁然开朗,下面是大神的博客:

http://blog.sina.com.cn/s/blog_3ba262a10101esd1.html


(3)捕获/比较寄存器1 TIMx_CCR1(1~4,共四个通道)

这里写图片描述

CCR寄存器决定PWM占空比:在输出模式下,该寄存器的值与CNT的值进行比较,根据结果产生相应动作。利用这一点,通过修改这个寄存器的值,就可以控制PWM的输出脉宽了。


Ⅲ 复用映射和调试IO配置寄存器(AFIO_MAPR)

这里写图片描述
这里写图片描述

PWM相关寄存器配置OK后,紧接着一个直接的问题就是:总要有一个IO口来输出做好的PWM吧?对,这就引出了AFIO_MAPR寄存器的概念;此寄存器就是为配置定时器输出时所用的管脚而生(但也并不是所有的管脚都能被任意的定时器用);从我个人的开发板的硬件电路出发, 要利用TIM3和GPIOB5管脚输出PWM信号来控制一个LED灯,从而实现控制LED亮度的实验;但是有一个棘手的问题是:在初始化(复位)AFIO_MAPR寄存器状态下,TIM3输出PWM信号给了GPIOPA7,所以要修改,对应关系如下图:

这里写图片描述

结合两个图:AFIO_MAPR寄存器中的[11:10]位可以为重新配置TIM与GPIO关系;这里我们是让[11:10] = 10 ; (定时器输出属于GPIO的复用功能)

(其他定时器的配置可以参考使用手册的其它位设置,道理是有一样的)


Ⅳ 编程步骤


GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;


(1)开启TIMx时钟以及复用功能,配置要设置的对应的管脚复用输出(PB5);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

(2)重定义TIMx和GPIOx的连接

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

(3)分别配置管脚参数,普通定时器参数和定时器比较参数(PWM);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);


TIM_TImeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TImeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TImeBaseInitStructure.TIM_Period = arr;

TIM_TImeBaseInitStructure.TIM_Prescaler = psc;

TIM_TimeBaseInit(TIM3,&TIM_TImeBaseInitStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC2Init(TIM3,&TIM_OCInitStructure);


(4)使能预装载寄存器

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);


(5)使能定时器

TIM_Cmd(TIM3,ENABLE);


这里还有一个重要的函数就是

void TIM_SetCompare2(TIM3xu16 CCRx_value); //之前在介绍CCRx寄存器的时候说过此函数是决定PWM占空比的函数;

关键字:STM32  定时器  输出比较 引用地址:STM32定时器输出比较(PWM)

上一篇:STM32处理器定时器分析(实现一个定时中断)
下一篇:STM32处理器输入捕获分析

推荐阅读最新更新时间:2024-11-16 23:36

STM32使用SWD连接报错总结
使用SWD通过J-Flash烧写STM32时,会出现各式各样的错误; 总结下原因: 1、复位脚被拉低了,这次我遇到的就是复位引脚的电容焊反了(钽电容),可以正常连接,但是烧写程序时会出现如下报错 – - Erasing affected sectors … - ERROR: RAM check failed @ address 0x20000000. - ERROR: Write: 0x03020100 07060504 - ERROR: Read: 0x00000000 00000000 - ERROR: (0 bytes of RAM have been checked successfully) - ER
[单片机]
STM32之DMA讲解及配置过程,附带代码说明
DMA涉及概念讲解: ①:DMA即Direct Memory Access(直接存储器存取),是STM32特有的外设。大容量STM32产品集成了两个DMA,分别是DMA1和DMA2,。其中DMA1有7个通道,DMA2有5个通道,具体每个通道连接的外设可以参考STM32芯片的数据手册。 ②:通过DMA可以将数据在两个不同的地址之间进行传递,如存储器到外设寄存器,外设寄存器到存储器,也可以从存储器到存储器之间。 ③:当两个数据在不同的地址之间传递时,需要在程序配置中确定每次传输的字节数,确定是字节、半字还是字。 ④:DMA的每个通道优先级是可变的。以DMA1为例,它有7个通道,可以配置每个通道的优先级为很高、高、中,低
[单片机]
STM32PWM输出实现LED灯渐亮渐灭
/* *说明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_tim.h #include stm32f10x_pwr.h #include stm32f10x_exti.h #include system_stm32f10x.h #include misc.h void R
[单片机]
stm32引脚速度GPIO_Speed的区别
一、 GPIO模式配置 1、输入/输出模式(参考stm32手册) 2、GPIO输出模式下,几种速度的区别: (1). GPIO 引脚速度: GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果信号频率为10MHz,而你配置了2MH
[单片机]
STM32 USART串口DMA 接收和发送的源码详解!
硬件平台:STM32F103ZET6; 开发环境:KEIL 4; 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。 串口DMA发送: 发送数据的流程: 前台程序中有数据要发送,则需要做如下几件事 1.在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。 2.将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道) 3.开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,D
[单片机]
STM32 GPIO使用超强总结
STM32GPIO使用 操作步骤: 1. 使能GPIO对应的外设时钟 例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC , ENABLE); 2. 声明一个GPIO_InitStructure结构体 例如: GPIO_InitTypeDef GPIO_InitStructure; 3. 选择待设置的GPIO管脚 例如://选择待设置的GPIO第7、8、9管脚位 ,中间加“|”符号 GPIO_InitStructure.GPIO_Pin = G
[单片机]
stm32寄存器之spi2读写sd卡
看完sd卡读写,我也忍不住自己试一试 使用spi1的时候,程序运行成功,但是当我尝试用spi2 的时候,一次一次的fail,现在总结发现本身错在这几个地方,其中也有一些地方是大家的普遍错误: 1,自己尝试硬件的时候,一定要把硬件先连接好,这个是基础保障,不能急 2,spi1 的时钟是接在APB2上,是72MHZ,而spi2的时钟是接在APB1上的,是36MHZ 所以从SPI1转移到SPI2时一定要注意分频的问题 3,在学习板上使用spi接口的时候,一定要禁用掉使用这个接口的其余模块,我自己的学习板上就是,nrf2401与vs1003都用了SPI2接口,我的是要禁用掉vs1003就可以,禁用方法就是把vs10
[单片机]
STM32 Keil下编程实现LED灯点亮与闪烁
前言 基于STM32F10C8T6在Keil下编程实现LED灯点亮与闪烁 一、原理图 1.STM32F103C8T6 STM32F103C8T6是ST在2007年发布的一款MCU,截止目前ST已经发布了速度高达400MHz的STM32H7。三点好处,一是封装比较大,方便初学者焊接,二是价格低廉,学习成本比较低,三是网上有大量的资料供初学者学习使用。 2.LED2 LED2控制一个绿色通讯指示灯,管脚为PB3。 3.LED3 LED3控制8个小灯点亮,管脚为PC13。 二、Keil代码 1.Led.h 代码如下: #ifndef _LED_H_ #define _LED_H_ #include stm32f10x
[单片机]
<font color='red'>STM32</font> Keil下编程实现LED灯点亮与闪烁
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved