新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2021-3-8
- 在线时间
- 5 小时
|

楼主 |
发表于 2021-5-18 12:20:44
|
显示全部楼层
上面的图片好像没发出来,再以文字发一下我的错误版本
timer.c
#include "timer.h"
#include "delay.h"
#include "led.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器5 通道1
void TIM5_CAP_init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.0
GPIO_SetBits(GPIOA, GPIO_Pin_0);
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分割,Tdts
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; //设置分频,即几个上升沿触发一个捕获
TIM_ICInitStruct.TIM_ICFilter=0X00; //配置滤波器为不滤波
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit(TIM5, &TIM_ICInitStruct);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE);//允许更新/溢出中断,允许CC1IE捕获中断
TIM_Cmd(TIM5, ENABLE);
}
extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM5_IRQHandler(void) //TIM3中断
{
if ((TIM5CH1_CAPTURE_STA&0X80)==0) //未捕获成功
{
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//检查指定的TIM捕获中断发生与否
{
TIM5CH1_CAPTURE_STA|=0X40; //标志已经捕获到高电位
TIM5->CNT=0;
LED0=0;
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置CCER寄存器 开始捕获下降沿
}
if(TIM5CH1_CAPTURE_STA&0x40) //检查是否已经捕获了上升沿
{
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//检查指定的TIM下降沿捕获中断发生与否
{
TIM5CH1_CAPTURE_STA|=0X80;
TIM5CH1_CAPTURE_STA&=0XBF;
TIM5CH1_CAPTURE_VAL=TIM5->CNT;
LED0=1;
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置CCER寄存器
}
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //检查指定的TIM更新中断发生与否
{
TIM_ClearITPendingBit(TIM5, TIM_IT_Update ); //清除TIMx的中断待处理位
if((TIM5CH1_CAPTURE_STA&0x3F)!= 0x3F) //如果没有到达最大值
TIM5CH1_CAPTURE_STA++;
}
}
}
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "usart.h"
#include "timer.h"
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL=0; //输入捕获值
int main()
{
int t;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200); //串口初始化为115200
LED_init();
TIM5_CAP_init(0xFFFF, 72-1); //以1Mhz的频率计数
LED0=0;
LED1=0;
while(1)
{
delay_ms(10);//防抖
if(TIM5CH1_CAPTURE_STA&0x80)
{
t=TIM5CH1_CAPTURE_STA&0x3F;
t*=65536;
t+=TIM5CH1_CAPTURE_VAL;
t/=1e6;
printf("HIGH:%d us\r\n",t);//打印总的高电平时间
TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
}
}
}
|
|