BUHUO.C
#include "buhuo.h"
#include "sys.h"
//定时器4通道2输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void tim42_cap_init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2;//使能定时器4时钟
RCC->APB2ENR|=1<<3;//使能PORTB时钟
GPIOB->CRL&=0X0FFFFFFF;//PB7清除之前设置
GPIOB->CRL|=0X80000000;//设置PB7为输入
GPIOB->ODR|=0<<7;//PB7下拉
TIM4->ARR=arr;//设定自动重装值
TIM4->
SC=psc;//预分频器值
TIM4->CCMR1|=1<<8;//IC2映射到TI2上
TIM4->CCMR1|=0<<12;//无滤波,以fDTS采样
TIM4->CCMR1|=0<<10;//无预分频
TIM4->CCER|=0<<5;//CC2P=0,高电平触发
TIM4->CCER|=1<<4;//CC2E=1,定时器4通道2捕获使能
TIM4->DIER|=1<<2;//CC2DE=1允许定时器4通道2捕获中断
TIM4->DIER|=1<<0;//允许更新中断
TIM4->CR1|=0X01;//使能定时器4
MY_NVIC_Init(1,1,TIM4_IRQChannel,2);//抢占1,子1,组2
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8 TIM4CH2_CAPTURE_STA=0; //输入捕获状态
u16 TIM4CH2_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM4_IRQHandler(void)
{
u16 tsr;
tsr=TIM4->SR;
if((TIM4CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(tsr&0X01)//溢出
{
if(TIM4CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM4CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH2_CAPTURE_VAL=0XFFFF;
}else TIM4CH2_CAPTURE_STA++;
}
}
if(tsr&0x04)//捕获1发生捕获事件
{
if(TIM4CH2_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM4CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM4CH2_CAPTURE_VAL=TIM4->CCR1; //获取当前的捕获值.
TIM4->CCER&=~(1<<5); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM4CH2_CAPTURE_STA=0; //清空
TIM4CH2_CAPTURE_VAL=0;
TIM4CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM4->CNT=0; //计数器清空
TIM4->CCER|=1<<5; //CC1P=1 设置为下降沿捕获
}
}
}
TIM4->SR=0;//清除中断标志位
}
主函数
#include "sys.h"
#include "delay.h"
#include "buhuo.h"
#include "usart.h"
#include "pwm.h"
//输入捕获实验,捕获pwm,看pwm波的变化
extern u8 TIM4CH2_CAPTURE_STA; //输入捕获状态
extern u16 TIM4CH2_CAPTURE_VAL; //输入捕获值
int main(void)
{
u32 temp=0;
Stm32_Clock_Init(9);//系统时钟设置72MHZ
uart_init(72,9600);//串口初始化时钟频率72MHZ,波特率9600
delay_init(72);//延时初始化,系统时钟72MHZ
pwm_init(719,999);//1000分频,PWM波频率72MHZ/720/1000=100hz
tim42_cap_init(0xffff,72-1);//定时器计数频率1MHZ
while(1)
{
delay_ms(10);
led0_pwm_val=360;
// led0_pwm_val++;
// if(led0_pwm_val==300)
// led0_pwm_val=0;
if(TIM4CH2_CAPTURE_STA&0x80)
{
temp=TIM4CH2_CAPTURE_STA&0X3F;
temp=temp*65536;
temp=temp+TIM4CH2_CAPTURE_VAL;
printf("HIGH:%d us\n",temp);
TIM4CH2_CAPTURE_STA=0;
}
}
}
用把PB7(定时器4通道2)通过按键接在VCC3.3V上,通过按键输入又可以正常显示,由于示波器已经说明PA7输出的PWM波没问题,就不粘出代码。看了很久没找到原因,也对着大板子的例程看了,找不到问题所在。
第二个问题
这个映射不同有什么作用,看着数据手册的那图也没给出什么介绍。