你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 通用定时器的几种配置方式

[复制链接]
STMCU小助手 发布时间:2022-1-27 00:18
  1. //------------------------------------------------------------------------------
  2. // 1、普通定时使用

  3. #include"stm32f10x.h"
  4. #include"time.h"

  5. static Time_NVIC_Config( void )
  6. {
  7.   NVIC_InitTypeDef NVIC_InitStructure;
  8.   
  9.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  10.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  11.   NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
  12.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  13.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  14.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  15.   NVIC_Init( &NVIC_InitStructure );
  16. }

  17. static void Time_Config( void )
  18. {
  19.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  20.   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );
  21.   //TIM_DeInit(TIM2);
  22.   TIM_TimeBaseInitStructure.TIM_Prescaler = ( 10000 - 1 );      //时钟分频系数
  23.   TIM_TimeBaseInitStructure.TIM_Period = ( 7200 - 1 );       //自动重装寄存器
  24.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
  25.   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分割,这里不涉及
  26. #if 0
  27.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter;
  28.     //This parameter is valid only for TIM1 and TIM8
  29. #endif
  30.   TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
  31.   TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
  32.   TIM_ITConfig( TIMx, TIM_IT_Update, ENABLE );           //中断配置
  33.   TIM_Cmd( TIMx, ENABLE );                //启动定时器
  34. }

  35. void Time_Init( void )
  36. {
  37.   Time_Config( );       //定时器配置
  38.   Time_NVIC_Config( );      //嵌套中断向量初始化
  39. }

  40. //------------------------------------------------------------------------------
  41. // 2、PWM输出

  42. #include"stm32f10x.h"
  43. #include"time.h"

  44. #if 1

  45. static Time_NVIC_Config( void )
  46. {
  47.   NVIC_InitTypeDef NVIC_InitStructure;
  48.   
  49.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  50.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  51.   NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
  52.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  53.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  54.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  55.   NVIC_Init( &NVIC_InitStructure );
  56. }
  57. #endif

  58. void Time_OUT_PWM_GPIO_Config( void )
  59. {
  60.   GPIO_InitTypeDef GPIO_InitStructure;
  61.   RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
  62.   GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
  63.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               //复用推免式输出
  64.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  65.   GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
  66. }

  67. static void Time_OUT_PWM_Config( void )
  68. {
  69.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  70.   TIM_OCInitTypeDef TIM_OCInitStructure;
  71.   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
  72.   TIM_DeInit( TIM2 );
  73.   
  74.   TIM_TimeBaseInitStructure.TIM_Prescaler = ( 100 - 1 );      //时钟分频系数
  75.   TIM_TimeBaseInitStructure.TIM_Period = ( 1000 - 1 ); //自动重装寄存器    PWM频率:72M/100/1000=720Hz
  76.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
  77.   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
  78. #ifdef Time1
  79.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
  80. #endif
  81.   TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
  82.   TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
  83.    
  84.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式  OCx电平根据ARR与CCRx比较结果发生反转
  85.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道1
  86. #ifdef Time1
  87.     TIM_OCInitStructure.TIM_OutputNState =;
  88. #endif
  89.   TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;         //占空比800/1000
  90.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //计数器值小于CCR值时输出高电平
  91. #ifdef Time1
  92.     TIM_OCInitStructure.TIM_OCNPolarity =;
  93.     TIM_OCInitStructure.TIM_OCIdleState =;
  94.     TIM_OCInitStructure.TIM_OCNIdleState =;
  95. #endif
  96.   
  97.   TIM_OC1Init( TIMx, &TIM_OCInitStructure );
  98.   TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable );         //使能CCR1预装载
  99.    
  100.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道2
  101.   TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
  102.   
  103.   TIM_OC2Init( TIMx, &TIM_OCInitStructure );
  104.   TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable );
  105.   
  106.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道3
  107.   TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
  108.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  109.   
  110.   TIM_OC3Init( TIMx, &TIM_OCInitStructure );
  111.   TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable );
  112.   
  113.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道4
  114.   TIM_OCInitStructure.TIM_Pulse = CCR4_VAL;
  115.   
  116.   TIM_OC4Init( TIMx, &TIM_OCInitStructure );
  117.   TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
  118.   TIM_ARRPreloadConfig( TIMx, ENABLE );            //开启ARR预装载
  119.   TIM_Cmd( TIMx, ENABLE );                //启动定时器
  120. }

  121. void Time_OUT_PWM_Init( void )
  122. {
  123.   Time_OUT_PWM_GPIO_Config( );
  124.   Time_OUT_PWM_Config( );       //定时器配置
  125. }

  126. //------------------------------------------------------------------------------
  127. //  3、输出比较模式

  128. #include"stm32f10x.h"
  129. #include"time.h"

  130. static Time_NVIC_Config( void )
  131. {
  132.   NVIC_InitTypeDef NVIC_InitStructure;
  133.   
  134.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  135.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  136.   NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
  137.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  138.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  139.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  140.   NVIC_Init( &NVIC_InitStructure );
  141. }

  142. static void Time_OUT_PWM_GPIO_Config( void )
  143. {
  144.   GPIO_InitTypeDef GPIO_InitStructure;
  145.   RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
  146.   GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
  147.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    //复用推免式输出
  148.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  149.   GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
  150. }

  151. static void Time_GPIO_Config( void )
  152. {
  153.   GPIO_InitTypeDef GPIO_InitStructure;
  154.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE );
  155.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  156.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //通用推免式输出
  157.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  158.   GPIO_Init( GPIOD, &GPIO_InitStructure );
  159. }

  160. static void Time_OUT_PWM_Config( void )
  161. {
  162.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  163.   TIM_OCInitTypeDef TIM_OCInitStructure;
  164.   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
  165.   TIM_DeInit( TIM2 );
  166.   
  167.   TIM_TimeBaseInitStructure.TIM_Prescaler = ( 100 - 1 );      //时钟分频系数
  168.   TIM_TimeBaseInitStructure.TIM_Period = ( 1000 - 1 ); //自动重装寄存器    PWM频率:72M/100/1000=720Hz
  169.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
  170.   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
  171. #ifdef Time1
  172.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
  173. #endif
  174.   TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
  175.   TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
  176.    
  177.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive;  //ARR与CCRx相同时强制OCxREF为低
  178.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道1
  179. #ifdef Time1
  180.     TIM_OCInitStructure.TIM_OutputNState =;
  181. #endif
  182.   TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;
  183.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OCx=!OCxREF    _High OCx=OCxREF
  184. #ifdef Time1
  185.     TIM_OCInitStructure.TIM_OCNPolarity =;
  186.     TIM_OCInitStructure.TIM_OCIdleState =;
  187.     TIM_OCInitStructure.TIM_OCNIdleState =;
  188. #endif
  189.   
  190.   TIM_OC1Init( TIMx, &TIM_OCInitStructure );
  191.   TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable );         //使能CCR1预装载
  192.   TIM_ITConfig( TIMx, TIM_IT_CC1, ENABLE );            //使能OC1比较中断
  193.    
  194.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;    //ARR与CCRx相同时强制OCxREF为高
  195.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道2
  196.   TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
  197.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OCx=!OCxREF    _High OCx=OCxREF     
  198.    
  199.   TIM_OC2Init( TIMx, &TIM_OCInitStructure );
  200.   TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable );
  201.   TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE );
  202.   
  203.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;    //ARR与CCRx比较结果对OCxREF无效
  204.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道3
  205.   TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
  206.   TIM_ITConfig( TIMx, TIM_IT_CC3, ENABLE );
  207.   
  208.   TIM_OC3Init( TIMx, &TIM_OCInitStructure );
  209.   TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable );
  210.   
  211.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //ARR与CCRx比较结果对OCxREF采用PWM1模式
  212.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //输出使能通道4
  213.   TIM_OCInitStructure.TIM_Pulse = CCR4_VAL;
  214.   //TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE);             //PWM就没有必要设置中断 当然也可以在中断里面改变占空比
  215.   TIM_OC4Init( TIMx, &TIM_OCInitStructure );
  216.   TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
  217.   TIM_ARRPreloadConfig( TIMx, ENABLE );            //开启ARR预装载
  218.   TIM_Cmd( TIMx, ENABLE );                //启动定时器
  219. }

  220. void Time_OUT_PWM_Init( void )
  221. {
  222.   Time_OUT_PWM_GPIO_Config( );
  223.   Time_GPIO_Config( );
  224.   Time_NVIC_Config( );
  225.   Time_OUT_PWM_Config( );       //定时器配置
  226. }

  227. //------------------------------------------------------------------------------
  228. // 4、PWMI模式
  229. #include"stm32f10x.h"
  230. #include"time.h"

  231. static Time_NVIC_Config( void )
  232. {
  233.   NVIC_InitTypeDef NVIC_InitStructure;
  234.   
  235.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  236.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  237.   NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
  238.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  239.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  240.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  241.   NVIC_Init( &NVIC_InitStructure );
  242. }

  243. static void Time_IN_PWM_GPIO_Config( void )
  244. {
  245.   GPIO_InitTypeDef GPIO_InitStructure;
  246.   RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
  247.   GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
  248.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;             //浮空输入模式
  249.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  250.   GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
  251. }

  252. static void Time_IN_PWM_Config( void )
  253. {
  254. #if 0
  255.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  256. #endif
  257.   TIM_ICInitTypeDef TIM_ICInitStructure;
  258.   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
  259.   TIM_DeInit( TIM2 );
  260. #if 0
  261.   
  262.   TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1);      //时钟分频系数
  263.   TIM_TimeBaseInitStructure.TIM_Period =(1000-1);//自动重装寄存器    PWM频率:72M/100/1000=720Hz
  264.   TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数模式
  265.   TIM_TimeBaseInitStructure.TIM_ClockDivision =0;//时钟分频,这里不涉及
  266. #ifdef Time1
  267.   TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
  268. #endif
  269.   TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);        //配置参数
  270.   TIM_ClearITPendingBit(TIMx,TIM_IT_Update);//清除中断标示位
  271. #endif
  272.   
  273.   TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  274.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
  275.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
  276.                                                                   // connected to IC1, IC2, IC3 or IC4, respectively */
  277.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //无预分频
  278.   TIM_ICInitStructure.TIM_ICFilter = 0x0;       //无滤波
  279.   TIM_ICInit( TIMx, &TIM_ICInitStructure );    //初始化PWM输入模式 //参见函数体与参考手册关于PWMI说明
  280.   TIM_PWMIConfig( TIMx, &TIM_ICInitStructure );
  281.   TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数
  282.    
  283.   TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Reset ); //选择从模式控制器为复位模式,选中的TRGI上升沿重新初始化计数器
  284.   //从模式控制器连接到TI1FP1 TI2FP2 只要两者有效为设置的电平,就会复位计数器 参见TIME结构图
  285.   
  286.   TIM_SelectMasterSlaveMode( TIMx, TIM_MasterSlaveMode_Enable ); //使能主从模式 ??????????????????
  287.    
  288.   TIM_Cmd( TIMx, ENABLE );
  289.   
  290.   TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE );
  291. }

  292. void Time_IN_PWM_Init( void )
  293. {
  294.   Time_IN_PWM_GPIO_Config( );
  295.   Time_NVIC_Config( );
  296.   Time_IN_PWM_Config( );       //定时器配置
  297. }

  298. //------------------------------------------------------------------------------
  299. // 5、单脉冲模式

  300. #include"stm32f10x.h"
  301. #include"time.h"

  302. static Time_NVIC_Config( void )
  303. {
  304.   NVIC_InitTypeDef NVIC_InitStructure;
  305.   
  306.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  307.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  308.   NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
  309.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  310.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  311.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  312.   NVIC_Init( &NVIC_InitStructure );
  313. }

  314. static Time_SinglePluse_IN_GPIO_Config( void )
  315. {
  316.   GPIO_InitTypeDef GPIO_InitStructure;
  317.   RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
  318.   GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
  319.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;             //浮空输入模式
  320.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  321.   GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
  322. }

  323. static Time_SinglePluse_OUT_GPIO_Config( void )
  324. {
  325.   GPIO_InitTypeDef GPIO_InitStructure;
  326.   RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
  327.   GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
  328.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     //推免复用输出
  329.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  330.   GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
  331. }

  332. static void Time_SinglePluse_Config( void )
  333. {
  334.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  335.   TIM_ICInitTypeDef TIM_ICInitStructure;
  336.   TIM_OCInitTypeDef TIM_OCInitStructure;
  337.   RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );        //开启时钟
  338.   TIM_DeInit( TIM2 );
  339.   
  340.   TIM_TimeBaseInitStructure.TIM_Prescaler = 1;              //时钟分频系数
  341.   TIM_TimeBaseInitStructure.TIM_Period = 65535;           //自动重装寄存器
  342.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
  343.   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
  344. #ifdef Time1
  345.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
  346. #endif
  347.   TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure );        //配置参数
  348.   TIM_ClearITPendingBit( TIMx, TIM_IT_Update );          //清除中断标示位
  349.    
  350.   TIM_ICStructInit( &TIM_ICInitStructure );
  351.   
  352.   TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;     //通道2为输入
  353.   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
  354.   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
  355.                                                                   // connected to IC1, IC2, IC3 or IC4, respectively*/
  356.   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //无预分频
  357.   TIM_ICInitStructure.TIM_ICFilter = 0x0;       //无滤波
  358.   TIM_ICInit( TIMx, &TIM_ICInitStructure );           //初始化输入模式
  359.   TIM_SelectOnePulseMode( TIMx, TIM_OPMode_Single ); //选择单脉冲模式  这样 下一次更新时间是停止计数器
  360.   TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数
  361.   TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Trigger ); //选择从模式控制器为触发模式 其连接到了TI2FP2  让从模式控制器启动计数器
  362.    
  363.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
  364.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     //使能通道
  365. #ifdef Time1
  366.     TIM_OCInitStructure.TIM_OutputNState =;
  367. #endif
  368.   TIM_OCInitStructure.TIM_Pulse = 12345;       //CCRx里面存放的值
  369.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //OCREF与OC实际输出相同
  370. #ifdef Time1
  371.     TIM_OCInitStructure.TIM_OCNPolarity =;
  372.     TIM_OCInitStructure.TIM_OCIdleState =;
  373.     TIM_OCInitStructure.TIM_OCNIdleState =;
  374. #endif
  375.   TIM_OC1Init( TIMx, &TIM_OCInitStructure );           //使用通道1作为单脉冲的输出通道
  376.    
  377.   //TIM_Cmd(TIMx, ENABLE);                //使用TI2FP1来触发定时器,不需要软件启动定时器  
  378. }

  379. void Time_SinglePluse_Init( void )
  380. {
  381.   Time_SinglePluse_IN_GPIO_Config( );   //配置time2的通道2为输入
  382.   Time_SinglePluse_OUT_GPIO_Config( );  //配置time2的通道1为输出
  383.   Time_NVIC_Config( );       //可以不用
  384.   Time_SinglePluse_Config( );     //定时器配置
  385. }

  386. //------------------------------------------------------------------------------
  387. // 6、定时器联级

  388. #include"stm32f10x.h"
  389. #include"time.h"

  390. static Time_NVIC_Config( void )
  391. {
  392.   NVIC_InitTypeDef NVIC_InitStructure;
  393.   
  394.   NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
  395.   NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
  396.   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  397.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  398.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  399.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  400.   NVIC_Init( &NVIC_InitStructure );
  401. }

  402. static Time_Connect_GPIO_Config( void )
  403. {
  404.   GPIO_InitTypeDef GPIO_InitStructure;
  405.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
  406.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6; //time2 ch1 pin.0 time3 cha1 pin.6
  407.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //推免复用输出
  408.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  409.   GPIO_Init( GPIOA, &GPIO_InitStructure );
  410.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;             //time4 ch1 pin.6   
  411.   GPIO_Init( GPIOB, &GPIO_InitStructure );
  412. }

  413. static void Time_Connect_Config( void )
  414. {
  415.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  416.   TIM_OCInitTypeDef TIM_OCInitStructure;
  417.   RCC_APB1PeriphClockCmd(
  418.     RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE );
  419.   TIM_DeInit( TIM2 );
  420.   TIM_DeInit( TIM3 );
  421.   TIM_DeInit( TIM4 );
  422.   
  423.   TIM_TimeBaseInitStructure.TIM_Prescaler = 0;              //时钟分频系数
  424.   TIM_TimeBaseInitStructure.TIM_Period = 99;           //自动重装寄存器
  425.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上计数模式
  426.   TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;         //时钟分频,这里不涉及
  427. #ifdef Time1                  //或者Time8
  428.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
  429. #endif
  430.   TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure );        //配置参数
  431.   TIM_ClearITPendingBit( TIM2, TIM_IT_Update );          //清除中断标示位
  432.    
  433.   TIM_TimeBaseInitStructure.TIM_Period = 5;
  434.   TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
  435.   TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
  436.   
  437.   TIM_TimeBaseInitStructure.TIM_Period = 5;
  438.   TIM_TimeBaseInit( TIM4, &TIM_TimeBaseInitStructure );
  439.   TIM_ClearITPendingBit( TIM4, TIM_IT_Update );
  440.   
  441.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
  442.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     //使能通道
  443.   TIM_OCInitStructure.TIM_Pulse = 49;           //CCRx里面存放的值
  444.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   //OCREF与OC实际输出相同
  445.   TIM_OC1Init( TIM2, &TIM_OCInitStructure );           //使用通道1作为单脉冲的输出通道
  446.   TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable );      //使能主从模式
  447.    
  448.   TIM_SelectOutputTrigger( TIM2, TIM_TRGOSource_Update );   //选择Time2的更新事件作为触发输出
  449.    
  450.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  451.   TIM_OCInitStructure.TIM_Pulse = 3;
  452.   
  453.   TIM_OC1Init( TIM3, &TIM_OCInitStructure );
  454.   TIM_OC1Init( TIM4, &TIM_OCInitStructure );
  455.   
  456.   TIM_SelectSlaveMode( TIM3, TIM_SlaveMode_Gated );         //从模式的输入触发选择为门控模式
  457.   TIM_SelectInputTrigger( TIM3, TIM_TS_ITR1 ); //从模式触发源选择为内部触发1?????????????为什么是内部触发1 不是0 2 3
  458.   //原因:ITR0 ITR1 ITR2 ITR3 对应主模式的TIM2 TIM3 TIM4 TIM5
  459.   
  460.   TIM_SelectSlaveMode( TIM4, TIM_SlaveMode_Gated );
  461.   TIM_SelectInputTrigger( TIM4, TIM_TS_ITR1 );
  462.   
  463.   TIM_Cmd( TIM2, ENABLE );
  464.   TIM_Cmd( TIM3, ENABLE );
  465.   TIM_Cmd( TIM4, ENABLE );
  466. }

  467. void Time_Connect_Init( void )
  468. {
  469.   Time_Connect_GPIO_Config( );
  470.   Time_NVIC_Config( );      //可以不用
  471.   Time_Connect_Config( );     //定时器配置
  472. }
复制代码


收藏 评论0 发布时间:2022-1-27 00:18

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版