stm32寄存器版学习笔记05 PWM
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的更多相关文章
- stm32寄存器版学习笔记07 ADC
STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...
- stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)
STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...
- stm32寄存器版学习笔记03 外部中断
stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...
- stm32寄存器版学习笔记08 DMA
DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...
- stm32寄存器版学习笔记04 定时计数器中断
STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...
- stm32寄存器版学习笔记02 串口通信
stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...
- stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)
STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...
- stm32寄存器版学习笔记10 SPI
SPI(Serial Peripheral Interface),串行外围设备接口.SPI是一种高速的.全双工.同步的通信总线. SPI接口一般使用4条线通信: MISO 主设备数据输入,从设备数据输 ...
- stm32寄存器版学习笔记09 IIC
I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中 ...
随机推荐
- python 使用getopt 获取配置参数
在工程中特别是稍微大一点的项目基本上都会用到配置,就会涉及到配置文件的读取,配置参数的读取. 常用的解析配置文件的是configParser,解析命令行参数的则为getopt. getopt的参数可以 ...
- 生产消费模式:多线程读写队列ConcurrentQueue
需求:现需要将多个数据源的数据导入到目标数据库,这是一个经典的生产消费应用的例子. 直接上代码,看下实现: // 初始化列队缓冲区 队列大小为100 IDataCollection<List&l ...
- Thinkphp5 模块的自动生成
首先到根目录下的build.php文件中去 是这样子滴: 然后去public目录中的index.php中去添加代码 这样子: 然后运行项目 就搞定了. 是不是美滋滋! 在public 下index.p ...
- ”由于没有远程桌面授权服务器可以提供许可证,远程会话被中断“的解决方案
由于windows server 2012 R2 Datacenter 安装了 远程桌面角色,但是这个角色是120天免费的,需要购买授权的. 解决方案: 删除这个角色,就可以正常进行远程桌面连接了.但 ...
- ubuntu install vue , vue-cli , how to create project..
<<install node.js <<the n model is manage the node.js version npm install -g n n stable ...
- Jenkins搭建GitHub仓库
一.安装Jenkins 二.安装Git 三.注册GitHub账号 以上都很简单,网上资源丰富 四.新增GitHub远程仓库,连接到本地Git,这样就可以实现代码提交到GitHub中了 ----自行找资 ...
- 第八天 RHEL7.2 文件权限管理(第一部分)
一.文件的基本权限 文件有三种访问方式限制访问权限 第一种:文件所有者的访问权限 第二种:文件所有者同组的访问权限 第三种:其他人访问权限 当使用ls -l 或ll命令时,可查看此三种权限 在权限描述 ...
- python使用tkinter做界面之颜色
python使用tkinter做界面之颜色 from tkinter import *colors = '''#FFB6C1 LightPink 浅粉红#FFC0CB Pink 粉红#DC ...
- hdu4685
题解: 二分图匹配 对于每一个单身狗 见一个虚拟的人 然后就可以做了 代码: #include<cstdio> #include<cstring> #include<al ...
- 如何将Pcm格式的音频文件转换成Wave格式的文件
最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c++语言写的,也可以用java实现.当然java调用native函数要用到jni技 ...