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总线在传送数据过程中 ...
随机推荐
- 05_MySQL常见函数_分组函数
# 分组函数/*功能: 统计,又称为聚合函数,统计函数,组函数 传入一组值,统计后得到一个值 分类: sum 求和,avg 平均值,max 最大值,min 最小值,count 计算个数 特点: 1. ...
- [postgreSql]postgreSql数据库、模式、表、函数的删除与创建
1.删除/新增数据库 DROP DATABASE "testDB"; CREATE DATABASE "testDB" WITH OWNER = t ...
- Go连接MySql数据库Error 1040: Too many connections错误解决
原文:https://my.oschina.net/waknow/blog/205654 摘要: 使用Go链接数据库时,由于连接释放不当会在一段时间以后产生too many connections的错 ...
- 关于 MongoDB 复制集
为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...
- Python 输出百分比的两种方式
Python 输出百分比的两种方式 注: 在python3环境下测试. 方式1:直接使用参数格式化:{:.2%} {:.2%}: 显示小数点后2位 显示小数点后2位: >>> pri ...
- 页面title加icon
把favicon.ico放入根目录下,在head中添加一下代码 <link rel="icon" type="image/x-icon" href=&qu ...
- Linux运维第二天:安装虚拟机软件及RHEL7.2 64位系统
第一步:安装虚拟机 一路默认就行啦(还是要改下安装路径,嘿嘿) 第二步:安装RHEL7.2 64位系统 1.新建一个虚拟机 典型和自定义随便选(最后都可以调的) 一般大婶都喜欢选自定义(自己可以设置的 ...
- fio使用
关于lat(I/O completion latency).clat(complete latency).slat(summit latency): lat is the total latency. ...
- day25 crm 权限管理 通用的增删改查框架
代码: https://github.com/liyongsan/git_class/tree/master/day25/LuffyCRM
- TCP/IP网路协议复习
1.OSI (Open System Interconnect Protocol) 开放互联协议,这是一个七层的计算机网络协议,包括:物理层.数据链路层.网络层.传输层.回话层.表示层.应用层. ...