想用定时器捕获脉宽长度,根据库函数捉摸了几天,代码如下
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "timer.h"
//extern u16 TIM4CH1_CAPTURE_VAL; //输入捕获值
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
TIM4_Cap_Init(0XFFFF,72); //以1Mhz的频率计数
}
void TIM4_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4 时钟使能
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<0;
GPIOB->CRL&=0XF0FFFFFF; //PB6 清除之前设置
GPIOB->CRL|=0X08000000; //PB6 输入
GPIOB->ODR|=1<<6; //PB6 上拉
TIM4->ARR=arr; //设定计数器自动重装值
TIM4-> SC=psc; //预分频器
TIM4->CR1&=~(1<<8);
TIM4->CR1&=~(1<<9); //时钟分割CKD=00
TIM4->CR1&=~(1<<4); //计数器向上计数
TIM4->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM4->CCMR1&=~(1<<4); //IC1F=0000 配置输入滤波器 不滤波
TIM4->CCMR1&=~(1<<5);
TIM4->CCMR1&=~(1<<6);
TIM4->CCMR1&=~(1<<7);
TIM4->CCMR1&=~(1<<2); //IC1PS=00 配置输入分频,不分频
TIM4->CCMR1&=~(1<<3);
TIM4->CCER|=1<<1; //CC1P=0 下降沿捕获
TIM4->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM4->DIER|=1<<1; //允许捕获中断
//TIM4->DIER|=1<<0; //允许更新中断
//TIM4->DIER|=1<<6; //使能中断
TIM4->CR1|=0x01; //使能定时器4
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占2,子优先级0,组2
}
u16 TIM4CH1_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM4_IRQHandler(void)
{
TIM4CH1_CAPTURE_VAL=TIM4->CCR1;
printf("TIM4CH1_CAPTURE_VAL = %d\r\n",TIM4CH1_CAPTURE_VAL);
TIM4->SR&=~(1<<1);//清除中断标志位
}
void SystemInit (void){}
结果打印出来的数据竟然是这样的
各位大侠有时间给看看,都要疯了,对照了手册上的14.3.5章节的“输入捕获模式”感觉寄存器设置没有什么错误,可为什么打印出来的结果会是这样。
|