OpenEdv-开源电子网

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

请原子哥帮助看一下,我这比较输出ppm那出错了。

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-16
在线时间
0 小时
发表于 2013-9-1 23:08:50 | 显示全部楼层 |阅读模式
我这比较输出ppm代码在软件仿真时没错,0.4ms负脉冲间隔的5个正脉冲周期是20ms。但是下载到开发板上运行差了70倍。计数脉冲没分频!不知那出错了。

#include "timer.h"
#include "led.h"

//定时器3中断服务程序  
u8 t=0;
void TIM3_IRQHandler(void)
    if(TIM3->SR&0X0004)//捕获/比较2 中断
{
   if(t==0){TIM3->CNT=0;
    TIM3->CCR2=400;}   //装比较输出值
   if(t==1)TIM3->CCR2=1900;   //H1  
   if(t==2)TIM3->CCR2=2300;    
   if(t==3)TIM3->CCR2=3800;   //H2  
   if(t==4)TIM3->CCR2=4200;     
   if(t==5)TIM3->CCR2=4700;   //H3  
   if(t==6)TIM3->CCR2=5100;    
   if(t==7)TIM3->CCR2=6600;   //H4  
   if(t==8)TIM3->CCR2=7000;     
   if(t==9)TIM3->CCR2=20000;      //20毫秒
     
   t++;
   if(t==10)t=0;       }   
TIM3->SR&=~(1<<2);//清除中断标志位 
}    

//通用定时器3中断初始化
void Timerx_Init(u16 arr,u16 psc)
{ RCC->APB1ENR|=1<<1;     //TIM3时钟使能 
GPIOA->CRL&=0X0FFFFFFF; //PA7输出
GPIOA->CRL|=0XB0000000; //复用功能输出  
GPIOA->ODR|=1<<7;       //PA7上拉
    
  TIM3->ARR=arr;  //设定计数器自动重装值: 最大值 
TIM3->SC=psc;  //预分频器72-1,得到10Mhz的计数时钟
               //这两个东东要同时设置才可以使用中断

TIM3->CCMR1|=3<<12;    //CH2 翻转模式  
TIM3->CCR2=2000;    //装比较输出值,上电后第一个正脉冲
TIM3->CCER|=3<<4;      //OC2 输出使能、输出极性
TIM3->DIER|=1<<2;   //允许捕获/比较2中断  CCxIE
     
TIM3->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  
}

 
 void Capture_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<0;       //  
RCC->APB1ENR|=1<<0;       //TIM2 时钟使能 
RCC->APB2ENR|=1<<2;       //使能PORTA时钟 
  
  TIM2->ARR=arr;  //设定计数器自动重装值  
TIM2->SC=psc;  //预分频器, 1MHz

GPIOA->CRL&=0XFFFFFFF0;  //PA0  
GPIOA->CRL|=0X00000004;  //复用功能输入    
GPIOA->ODR|=1<<0;        //PA0 上拉
 
TIM2->SMCR|=0x00D4; //MSM=1 主/从,TS=101 触发选择,SMS=100 复位模式

TIM2->CCMR1|=1<<0; //CC1S=01   选择输入端  
TIM2->CCMR1|=3<<4; //IC1F=0011 配置输入滤波器
TIM2->CCER|=0<<1;  //CC1P=0 选择有效转换边沿  上升沿有效
TIM2->CCMR1|=0<<2; //IC1PS=00  配置输入分频 
TIM2->CCER|=1<<0;  //CC1E=1    允许捕获计数器的值到捕获寄存器中

TIM2->CCMR1|=2<<8;//CC2S=10 选择输入端 
TIM2->CCER|=1<<5; //CC2P=1 选择有交转换边沿 下降沿有效
TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中

TIM2->DIER|=1<<1;   //允许更新捕获中断
  
TIM2->CR1|=0x01;    //使能定时器2
  MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2  
}



//定时器2中断服务程序  
u8 n=0;
u16 ppm_d_a[50],ppm_d_b[50];
void TIM2_IRQHandler(void)
{          
   if(n<50){ 
 ppm_d_a[n]= TIM2->CCR1;//读取CCR1也可以清CC1IF标志位
 ppm_d_b[n]= TIM2->CCR2;//读取CCR1也可以清CC2IF标志位
      n=n++;
      }
          
TIM2->SR&=~(1<<1);//清除中断标志位    
}





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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-1 23:48:06 | 显示全部楼层
建议在TIM3的中断服务函数里面,放个LED翻转的操作,测试下中断时间是否符合预期。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-16
在线时间
0 小时
 楼主| 发表于 2013-9-2 08:43:28 | 显示全部楼层
非常感谢原子哥,您的服务真是太好了!能买到这样及时地服务真太值了。我按您的指导该了一下,还是不行。是不是可以让它溢出一次,我再试试。
另外,JLink仿真不干活了,不知那出毛病了,提示如下:



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-16
在线时间
0 小时
 楼主| 发表于 2013-9-2 11:23:42 | 显示全部楼层
加了LED翻转后LED长亮,看不出什么.













用3.8时出现这提示,用4.7时没问题.











回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-2 15:10:08 | 显示全部楼层
LED的翻转代码,请加入到if判断里面,不要加在最外面。
另外,MDK4.70A可以下载,MDK3.80A不能,说明你的JTAG固件更新了,导致SWD不支持MDK3.80A下载了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-16
在线时间
0 小时
 楼主| 发表于 2013-9-2 21:48:59 | 显示全部楼层
谢谢原子哥! 我改了下代码: 用TIM1 作预分频,这样ppm脉冲周期就对了。但还没明白前面的错在那。
另外,我想请教一下:我想用mini板作目标板,要用SD卡、液晶、2401、串口1 和pa0、pa7。定时器用1、2、3 。请问端口及资源是否有冲突?

//通用定时器1、3主从模式初始化
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;      //TIM3时钟使能 
        RCC->APB2ENR|=1<<11;    //TIM1时钟使能 
GPIOA->CRL&=0X0FFFFFFF;  //PA7输出
GPIOA->CRL|=0XB0000000; //复用功能输出  
GPIOA->ODR|=1<<7;         //PA7上拉
    
  TIM3->ARR=arr;  //设定计数器自动重装值: 最大值 
TIM3->SC=psc;  //预分频器0,得到1Mhz的计数时钟
               //这两个东东要同时设置才可以使用中断

TIM3->CCMR1|=3<<12;    //CH2 翻转模式  
TIM3->CCR2=2000;   //装比较输出值,上电后第一个正脉冲
TIM3->CCER|=3<<4;      //OC2 输出使能、输出极性
TIM3->DIER|=1<<2;   //允许捕获/比较2中断  CCxIE
   
TIM1->CR1|=0x80;    //自动重装载允许    
TIM1->CR2|=0x20;    //定时器1为主模式 MMS=’010’
TIM1->ARR = 71;
TIM3->SMCR |=0x07; //定时器3为从模式 TS=’000’ SMS=111 

        TIM1->CR1|=0x01;    //使能定时器1
TIM3->CR1|=0x01;    //使能定时器3
  MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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