PWM的基础知识我就不多说,主要说怎样用各个通用定时器去输出各个通道的pwm。

先说TIM2的·参考F103.的中文参考手册可以知到TIM2共有四种复用映像方式:没有重映像、部分重映像1、部分重映像2、完全重映像

'没有重映像'怎么写

void TIM2_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //使能定时器2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设

这部分没啥说的,然后就是 初始化它重映像对应的几个IO口

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3; //TIM_CH1 2 3 4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

之后就是初始化TIM2

 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

接着就是初始化它的通道 以及PWM模式(PWM1 CNT>CCRS时为低电平)

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIMX OCXTIM_OC1Init(TIM2, &TIM_OCInitStructure);TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC4Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

最后使能时钟

TIM_Cmd(TIM2, ENABLE);

这样的话主函数就可以直接调用

 int main(void){     u16 led0pwmval=3600;TIM2_PWM_Init(7200,49);    while(1){
TIM_SetCompare2(TIM2,led0pwmval);
TIM_SetCompare1(TIM2,led0pwmval);
TIM_SetCompare3(TIM2,led0pwmval);
TIM_SetCompare4(TIM2,led0pwmval);           }    }

之后改变各个通道的比较值就能输出相同周期不同占空比的pwm

部分重映像1

void TIM2_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //使能定时器3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

因为这个时候用到了映像这个时候我们就需要调用GPIO_PinRemapConfig()这个函数来设置它的映像模式

GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //Timer2部分重映射1  

这个就是TIM2的几种映像模式

在TIM2的部分映射1模式下参考第一张图 它的通道1到4对应的引脚为A15、B3、A2、A3接着就是初始化这几个IO口

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

剩余的跟‘没有重映像’代码一样

然后问题来了 你就会发现PB3和PA15它不能输出PWM波(PA2和PA3正常输出)

然后就一直找不到问题,正好这段时间在画VCT6(跟zet6和vet6我感觉它们都是一样的)的PCB就发现这两个引脚与JTAG有关

然后就在网上找发现这两个引脚不能直接用,需要

 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);   

这个函数去吧JTAG功能禁用,然后四个通道也都能输出PWM了。

(注:图中的映像模式为全映射)

其他映射模式以及其他的通用定时器输出pwm都跟以上的的写法是一样的。

基于stm32f103zet6(精英版)vct6 vet6的通用定时器(TIM2~TIM5)的pwm输出相关推荐

  1. STM32通用定时器输出带死区互补PWM/任意移相PWM

    项目上遇到了多个通道的带死区的互补功能,单纯靠H7的TIM1/TIM8/TIM15/TIM16/TIM17几个硬件自带的死区互补还不够,本文就使用通用定时器TIM2/TIM3/TIM4/TIM5来实现 ...

  2. STM32学习笔记 通用定时器TIM3~TIM5 13

    通用定时器TIM3~TIM5 TIM3~TIM5简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出 ...

  3. 【STM32】通用定时器(TIM2到TIM5)

    00. 目录 文章目录 00. 目录 01. 通用定时器简介 02. TIM2到TIM5主要特性 03. TIM2到TIM5功能说明 04. 时钟选择 05. 寄存器 5.1 TIMx 控制寄存器 1 ...

  4. 基于STM32的HAL库的倒立摆控制(一)PWM输出

    一 TIM初始化 首先初始化PWM引脚,在这里使用的是TIM4的ch3,设置PD14为复用输出,并连接到TIM4 GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitS ...

  5. 【正点原子STM32连载】第二十一章 通用定时器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. stm32关于通用定时器的周期、频率计算公式

    以下内容针对正点原子的定时器中断实验 定时器时基单元包含: ● 计数器寄存器(TIMx_CNT) ● 预分频器寄存器 (TIMx_PSC)--该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器 ...

  7. STM32学习笔记:通用定时器输出PWM

    脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...

  8. 基于STM32F103ZET6库函数PWM输出实验

    基于STM32F103ZET6库函数PWM输出实验 PWM 简介 硬件设计 软件设计 使 用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度. PWM 简介 ...

  9. STM32入门笔记(02):定时器之定时器中断、输入捕获和PWM输出(SPL库函数版)

    目录 定时器 8个定时器 定时器功能 定时器中断 常用通用定时器的寄存器 定时器中断实验目的: 定时器库函数及步骤 实验程序讲解 PWM 简介 STM32 PWM工作过程 PWM模式1 与 PWM模式 ...

最新文章

  1. js设置ajax执行顺序,2018-03-10fiddler替换js、js的ajax方法执行顺序
  2. was服务器里面jar包_was8.5.5.9项目部署失败,出现mybatis的jar包异常
  3. 取代浏览器插件调试,VS Code 整合 JS 调试工具
  4. python用于标识类方法的是_Python类的设计与使用
  5. 超难的75道逻辑思维题
  6. 【通信原理 入坑之路】—— 仔细聊聊关于“采样”的那点事儿
  7. 【MySQL】Mcafee审计插件
  8. 机器学习 数据预处理之特征编码(归纳整理版)
  9. Web前端html中通过CSS来设置div背景颜色透明度
  10. python模拟计算器程序代码_python作业:模拟计算器
  11. 在北京坐公交和大人流量地铁站换乘
  12. 斥资75元,我搭建了自己的博客网站
  13. 易信免费电话,确实业界良心
  14. java--表格的使用
  15. 极客学院mysql教程_干货分享 速成必备视频 六天带你玩转MySQL视频教程 数据库......
  16. MATLAB的强化学习工具箱(Reinforcement Learning Toolbox)使用细节注意
  17. 中国电信2019笔试题——求前后重叠的最长子字符串长度,基于java语言
  18. 关于智能产品设计的建议
  19. 使用canvas在一张图片上动态显示文字信息,并支持图片下载。
  20. excel表里分隔符替换为制表符的操作方法

热门文章

  1. 纵览数据库顶会VLDB 2019论文,我们发现了六大发展动向
  2. 存量电力系统_电力“十三五”:调整存量做优增量
  3. 龙尚海外市场又一强大新品Cat.12模组E7912,支持CBRS的无线网络频段
  4. 视频教程-ZStack 带你0基础搭建私有云平台|ZCCT实战培训视频|-云平台
  5. css圣杯模式的HTML代码,css圣杯布局是什么?
  6. 2019年猪年海报PSD模板-第七部分
  7. [附源码]JAVA+ssm计算机毕业设计超市销售管理系统(程序+Lw)
  8. linux使用docker制作PHP镜像及扩展Dockerfile
  9. 机器学习分类算法(二)-KNN(近邻)算法
  10. [PHB]FDN开启后手机仍然能够上网 - MTK物联网在线解答 - 技术论坛