OpenEdv-开源电子网

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

迫不得已再次求助原子:关于高级定时器输出多路不同频率的PWM问题

[复制链接]

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2012-9-3
在线时间
4 小时
发表于 2013-4-24 00:52:48 | 显示全部楼层 |阅读模式
记得之前问个原子相同的问题,本来也是想arr已经是固定的了,4个通道输出的频率只能一样了,但是还是得到原子提醒可以用输出比较的方法。于是找了相关配寄存器的资料。由于IO口紧张,不得不用高级定时器TIM1,配了两天没配出来,调试结果是频率改变不了而且周期很大,足有1s.  参考:(在网上找到原子之前与其他人讨论的方法,且已改正他最后回帖提出的错误   http://www.openedv.com/posts/list/2475.htm#13142)我是跟着他的方法配的,唯一不同的是高级定时器还要配 TIM1->BDTR|=0x8000; 这个寄存器,且已验证过他的结果可行,但我的就是配不出来。
这是我的配法:
void PWM_test(u16 psc)
 {         
   RCC->APB2ENR|=1<<11;       //TIM1时钟使能   
   RCC->APB2ENR|=1<<2;

   GPIOA->CRH&=0XFFFF0FF0;//PA8 11 输出  A8对应CH1,PA11对应CH4
   GPIOA->CRH|=0X0000B00B;//复用功能输出    
   GPIOA->ODR|=1<<11; //PA11,PA8上拉
   GPIOA->ODR|=1<<8;
  
   TIM1->ARR=0xffff;            //装满
   TIM1->SC=psc;           //预分频

   TIM1->CCR1=10;
   TIM1->CCR4=20;  
   
   TIM1->CCMR1|=3<<4;    //CH1 输出比较模式
   TIM1->CCMR2|=3<<12;  //CH4 输出比较模式
 
   TIM1->DIER|=1<<1; //CC1IE 允许捕获比较中断1
   TIM1->DIER|=1<<4; //CC4IE 允许捕获比较中断4
   
   TIM1->CCER|=1<<0;   //OC1 输出使能   CC1E=1
   TIM1->CCER|=1<<12;   //OC4 输出使能   CC4E=1

   TIM1->BDTR|=0x8000; 

   TIM1->CR1=0x8000;   //ARPE使能
   TIM1->CR1|=0x01;    //使能定时器1  
   
   MY_NVIC_Init(1,3,TIM1_CC_IRQChannel,2);//抢占1,子优先级3,组2        
}    


int main(void)
{   
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化 
PWM_test(719); //10K计数频率

while(1)
{
}
}

void TIM1_CC_Handler(void)
 {
   u16 cap;
   if(TIM1->SR&0X0002)  //查看CC1IF标记
      {
      cap=TIM1->CNT;
      TIM1->CCR1 = cap + 10; 
      }
if(TIM1->SR&0X0010)
 {
 cap=TIM1->CNT;
 TIM1->CCR4 = cap + 20;
 }
  TIM1->SR&=~(1<<1); //清标记位
  TIM1->SR&=~(1<<4);
}

原子莫烦躁,希望能耐心指点迷津。谢谢了~~~~~


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-24 13:09:46 | 显示全部楼层
回复【楼主位】Berlin:
---------------------------------
中断服务函数的名字写错了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2012-9-3
在线时间
4 小时
 楼主| 发表于 2013-4-24 13:47:13 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
比较输出中断不是这个吗?高级定时器有好几个中断服务函数。我看过好像是这个啊?
查了下,有这么几个:
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
应该是哪个?
打造完美
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-24 14:04:01 | 显示全部楼层
TIM1_CC_IRQHandler
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-24 14:04:12 | 显示全部楼层
你写成了:void TIM1_CC_Handler(void)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2012-9-3
在线时间
4 小时
 楼主| 发表于 2013-4-24 14:08:56 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
啊!!!低级错误啊!!谢谢原子哥了!一直这么耐心回答我们的问题,很难得。很喜欢这个论坛。
打造完美
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 22:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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