我这比较输出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);//清除中断标志位
}
|