定时器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. 使用Google 官方的控件SwipeRefreshLayout实现下拉刷新功能
  2. 边缘计算云原生开源方案选型比较
  3. mysql mariadb并存_MariaDB与MySQL并存
  4. ERROR 1 (HY000): Can‘t create/write to file ‘/var/www/11.txt‘ (Errcode: 13)报错解决方案
  5. EveryEeek English(9.21)
  6. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
  7. Mysql配置参数常见问题
  8. 谷歌开源代码评审规范:好坏代码应该这样来判断
  9. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(6)——Training
  10. c#范型编程系列一(非原创)
  11. EXCEL等额本息还款计算器
  12. 【UNIX网络编程】|【07】SCTP协议探究
  13. Java提取域名或URL中的一级域名二级域名......
  14. Mapped Statements collection already contains value
  15. 百度脑图DesktopNaotu
  16. 404常见的几种错误原因
  17. 网络硬盘 excel服务器,Excel Server Tutorial
  18. 机械臂正运动学标准DH参数建立技巧
  19. 各种邮箱收发服务器地址及端口
  20. 常见图片格式jpg、jpeg、png、gif等之间的区别

热门文章

  1. Win7高级应用技巧
  2. docker安装nginx kong konga
  3. php开发的app商城,如何利用PHP语言开发手机APP
  4. 用python写个程序送给女朋友_用 Python 哄女朋友开心!你觉得可行嘛?
  5. 网店新规的误读与媒体的谎言
  6. jquery.qrcode.js
  7. 猿创征文 | 国产数据库之openGauss的单机主备部署及快速入门
  8. 有计算机学的大学,Brandeis有计算机专业排名经验揭秘精简篇
  9. 智慧(灯杆)路灯建设有可能会掀起城市革命,从而点亮新型智慧城市
  10. jquery-3.5.1.js net::ERR_ABORTED 404