找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3798|回复: 4
收起左侧

基于STM32F103RCT6的PWM输出程序 包括重映射、不需重映射的

[复制链接]
ID:481097 发表于 2019-2-26 17:43 | 显示全部楼层 |阅读模式
包括重映射、不需重映射的PWM输出

单片机源程序如下:
  1. #include "pwm.h"
  2. #include "led.h"

  3. //PWM输出初始化
  4. //arr:自动重装值
  5. //psc:时钟预分频数
  6. void TIM1_1PWM_Init(u16 arr,u16 psc)
  7. {  
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  10.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 使能TIM1时钟
  12.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  13.                                                                                     

  14.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  19.         
  20.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  21.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  23.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  24.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  25.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  26.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  27.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  28.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  29.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  30.   TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  31.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  32.         
  33.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  34.         
  35.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1

  36.    
  37. }

  38. void TIM1_2PWM_Init(u16 arr,u16 psc)
  39. {  
  40.         GPIO_InitTypeDef GPIO_InitStructure;
  41.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  42.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  43.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 使能TIM1时钟
  44.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  45.                                                                                     

  46.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  47.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH1
  48.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  49.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  51.         
  52.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  53.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  54.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  55.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  56.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  57.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  58.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  59.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  60.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  61.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  62.   TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  63.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  64.         
  65.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  66.         
  67.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1

  68.    
  69. }

  70. void TIM1_3PWM_Init(u16 arr,u16 psc)
  71. {  
  72.         GPIO_InitTypeDef GPIO_InitStructure;
  73.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  74.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  75.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 使能TIM1时钟
  76.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  77.                                                                                     

  78.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  79.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM_CH1
  80.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  81.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  82.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  83.         
  84.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  85.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  86.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  87.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  88.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  89.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  90.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  91.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  92.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  93.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  94.   TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  95.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  96.         
  97.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  98.         
  99.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1

  100.    
  101. }




  102. void TIM1_4PWM_Init(u16 arr,u16 psc)
  103. {  
  104.         GPIO_InitTypeDef GPIO_InitStructure;
  105.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  106.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  107.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 使能TIM1时钟
  108.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
  109.                                                                                     

  110.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  111.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM_CH4
  112.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  113.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  114.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  115.         
  116.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  117.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  118.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  119.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  120.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  121.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  122.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  123.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  124.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  125.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  126.   TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能        

  127.         TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能         
  128.         
  129.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
  130.         
  131.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1

  132.    
  133. }


  134. void TIM8_1PWM_Init(u16 arr,u16 psc)
  135. {  
  136.         GPIO_InitTypeDef GPIO_InitStructure;
  137.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  138.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  139.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 使能TIM8时钟
  140.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  141.                                                                                     

  142.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  143.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
  144.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  145.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  146.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  147.         
  148.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  149.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  150.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  151.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  152.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  153.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  154.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  155.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  156.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  157.         TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  158.   TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能        

  159.         TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能         
  160.         
  161.         TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
  162.         
  163.         TIM_Cmd(TIM8, ENABLE);  //使能TIM1

  164.    
  165. }

  166. void TIM8_2PWM_Init(u16 arr,u16 psc)
  167. {  
  168.         GPIO_InitTypeDef GPIO_InitStructure;
  169.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  170.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  171.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 使能TIM8时钟
  172.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  173.                                                                                     

  174.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  175.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
  176.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  177.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  178.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  179.         
  180.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  181.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  182.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  183.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  184.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  185.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  186.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  187.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  188.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  189.         TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  190.   TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能        

  191.         TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能         
  192.         
  193.         TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
  194.         
  195.         TIM_Cmd(TIM8, ENABLE);  //使能TIM1

  196.    
  197. }

  198. void TIM8_3PWM_Init(u16 arr,u16 psc)
  199. {  
  200.         GPIO_InitTypeDef GPIO_InitStructure;
  201.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  202.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  203.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 使能TIM8时钟
  204.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  205.                                                                                     

  206.    //设置该引脚为复用输出功能,输出TIM8 CH3的PWM脉冲波形
  207.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH3
  208.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  209.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  210.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  211.         
  212.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  213.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  214.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  215.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  216.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  217.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  218.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  219.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  220.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  221.         TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  222.   TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能        

  223.         TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能         
  224.         
  225.         TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
  226.         
  227.         TIM_Cmd(TIM8, ENABLE);  //使能TIM1

  228.    
  229. }

  230. void TIM8_4PWM_Init(u16 arr,u16 psc)
  231. {  
  232.         GPIO_InitTypeDef GPIO_InitStructure;
  233.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  234.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  235.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 使能TIM8时钟
  236.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  237.                                                                                     

  238.    //设置该引脚为复用输出功能,输出TIM8 CH3的PWM脉冲波形
  239.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH3
  240.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  241.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  242.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  243.         
  244.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  245.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  246.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  247.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  248.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  249.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  250.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  251.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  252.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  253.         TIM_OC4Init(TIM8, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  254.   TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE 主输出使能        

  255.         TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH1预装载使能         
  256.         
  257.         TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
  258.         
  259.         TIM_Cmd(TIM8, ENABLE);  //使能TIM1

  260.    
  261. }


  262. void TIM2_3PWM_Init(u16 arr,u16 psc)
  263. {  
  264.         GPIO_InitTypeDef GPIO_InitStructure;
  265.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  266.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  267.         

  268.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器2时钟
  269.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  270.         
  271.         GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); //Timer2部分重映射  TIM2_CH3->PB10  

  272.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.10
  273.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM_CH3
  274.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  275.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  276.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  277.    //初始化TIM2
  278.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  279.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  280.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  281.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  282.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  283.         
  284.         //初始化TIM2 Channel3 PWM模式         
  285.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  286.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  287.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  288.         TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC3

  289.         TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  290.         TIM_Cmd(TIM2, ENABLE);  //使能TIM3
  291.         

  292.    
  293. }

  294. void TIM2_4PWM_Init(u16 arr,u16 psc)
  295. {  
  296.         GPIO_InitTypeDef GPIO_InitStructure;
  297.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  298.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  299.         

  300.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能定时器2时钟
  301.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  302.         
  303.         GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); //Timer2部分重映射  TIM2_CH3->PB10  

  304.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.10
  305.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM_CH3
  306.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  307.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  308.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  309.    //初始化TIM2
  310.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  311.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  312.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  313.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  314.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  315.         
  316.         //初始化TIM2 Channel3 PWM模式         
  317.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  318.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  319.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  320.         TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC3

  321.         TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  322.         TIM_Cmd(TIM2, ENABLE);  //使能TIM3
  323.          
  324. }












  325. void TIM3_2PWM_Init(u16 arr,u16 psc)
  326. {
  327.         GPIO_InitTypeDef GPIO_InitStructure;
  328.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  329.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  330.         

  331.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  332.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  333.         
  334.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  335.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
  336.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  337.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  338.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  339.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  340.    //初始化TIM3
  341.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  342.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  343.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  344.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  345.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  346.         
  347.         //初始化TIM3 Channel2 PWM模式         
  348.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  349.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  350.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  351.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

  352.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  353.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  354.         

  355.         
  356.         
  357.         
  358.         
  359. }
复制代码
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "pwm.h"

  5. int main(void)
  6. {        
  7.         //u16 led0pwmval=0;   
  8.         //u8 dir=1;        
  9.         delay_init();                     //延时函数初始化         
  10.         LED_Init();                          //初始化与LED连接的硬件接口
  11.         TIM1_1PWM_Init(199,7199);
  12.         TIM1_2PWM_Init(49,719);
  13.          
  14.         TIM1_3PWM_Init(49,719);
  15.         TIM1_4PWM_Init(49,719);
  16.          
  17.         TIM8_1PWM_Init(1999,719);
  18.         TIM8_2PWM_Init(1999,719);
  19.          
  20.         TIM8_3PWM_Init(1999,719);
  21.         TIM8_4PWM_Init(1999,719);
  22.          
  23.         TIM2_3PWM_Init(1999,719);
  24.         TIM2_4PWM_Init(1999,719);
  25.         TIM3_2PWM_Init(1999,719);


  26.                            
  27.                 TIM_SetCompare1(TIM1,20);
  28.                 TIM_SetCompare2(TIM1,25);
  29.                
  30.                 TIM_SetCompare3(TIM1,25);               
  31.                 TIM_SetCompare4(TIM1,25);
  32.                
  33.                 TIM_SetCompare1(TIM8,1000);
  34.                 TIM_SetCompare2(TIM8,1000);
  35.                
  36.                 TIM_SetCompare3(TIM8,1000);
  37.                 TIM_SetCompare4(TIM8,1000);
  38.                
  39.                 TIM_SetCompare3(TIM2,1000);
  40.                 TIM_SetCompare4(TIM2,1000);
  41.                 TIM_SetCompare2(TIM3,1000);


  42.         }
复制代码


所有资料51hei提供下载:
PWM 11channel.7z (187.6 KB, 下载次数: 81)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:656750 发表于 2019-12-23 08:44 | 显示全部楼层
意思是RCT6所有能作为PWM输出的  都初始并且输出PWM了?
回复

使用道具 举报

ID:622206 发表于 2020-5-23 15:19 | 显示全部楼层
学习,谢谢分享
回复

使用道具 举报

ID:622206 发表于 2020-5-23 15:19 | 显示全部楼层
学习,谢谢分享,谢谢
回复

使用道具 举报

ID:291668 发表于 2023-3-2 14:17 | 显示全部楼层
辛苦了。码这么多!理解了最好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表