定时器1作为主模式输出PWM,定时器4作为从模式

平台

STM32F407VGT6

特别记录两个问题:

移植通用定时器的程序 没有看手册 结果pwm移植无法输出 磨蹭了一两天
后来发现 是因为 高级定时器 有几个特殊的设置:

  • 重复计数设置:
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!
  • 输出使能:
TIM_CtrlPWMOutputs(TIM1, ENABLE);   //高级定时器一定要加上,主输出使能

当然 这是使用了库函数的 寄存器的具体设置是:

越过这两个鸿沟以后 就能正常使用高级定时器输出PWM了

进入正题 主从模式设置


上图显示的是F4的主从配置关系
我的程序是使用的TIM1作为master TIM4 作为slave
所以 使用的是table59的第三行的ITR0
具体程序是:

/***定时器1主模式***/
void TIM1_config(u32 Cycle)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                   //TIM1_CH4 PA11GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = Cycle-1;                                                   TIM_TimeBaseStructure.TIM_Prescaler =71;                    //设置用来作为TIMx时钟频率除数的预分频值                                                     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS= Tck_tim            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            //重复计数,一定要=0!!!TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                                       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;          //选择定时器模式:TIM脉冲宽度调制模式1       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = Cycle/2-1;                    //设置待装入捕获寄存器的脉冲值                                   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;      //输出极性       TIM_OC4Init(TIM1, &TIM_OCInitStructure);                                                         TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);                              TIM_ARRPreloadConfig(TIM1, ENABLE);
}
/***定时器4从模式***/
void TIM4_config(u32 PulseNum)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);TIM_TimeBaseStructure.TIM_Period = PulseNum-1;   TIM_TimeBaseStructure.TIM_Prescaler =0;    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);  TIM_SelectInputTrigger(TIM4, TIM_TS_ITR0);//TIM_InternalClockConfig(TIM4);TIM4->SMCR|=0x07;                                  //设置从模式寄存器 //TIM_ITRxExternalClockConfig(TIM4, TIM_TS_ITR0);//TIM_ARRPreloadConfig(TIM4, ENABLE);         TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
}
void Pulse_output(u32 Cycle,u32 PulseNum)
{TIM4_config(PulseNum);TIM_Cmd(TIM4, ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);TIM1_config(Cycle);TIM_Cmd(TIM1, ENABLE);TIM_CtrlPWMOutputs(TIM1, ENABLE);   //高级定时器一定要加上,主输出使能
}void TIM4_IRQHandler(void)
{ if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)     // TIM_IT_CC1{ TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除中断标志位 TIM_CtrlPWMOutputs(TIM1, DISABLE);  //主输出使能TIM_Cmd(TIM1, DISABLE); // 关闭定时器 TIM_Cmd(TIM4, DISABLE); // 关闭定时器 TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); }
}
#include "delay.h"
#include "sys.h"
#include "timer.h"int main(void){      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init();            //延时函数初始化    uart_init(115200);   //串口初始化为115200Pulse_output(1000,8000);//1KHZ,8000个脉冲while(1){}
}

效果

总结

输出一定数量PWM脉冲,
主要有几种方法:
1.单脉冲法,需要一个脉冲中断一次,中断次数多,影响效率,而且能保证每次的脉冲连续性么?
2.另一定时器进行中断计数,与1一样,需要频繁中断;
3.用主从定时器门控方式,比较繁琐 其实还好 就是有主从关系 需要看好
4.高级定时器T1、T8的重复计数方式,RCR计数中断,看手册好像这种方式最简单,能满足一部分人要求,缺点是寄存器只有8位,最多实现255个脉冲计数输出。只能设置0x00-0xFF

(((((((((((っ•ω•)っ Σ(σ`•ω•´)σ 起飞!

STM32主从模式 精确脉冲数PWM (已实现)相关推荐

  1. 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析

    前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调 ...

  2. stm32主从定时器pwm脉冲频率数量精确输出

    正常输出脉冲. 用 TIM3->ARR=5-1; //脉冲数 或 _HAL_TIM_SET_AUTORELOAD(&htim3,5-1)://脉冲数 主定时器tim2的ARR是脉冲频率, ...

  3. 定时器主从模式实现PWM脉冲个数、占空比以及频率可调(250kHz以下)

    GPIO配置: void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd( RCC_APB1 ...

  4. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  5. 利用stm32高级定时器的重复计数实现输出精确个数的pwm波

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 利用该配置完成输出精确数量的PWM波形,但是该值取值范围是[0, 255], 如果需要大于该数值的pw ...

  6. 基于STM32的MDK软件仿真输出PWM波形

    文章目录 一.PWM相关 1.PWM是什么 2.PWM原理 3.PWM应用 4.PWM信号输出 二.实验相关 1.实验要求 2.实验过程 (1)实验代码 (2)Keil仿真设置 (3)实验结果 三.总 ...

  7. Nginx+Keeplived双机热备(主从模式)

    Nginx+Keeplived双机热备(主从模式) 参考资料: http://www.cnblogs.com/kevingrace/p/6138185.html 双机高可用一般是通过虚拟IP(漂移IP ...

  8. 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论(转)...

    什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,因为那是俺生造的.  TTMP是啥意思呢?是Terminator Triggered Multi-Pattern 的 ...

  9. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

    Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备 ...

最新文章

  1. 聚类之K-means均值聚类
  2. Algorithm之PGM之BNet:贝叶斯网络BNet的相关论文、过程原理、关键步骤等相关配图
  3. 单元格内多个姓名拆分成一列_excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!...
  4. RHEL7 - 从命令行管理文件
  5. Docker(一)Centos7.0安装Docker
  6. 报表中表达式的全局集合(Visual Studio 报表设计器)
  7. java json解码器_Jackson:我是最牛掰的 Java JSON 解析器(有点虚)
  8. Django实现简单的用户添加、删除、修改等功能
  9. Linux中更新java代码命令,java代码执行linux命令
  10. android开发那些事儿(四)--调用系统相机像素过低
  11. 怎样把电脑换linux系统软件,如何将OS/2应用程序移植到Linux操作系统 -电脑资料...
  12. 华硕触摸板驱动ASUS PTP Driver安装失败解决办法
  13. birthday日期类型转化
  14. 专访清华裘捷中:亚洲高校首个KDD最佳博士论文奖是如何炼成的?
  15. HTML——前端实时可视化开发工具
  16. [WARNING]: Platform linux on host is using the discovered Python interpreter at /usr/bin/python, but
  17. JDK Oracle 官网下载地址
  18. TCP/IP协议卷一(一)
  19. android 音量调节框,「Best Volume Widget」手机桌面独立音量调节小工具 (Android)...
  20. 信息论与编码冯桂周林著答案_信息论与编码.冯桂 周林 冯桂、周林 9787302424277 清华大学出版社 信息论与编码.冯桂 周林 正版图书...

热门文章

  1. 实时最新中国省市区县geoJSON格式地图行政边界数据Echarts地图数据(可精确到街道级)
  2. 跨境电商业务之云号码
  3. 【jQuery】 # jQuery选择器
  4. 推荐系统-协同过滤算法简介简化版实例
  5. html js 去广告,畅言去广告:修改JS引用地址去掉畅言广告
  6. avr单片机c语言 右移,AVR左移右移递增减流水灯
  7. 日更100天(5)每天进步一点点
  8. 影响网站收录量有哪些因素
  9. Kafka自定义分区规则
  10. java缓存读写文件小例子