void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭复用引脚的其它默认功能(JTDI调试) GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //因为定时器控制引脚,就时复用推挽(一般的是数据寄存器控制的)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 周期
TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //PSC 分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //固定占空比0-100
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure); //给结构体赋初始值,避免TIM由低到高不兼容(或者就把左右的参数都罗列并赋值)
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平有效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR 设置其值
TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);
}

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器   默认时0,开始后是1

参考资料

https://blog.csdn.net/m0_68997646/article/details/130509648

总结:ARR和CCR都有这个PreloadConfig功能,规定什么时候更新更新影子寄存器的值,为了同一时刻同时改变值,比如可以改变PWM频率而丝毫不影响其占空比

要与PSC的分频改变后影子寄存器自动进入下一个周期区分开(时序图)

通过输出比较,拿到PWM波形

常用函数

TIM_CtrlPWMOutputs()   在使用高级定时器时,调用这个函数使能主输出

用TIM_SetCompare1()该函数来配置CCR寄存器的值,通过与ARR数值关系,得到PWM输出占空比

通道与GPIO的关系

PSC分频  ARR周期

当需要一个频率为1000  占空比50%  分辨率为1%  带入计算即可   CK_PSC=72*10^6

引脚重映射提供更改一次的机会,但是重映射表里面没有的话就不能更改

使用引脚映射:TIM2_CH1可以从PA0重映射到PA15 (用到AFIO复用)

why?因为GPIO要经过AFIO到定时器再到NVIC才能实现

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //部分重映射 (上面两句一般情况下就够用了,若是遇到硬骨头,比如正好遇到又是调试端口的就需要下一句解除其身份)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭复用引脚的其它默认功能(JTDI调试)

再用AFIO将JTAG复用解除

定时器之PWM的更多相关文章

  1. cocos2d-x 真正的定时器之schedule

    转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8551066 正文: 1. 不调用update函数,调用自己的函数 其实原理是一样的, ...

  2. STM32f103 定时器之编码器接口模式

    背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...

  3. js定时器之setTimeout的使用

    之前用过定时器,只不过用的不是很多,关于js定时器,一般而言我们很容易想到setInterval和setTimeout这两种. 刚开始学js定时器时,记住了setInterval,该方法一般用于每隔多 ...

  4. 定时器之Quart.net(2)

    第一步:Install-Package Quartz namespace ProjectEdb { class Program { static void Main(string[] args) { ...

  5. 定时器之Quart.net(1)

    第一步:Install-Package Quartz namespace ProjectEdb { class Program { static void Main(string[] args) { ...

  6. 定时器之Timer

    Timer中的TimerTask就是一个线程,可以一直执行下去的.可以使用Timer类的cancel方法来结束.-------------------------------------------- ...

  7. Jmeter 定时器之同步定时器(Synchronizing Timer)

    性能测试中需要模拟多用户并发测试,此时需要用到同步定时器(Synchronizing Timer).如下图,模拟用户组的数量设置20,相当于20个用户(线程)并发 名词解释: 名称:定时器名称,可根据 ...

  8. STM32 定时器详细篇(基于HAL库)

    l  16位的向上.向下.向上/向下(中心对齐)计数模式,支持自动重装载 l  16位的预分频器 l  每个定时器都有多个独立通道,每个通道可用于 *  输入捕获 *  输出比较 *  PWM输出 * ...

  9. JS原生第五篇 (帅哥)

    1.1 节点 1. 节点        网页是有很多的节点组成的  . 元素节点   指的是 :  标签     li  span 文本节点      属性节点 父子兄弟    父    parent ...

  10. Cocos2d-x3.0游戏实例《不要救我》三——背景滚动周期

    好.让我们来解释一下这个无限循环滚动的背景.这方面的知识一直讲到烂.我以前的文章还介绍了.所以不是那么特别清楚. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www. ...

随机推荐

  1. 【1】windows系统如何安装后缀是whl的python库

    相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...

  2. 21.11 Python 使用CRC图片去重

    使用CRC32还可实现图片去重功能,如下FindRepeatFile函数,运行后通过对所有文件做crc校验并将校验值存储至CatalogueDict字典内,接着依次提取CRC特征值并将其存储至Cata ...

  3. 4.8 C++ Boost 应用JSON解析库

    property_tree 是 Boost 库中的一个头文件库,用于处理和解析基于 XML.Json 或者 INFO 格式的数据. property_tree 可以提供一个轻量级的.灵活的.基于二叉数 ...

  4. 将Windows系统设置为NTP服务器之NetTime

    之前写过一个将Windows系统设置NTP服务器的随笔,是通过修改Windows的注册表来实现NTP服务器,现在有个更简单的方式,安装一个小插件即可将Windows设置为NTP服务器. 插件 NetT ...

  5. 嫌 OSS 查询太慢?看我们如何将速度提升 10 倍!

    背景 HDFS 是 Hadoop 生态的默认存储系统,很多数据分析和管理工具都是基于它的 API 设计和实现的.但 HDFS 是为传统机房设计的,在云上维护 HDFS 一点也不轻松,需要投入不少人力进 ...

  6. setjmp/longjmp使用问题

    setjmp/longjmp开启编译优化后导致出现无法正常使用

  7. 微信小程序 Path2D 不支持 svg 路径的解决办法

    问题 开发一个微信小程序项目的时候需要用到Path2D这个对象,但是发现小程序的Path2D对象不支持实例化的时候直接传入'svg path',导致下面的代码运行的时候报错(浏览器中可运行) #其它代 ...

  8. [转载自jayant97] nRF9160与nRF Cloud 超详细入门攻略

    原文链接:nRF9160与nRF Cloud 超详细入门攻略 1. 产品简介 1.1. nRF Cloud ​ nRF Cloud是Nordic Semiconducotr公司在AWS上搭建的IoT平 ...

  9. MySQL基础之DCL语句

    DCL(Data Control Language)语句:数据控制语句. 用途:控制数据库.表.字段.用户的访问权限和安全级别. 常用关键字:grant.revoke等 一般用于管理数据库和用户的权限 ...

  10. wxPython 笔记

    安装 Win7 / Win10 直接通过 pip install wxpython 安装 Ubuntu18.04 / Ubuntu 20.04 在Linux下的安装会稍微麻烦, 可以参考官网上的说明  ...