OpenEdv-开源电子网

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

求助...用比较输出模式输出PWM波,一直出不来波形,实在是看不出哪里错了,求前辈们助~~~

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-11
在线时间
3 小时
发表于 2016-4-11 22:04:46 | 显示全部楼层 |阅读模式
1金钱
附程序,用的是Mini开发板

[mw_shl_code=c,true]#include "stm32f10x_tim.h"  
#include "stm32f10x_gpio.h"  
#include "timer.h"
#include  <stm32f10x.h>  

unsigned int CCR3_Val=1;  //输出频率为50KHz
unsigned int capture1=0;   
void TIM2_Init(void)  
{  
  
        TIM_TimeBaseInitTypeDef  TIM2_TimeBaseStructure;  
        TIM_OCInitTypeDef  TIM2_OCInitStructure;  
        GPIO_InitTypeDef GPIO_InitStructure;  
        NVIC_InitTypeDef NVIC_InitStructure;  

       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //定时器2时钟使能  
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2的通道3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

  NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ;   //配置定时器中断   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure);

       
  TIM2_TimeBaseStructure.TIM_Prescaler = 719; //预分频器   
  TIM2_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数模式 TIM2_CR1[4]=0  
  TIM2_TimeBaseStructure.TIM_Period =0xffff;        //自动重装载寄存器            
  TIM2_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseStructure); //
   
  TIM2_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ; //TIM2_CCMR1[14:12]=011  翻转当TIM2_CCR2=TIM2_CNT时,翻转OC2REF的电平   
  TIM2_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性  低电平有效 TIM2_CCER[5]=1;  
  TIM2_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5  
  TIM2_OCInitStructure.TIM_Pulse =CCR3_Val;    //若CC1通道配置为输出:CCR2是装入当前捕获/比较2 TIM2_CCR2寄存器的值(预装载值)。  
  TIM_OC1Init(TIM2, &TIM2_OCInitStructure);  
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);  
   
                                                        
  TIM_Cmd(TIM2,ENABLE); //启动定时器3 TIM2_CR1[0]=1;
       
  TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE); //TIM2_DIER[2]=1  允许捕获/比较2中断  
}  


void TIM2_IRQHandler(void)  
{  
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)    //判断状态寄存器 TIM2_SR[2] 是否发生了捕获/比较2 中断  
  {  
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); //软件清除状态寄存器 TIM2_SR[2] 捕获/比较2 中断中断标志  
    capture1 = TIM_GetCapture1(TIM2); //获取TIM2_CCR2的预装值  
    TIM_SetCompare1(TIM2, capture1+ CCR3_Val); //和CCR2_Val累加后装入TIM2_CCR2 这是为了配合计数器值的递增。以在下一次作出比较。  
  }  
   
}

#include  "stm32f10x.h"  
#include  "stm32f10x_tim.h"  
#include  "misc.h"  

int main(void)  
{      
   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

  TIM2_Init(); //定时器的初始化  
  while(1);  
}  
[/mw_shl_code]



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-4-13 15:07:47 | 显示全部楼层
没听说定时器输出PWM波需要开中断的呀?原子大哥的历程里面应该有这个输出PWM波的程序
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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