OpenEdv-开源电子网

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

F407定时器 period(周期)为0,中断服务函数不执行

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2021-2-17
在线时间
1 小时
发表于 2021-6-3 08:45:51 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 qq807665216 于 2021-6-3 09:41 编辑

F407定时器 period(周期)为0,中断服务函数不执行。
  1. void TIM8_PWM_Init(u32 arr,u32 psc) // 定时器8初始化函数
  2. {                                                         
  3.         //此部分需手动修改IO口设置
  4.         
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  8.         NVIC_InitTypeDef NVIC_InitStructure;
  9.         
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);          //TIM8时钟使能   
  11.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);         //使能GPIOC时钟        
  12.         
  13.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8); //GPIOC6复用为定时器8 OC1
  14.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8); //GPIOC7复用为定时器8 OC2
  15.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM8); //GPIOC8复用为定时器8 OC3
  16.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM8); //GPIOC9复用为定时器8 OC4
  17.         
  18.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;           // GPIOC6/7/8/9
  19.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
  20.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
  21.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
  22.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
  23.         GPIO_Init(GPIOC,&GPIO_InitStructure);              //初始化PC6 7 8 9
  24.          
  25.         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
  26.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  27.         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
  28.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  29.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;          //重复计数器
  30.         
  31.         TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//初始化定时器8
  32.         
  33.         //初始化TIM8 Channel PWM模式         
  34.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
  35.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  36.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  37.         TIM_OCInitStructure.TIM_Pulse = 0;

  38.         TIM_OC1Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8
  39.         TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR1上的预装载寄存器
  40.         TIM_CtrlPWMOutputs(TIM8, ENABLE);
  41.         
  42.         TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8
  43.         TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR1上的预装载寄存器
  44.         TIM_CtrlPWMOutputs(TIM8, ENABLE);
  45.         
  46.         TIM_OC3Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8
  47.         TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR1上的预装载寄存器
  48.         TIM_CtrlPWMOutputs(TIM8, ENABLE);
  49.         
  50.         TIM_OC4Init(TIM8, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM8
  51.         TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM8在CCR1上的预装载寄存器
  52.         TIM_CtrlPWMOutputs(TIM8, ENABLE);
  53.         
  54.     TIM_ARRPreloadConfig(TIM8,ENABLE);     //ARPE使能
  55.         
  56.         
  57.         TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable);    //主从模式使能
  58.    TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);          //更新时间为触发输出        
  59.         TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE); //允许定时器8更新中断
  60.         
  61.         NVIC_InitStructure.NVIC_IRQChannel=TIM8_UP_TIM13_IRQn; //定时器8中断
  62.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x05; //抢占优先级5
  63.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //子优先级0
  64.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  65.         NVIC_Init(&NVIC_InitStructure);

  66.         TIM_Cmd(TIM8,ENABLE); //使能定时器8                                                         
  67. }  
复制代码
  1. void TIM4_config(u32 PulseNum)//定时器4初始化函数
  2. {
  3.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  6.     TIM_TimeBaseStructure.TIM_Period = PulseNum-1;             //定时器4的周期
  7.                 TIM_TimeBaseStructure.TIM_Prescaler =0;                    //预分频系数 (不分频)
  8.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;                 //
  9.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
  10.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);               //初始化TIM4

  11.         
  12.     TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);   //设置主从模式               
  13.     TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_External1);    //TIM_SlaveMode_External1:所选触发器(TRGI)时钟计数器的上升边缘
  14.     TIM_SelectInputTrigger(TIM4, TIM_TS_ITR3);         //选择输入触发器源
  15.     TIM_ITRxExternalClockConfig(TIM4,TIM_TS_ITR3);
  16.     TIM_ARRPreloadConfig(TIM4,DISABLE);
  17.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);            //使能TIM4的update中断
  18.         

  19.         
  20.     NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;              //选择定时器4中断
  21.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x05;  //抢占优先级为5
  22.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;          //响应优先级为0
  23.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能定时器4中断
  24.     NVIC_Init(&NVIC_InitStructure);                               //定时器4中断初始化

  25.     TIM_Cmd(TIM4,ENABLE); //使能定时器4                        
  26. }
复制代码
主要的功能是:TIM8作为主定时器 输出PWM波,TIM4作为从定时器为主定时器(TIM8)计数
使用的是FreeRTOS,在TIM4触发中断后,TIM4的中断服务函数发送二值信号量,任务接收到二值信号量对TIM8的ARR和CCR1寄存器、TIM4的ARR寄存器重新赋值
达到输出一定数量的PWM波的效果
问题:如果计数一个PWM波,需要将TIM4的ARR赋0(赋1的话是计算2个PWM波),如果将ARR赋0的话,TIM4的中断没有被执行

最佳答案

查看完整内容[请看2#楼]

朋友,平时是不是不看datasheet
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4734
金钱
4734
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-6-3 08:45:52 | 显示全部楼层
朋友,平时是不是不看datasheet
Capture.PNG
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-6-3 10:22:36 | 显示全部楼层
帮顶  
回复

使用道具 举报

4

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-11-12
在线时间
77 小时
发表于 2021-6-4 16:45:52 | 显示全部楼层
阿侑kevin 发表于 2021-6-4 15:22
朋友,平时是不是不看datasheet

这个叫use manual
话说period为0 计数器不工作这种事情,稍微思考一下都不用翻手册就能理解的。。。。
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4734
金钱
4734
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-6-6 08:44:30 | 显示全部楼层
nstopb 发表于 2021-6-4 16:45
这个叫use manual
话说period为0 计数器不工作这种事情,稍微思考一下都不用翻手册就能理解的。。。。

也会有人理解为填装0就不会自动重载,单次计数的意思
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 17:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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