OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5467|回复: 3

stm32F103ZET6高级定时器程序问题

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-10-26
在线时间
3 小时
发表于 2020-12-29 10:56:55 | 显示全部楼层 |阅读模式
在stm32F103ZET6中如何写打开高级定时器1或8的程序?如何使用高级定时器1或8作为四个电机的pwm输出通道?
如何写高级定时器1或8的使能配置程序?
求各位大佬帮忙解决
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2020-11-21
在线时间
67 小时
发表于 2020-12-29 15:37:14 | 显示全部楼层
  1. #include "timer1.h"


  2. void TIM1_PWM_Init(u16 arr, u16 psc)
  3. {
  4.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  5.     TIM_OCInitTypeDef TIM_OCInitStructure;
  6.     GPIO_InitTypeDef GPIO_InitStructure;

  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //复用时钟

  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  14.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  15.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;                                //只有高级定时器需要设置,其他定时器可以不设置。
  16.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  17.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  18.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

  19.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  20.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  21.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  22.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB6
  23.     TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC2   PB7
  24.     TIM_OC3Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB8
  25.     TIM_OC4Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB9

  26.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  27.     TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  28.     TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  29.     TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);

  30.     TIM_Cmd(TIM1, ENABLE);
  31.     TIM_CtrlPWMOutputs(TIM1, ENABLE);                                                                        //高级定时器才有  必须打开
  32. }

  33. //PWM互补输出
  34. void TIM1_PWM_CHN_Init(u16 arr, u16 psc)
  35. {
  36.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  37.     TIM_OCInitTypeDef TIM_OCInitStructure;
  38.     GPIO_InitTypeDef GPIO_InitStructure;
  39.     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

  40.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  41.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); //复用时钟

  42.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  43.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  44.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  45.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  46.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  47.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  48.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  49.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  50.     //基本设置
  51.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  52.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  53.     TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;                                //只有高级定时器需要设置,其他定时器可以不设置。
  54.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  55.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  56.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

  57.     //死区设置   不设置的话 互补波形完全对称 死区时间为0
  58.     TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  59.     TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  60.     TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  61.     TIM_BDTRInitStructure.TIM_DeadTime = 0xff;
  62.     TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  63.     TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  64.     TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  65.     TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
  66.     //输出模式设置
  67.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  68.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  69.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  70.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  71.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  72.     //TIM_OCInitStructure.TIM_Pulse = i;   //设置比较寄存器值 调节占空比 此程序在主函数中直接用 TIM_SetCompare()方法设置
  73.        
  74.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB6
  75.     TIM_OC2Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC2   PB7
  76.     TIM_OC3Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB8
  77.     TIM_OC4Init(TIM1, &TIM_OCInitStructure);                                                        //TIM1_OC1   PB9

  78.         //使能自动重装载  直到产生更新事件才能更改设置
  79.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  80.     TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
  81.     TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  82.     TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
  83.    
  84.     TIM_ARRPreloadConfig(TIM1, ENABLE);
  85.     TIM_Cmd(TIM1, ENABLE);
  86.     TIM_CtrlPWMOutputs(TIM1, ENABLE);                                                                        //高级定时器才有  必须打开
  87. }

  88. int main(void)
  89. {
  90.     u16 i =450;

  91.     delay_init();

  92.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  93.     TIM1_PWM_Init(1000, 72);
  94.         //TIM1_PWM_CHN_Init(1000,72);
  95.     while(1)
  96.     {
  97.         i++;
  98.         if(i > 999)
  99.             i = 0;
  100.         TIM_SetCompare1(TIM1, i);
  101.                 TIM_SetCompare2(TIM1, i);
  102.                 TIM_SetCompare3(TIM1, i);
  103.                 TIM_SetCompare4(TIM1, i);
  104.         delay_ms(10);
  105.     }
  106. }


复制代码
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-10-17
在线时间
9 小时
发表于 2023-3-6 09:20:53 | 显示全部楼层
感谢大佬。这个结构体顺序还有要求
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-10-17
在线时间
9 小时
发表于 2023-3-6 09:21:20 | 显示全部楼层
定义结构体顺序注意,否则出BUG
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 15:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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