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. Dive into Spring framework -- 搭建spring 源码的开发环境

    spring是一个类之间依赖的管理容器,大家都知道,但我们中很多人都仅仅停留在使用的层面,但spring本身具有极大的研究价值,所以在使用了几年spring之后,还是想深入的探究一下其根源.记录于此, ...

  2. jquery validate检验

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. Git常用命令和Git团队使用规范指南

    转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...

  4. phalcon: 项目地址/P(.*), 项目地址/Pbaidu 与 路由

    phalcon: 项目地址/P(.*) 与 路由 有一个项目地址:因客户渠道不同,带的参数也不相同.当时想到的是伪静态规则,但是发现自己没有那么强大.该走phalcon路由规则,地址如下: www.x ...

  5. CSS3:@font-face规则

    前言 过去,Web设计师为了保证网站能够正常显示,只能使用“Web安全字体”,即每台机器都预装的字体.但Web安全字体有时并不好看... @font-face能够使得任何一台机器能够显示理想中的字体. ...

  6. GoRails教程自建Rails 的 API; gem 'jbuilder'简单用法;使用JWT进行验证(git上的实做);curl命令使用;status状态码;JWT文档翻译摘录;

    API: application programming interface 在Ruby中特指调用某个对象的信息,如hash的方法库library中的方法,参数,回传值等. 视频:如何用Rails 建 ...

  7. 2: 使用Prism初始化程序(纯汉语版)

    本篇内容讲解了Prism应用程序启动和运行都发生了什么.一个Pris应用程序在程序启动期间需要注册和配置——这被叫做引导应用程序.Prism引导过程包括创建和配置一个模块目录,创建一个例如Unity的 ...

  8. vue 侧边导航栏递归显示

    import axios from "axios"; import tabs1 from "../tab_content/tab1.vue"; import m ...

  9. log4cpp之Category

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  10. hystrix -hystrixCommand配置介绍

    public @interface HystrixCommand { // HystrixCommand 命令所属的组的名称:默认注解方法类的名称 String groupKey() default ...