STM32除TIM6和TIM7外都可以产生PWM输出。高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出。

1.TIM1 CH1输出PWM配置步骤

①开启TIM1时钟,配置PA8为复用输出

  APB2外设时钟使能寄存器(RCC_APB2ENR)

  APB1外设复位寄存器 (RCC_APB1RSTR)

置1开启。清0关闭。

  Eg:RCC->APB2ENR|=1<<11;  //使能TIM1时钟

配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

  Eg:GPIOA->CRH&=0XFFFFFFF0;  //PA8清除之前的设置

     GPIOA->CRH|=0X0000000B;  //PA8复用功能输出

②设置TIM1的ARR和PSC

  自动重装载寄存器(TIMx_ARR)

  TIM1和TIM8预分频器(TIMx_PSC)

③设置TIM1_CH1的PWM模式及通道方向

  TIM1和TIM8捕获/比较模式寄存器1(TIMx_CCMR1)

输出比较模式

  

  Eg:TIM1->CCMR1|= 7<<4;  //CH1 PWM2模式

     TIM1->CCMR1|= 1<<3;  //CH1预装载使能

     CH1为输出,CC1S[1:0] 默认为00.

④使能TIM1的CH1输出,使能TIM1

设置TIM1_CCER来开启TIM1的通道1的输出。设置TIM1_CR1来开启TIM1的时钟。

  TIM1和TIM8捕获/比较使能寄存器(TIMx_CCER)

  Eg:TIM1->CCER|= 1<<3;  //OC1输出使能

  TIM1和TIM8控制寄存器1(TIMx_CR1)

ARPE:自动重装载预装载允许位  0:TIMx_ARR寄存器没有缓冲; 1:TIMx_ARR寄存器被装入缓冲器。

CEN:使能计数器  位0 0:禁止计数器; 1:使能计数器。

  Eg:TIM1->CR1=0x0080;  //ARPE使能

     TIM1->CR1|=0X01;  //使能定时器1

⑤设置MOE输出,使能PWM输出

  普通定时器在完成以上设置后可以输出PWM,但高级定时器要使能刹车和死区寄存器。

  TIM1和TIM8刹车和死区寄存器(TIMx_BDTR)

  Eg:TIM1->BDTR|=1<<15;  //MOE主输出使能

⑥修改TIM1_CCR1来控制占空比

  Eg:#define PWM_VAL TIM1->CCR1 (可以直接设置)

2.TIMx复用功能重印象

……

3.高级定时器TIM1输出PWM应用

 //timer.c
//TIM1_CH1 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB2ENR|=<<; //TIM1时钟使能
GPIOA->CRH&=0XFFFFFFF0; //PA8清除之前的设置
GPIOA->CRH|=0X0000000B; //复用功能输出 TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器设置 TIM1->CCMR1|=<<; //CH1 PWM2模式
TIM1->CCMR1|=<<; //CH1预装载使能
TIM1->CCER|=<<; //OC1 输出使能
TIM1->BDTR|=<<; //MOE 主输出使能 TIM1->CR1=0x0080; //ARPE使能
TIM1->CR1|=0x01; //使能定时器1
}
 //timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
//通过改变TIM1->CCR1的值来改变占空比,从而控制LED0的亮度
#define LED0_PWM_VAL TIM1->CCR1 void TIM1_PWM_Init(u16 arr,u16 psc);
#endif

4.普通定时器TIM2输出2路PWM 应用

 //TIM2_CH3~4 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM2_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=<<; //TIM2时钟使能
GPIOA->CRL&=0XFFFF00FF; //PA2-3清除之前的设置
GPIOA->CRL|=0X0000BB00; //复用功能输出 TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器设置 TIM2->CCMR2|=<<; //CH3 PWM2模式(输出)
TIM2->CCMR2|=<<; //CH3预装载使能
TIM2->CCER|=<<; //OC3 输出使能 TIM2->CCMR2|=<<; //CH4 PWM2模式(输出)
TIM2->CCMR2|=<<; //CH4预装载使能
TIM2->CCER|=<<; //OC4 输出使能 TIM2->CR1=0x0080; //ARPE使能
TIM2->CR1|=0x01; //使能定时器2
} //设定占空比 duty<899
//设置多少就是多少低的
void pwm_duty1(u16 duty)
{ TIM2->CCR3=duty;
} void pwm_duty2(u16 duty)
{
TIM2->CCR4=duty;
}

5.普通定时器TIM3输出2路PWM 应用

 //timer.c
//TIM3_CH1~2 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=<<; //TIM3时钟使能
GPIOA->CRL&=0X00FFFFFF; //PA6-7清除之前的设置
GPIOA->CRL|=0XBB000000; //复用功能输出 TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器设置 TIM3->CCMR1|=<<; //CH1 PWM2模式(输出)
TIM3->CCMR1|=<<; //CH1预装载使能
TIM3->CCER|=<<; //OC1 输出使能 TIM3->CCMR1|=<<; //CH2 PWM2模式(输出)
TIM3->CCMR1|=<<; //CH2预装载使能
TIM3->CCER|=<<; //OC2 输出使能 TIM3->CR1=0x0080; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
void pwm_duty3(u16 duty)
{ PWM3_PWM_VAL=duty;
} void pwm_duty4(u16 duty)
{
PWM4_PWM_VAL=duty;
} //timer.h
#define PWM3_PWM_VAL TIM3->CCR1
#define PWM4_PWM_VAL TIM3->CCR2

切记在主函数前添加输出化函数!

Eg:TIM2_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz

stm32寄存器版学习笔记05 PWM的更多相关文章

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  2. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  3. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  4. stm32寄存器版学习笔记08 DMA

    DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...

  5. stm32寄存器版学习笔记04 定时计数器中断

    STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...

  6. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  7. stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

    STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...

  8. stm32寄存器版学习笔记10 SPI

    SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...

  9. stm32寄存器版学习笔记09 IIC

    I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中 ...

随机推荐

  1. jQuery实际案例⑥——图片跟随鼠标、五角星评分案例

    一.图片跟随鼠标移动 1.要求:鼠标移动到哪,图片就要跟到哪 2.用到的事件:首先监听鼠标:$(document).mousemove(function(event){ }); //此时可以获取鼠标距 ...

  2. Unity与Web结合

    偶然在论坛上看到了一篇文章,觉的挺有意思,转载一下,之前做游戏,现在做前端,这篇文章不错..转载 Unity WebPlayer 写在前面 最近在做unity与web之间通讯的项目,在网上搜索了一些资 ...

  3. [Vue]组件——通过$emit为组件自定义事件

    1.在定义组件时调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件enlarge-text: Vue.component('blog-post', { props: ['post' ...

  4. Android和iOS中Cocos2dx的横屏竖屏设置

    一.横屏.竖屏设置 1.android AndroidManifest.xml文件中, screenOrientation="landscape" 为横屏, screenOrien ...

  5. FlexboxLayout——Android弹性布局

    FlexboxLayout是一个Android平台上与CSS的 Flexible box 弹性盒子布局模块 有相似功能的库.Flexbox 是CSS 的一种布局方案,可以简单.快捷的实现复杂布局. F ...

  6. CodeForces - 91B单调队列

    有一个数列,对于每一个数,求比它小的在他右边距离他最远的那个数和他的距离 用单调队列做,维护单调队列时可采用如下方法,对于每一个数,如果队列中没有数,则加入队列,如果队列头的数比当前数大,则舍弃该数 ...

  7. vue iview组件表格 render函数的使用

    如果要在标签中加入属性,例如img 中src属性 a标签中href属性 此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'c ...

  8. mongodb安装与权限配置

    mongodb下载地址:官方下载IDE工具:Robo 3T:官方下载 windows系统要求64位,最低2g内存,推荐8g内存及以上 安装过程没有需要配置的地方,直接下一步到结束,如果想要方便可以在环 ...

  9. Pytorch入门笔记

    import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): #nn. ...

  10. BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 思路 [斜率优化DP] 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i ...