初级会员

- 积分
- 133
- 金钱
- 133
- 注册时间
- 2014-10-27
- 在线时间
- 23 小时
|
5金钱
原子哥的教程里,pwm输出呼吸灯, 用wk_up做了输入捕获, 我想把pwm的输出PA8,直接用线连到PA0捕获输入TIM2_CH1, 串口打应出高平电的时间,
想想挺美的
但就实现不了呢? ,求大哥帮忙看看
#include "capture.h"
#include "led.h"
#include "sys.h"
void TIM1_PWM_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11;
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X0000000B;
TIM1->ARR=arr;
TIM1-> SC=psc;
TIM1->CCMR1|=7<<4;
TIM1->CCMR1|=1<<3;
TIM1->CCER|=1<<0;
TIM1->BDTR|=1<<15;
TIM1->CR1|=1<<7;
TIM1->CR1|=1<<0;
}
void TIM2_Cap_Init(u16 arr, u16 psc)
{
RCC->APB1ENR|=1<<0; //使能TIM2时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
TIM2->ARR=arr;
TIM2-> SC=psc;
TIM2->CCMR1|=1<<0; //CC1S=01 IC1映射到TI1上
TIM2->CCMR1|=0<<2; //IC1PSC=0 不分频
TIM2->CCMR1|=1<<4; //IC1F=0001 配置输入滤波器,Fsampling=Fck_int N=2两个事件后,产生一个输出跳变
TIM2->CCER|=1<<0; //允许捕获
TIM2->CCER|=0<<1; //上升沿捕获
TIM2->DIER|=1<<0; //使能更新中断
TIM2->DIER|=1<<1; //使能捕获中断
TIM2->CR1|=1<<0; //使能计数器
MY_NVIC_Init(2,2,TIM2_IRQn,2);
}
u8 TIM2CH1_CAPTURE_STA=0;
u16 TIM2CH1_CAPTURE_VAL;
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
if((TIM2CH1_CAPTURE_STA&0X80)==0)
{
if(tsr&0x01) //发生更新中断
{
if(TIM2CH1_CAPTURE_STA&0X40)
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)
{
TIM2CH1_CAPTURE_STA|=0X80;
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if(tsr&0x02) //发生捕获中断
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到上升沿
{
TIM2CH1_CAPTURE_VAL=TIM2->CCR1;
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获一次
TIM2->CCER|=~(1<<1); //设置上升沿捕获
}else
{
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA|=0X40; //标记上升沿
TIM2->CNT=0;
TIM2->CCER|=1<<1; //设置下降沿捕获
}
}
}
TIM2->SR=0;//清除中断标志位
}
#include "sys.h"
#include "capture.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
extern u8 TIM2CH1_CAPTURE_STA;
extern u16 TIM2CH1_CAPTURE_VAL;
int main(void)
{
u32 temp=0;
Stm32_Clock_Init(9);
uart_init(72,9600);
delay_init(72);
LED_Init();
TIM1_PWM_Init(7199,0);
TIM2_Cap_Init(0XFFFF,72-1);
while(1)
{
if(TIM2CH1_CAPTURE_STA&0X80)
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;
temp+=TIM2CH1_CAPTURE_VAL;
printf("HIGH:%d us \r\n",temp);
TIM2CH1_CAPTURE_STA=0;
}
}
}
程序和原子哥的是一样的
|
|