中级会员
 
- 积分
- 441
- 金钱
- 441
- 注册时间
- 2018-7-9
- 在线时间
- 56 小时
|
3金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "key.h"
extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获状值
int main(void)
{
u32 temp=0;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
LED0=0;
LED1=0;
TIM3_PWM_Init(899,0);
TIM5_Cap_Init(0XFFFF,72-1);
while(1)
{
delay_ms(10);
TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1);
if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);
if(TIM5CH1_CAPTURE_STA&0x80)
{
temp=TIM5CH1_CAPTURE_STA&0X3F;
temp*=65536;
temp+=TIM5CH1_CAPTURE_VAL;
printf("HIGH:%d us\r\n",temp);
TIM5CH1_CAPTURE_STA=0;
}
}
}
/**
*****************下面注视的代码是通过调用库函数来实现IO控制的方法*****************************************
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉高,灭 等同LED1=1;
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
delay_ms(300); //延时300ms
}
}
#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM3_Int_Init(u16 arr,u16 psc) //通用定时器3中断初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //声明TIM3结构体指针
NVIC_InitTypeDef NVIC_InitStrue; //中断优先分组结构体指针
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动装载寄存器的周期值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //设置时钟频率的预分频值
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //设置计数方式为向上计数
TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //设置时钟分割
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); // 在stm32f10x_tim.h里面 初始化定时器3
TIM_ITConfig(TIM3,TIM_IT_Update |TIM_IT_Trigger,ENABLE); //使能更新中断
NVIC_InitStrue.NVIC_IRQChannel=TIM3_IRQn; //设置中断通道为TIM3
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=0; //设置抢占优先级为0
NVIC_InitStrue.NVIC_IRQChannelSubPriority=3; //设置响应优先级为3
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStrue); //初始化中断优先级
TIM_Cmd(TIM3,ENABLE); //使能定时器3
}
void TIM3_IRQHandler(void) //定时器中断服务程序 在启动文件startup_stm32f10x_hd.s里面
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //检测定时器3是否发生更新中断
{
LED1=!LED1;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清楚定时器3更新中断标志
}
}
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStrue; //声明GPIOB结构体指针
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //声明定时器结构体指针
TIM_OCInitTypeDef TIM_OCInitStrue; //声明定时器比较参数结果体指针
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能GPIOB AFIO时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_5; //设置GPIOB5
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; //设置输出模式推挽复用
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //输出速度为50hz
GPIO_Init(GPIOB,&GPIO_InitStrue); //初始化GPIOB5
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重载周期值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //设置预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //设置计数模式为向上计数
TIM_TimeBaseInitStrue.TIM_ClockDivision=0; //设置设置时钟分割
//TIM_TimeBaseInitStrue.TIM_RepetitionCounter=;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); //初始化定时器ARR/PSC
//初始化TIM3 Channel2 PWM模式
//TIM_OCInitStrue.TIM_OCIdleState=;
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
//输出极性:TIM输出比较极性高
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStrue.TIM_Pulse=0;
TIM_OC2Init(TIM3,&TIM_OCInitStrue); //根据T指定的参数初始化外设TIM3 OC2 //设置初始化比较参数
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM3,ENABLE); //使能定时器3
}
//定时器5捕获输入配置
TIM_ICInitTypeDef TIM5_ICInitStrue;
void TIM5_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStrue; //声明GPIO结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //声明定时器5结构体
//声明初始化定时器5输入捕获参数 结构体
NVIC_InitTypeDef NVIC_InitStrue; //声明中断优先级分组结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //使能定时器5
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能_GPIOA
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0; //设置为GPIOA0
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IPD; //设置为GPIO输入模式为下拉
//GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置为GPIOA0的传输速度为50 MHz
GPIO_Init(GPIOA,&GPIO_InitStrue); //初始化GPIOA端口
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置定时器5计数器自动装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //设置预分频值
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //设置计数器向上计数模式
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStrue); //初始化定时器5
TIM5_ICInitStrue.TIM_Channel=TIM_Channel_1; //设置定时器5的1通道,IC1映射到TI1
TIM5_ICInitStrue.TIM_ICPolarity=TIM_ICPolarity_Rising; //设置上升沿捕获方法
TIM5_ICInitStrue.TIM_ICSelection=TIM_ICSelection_DirectTI; //IC1映射到TI1
TIM5_ICInitStrue.TIM_ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频为不分频
TIM5_ICInitStrue.TIM_ICFilter=0x00; //配置输入滤波器 不滤波
TIM_ICInit(TIM5,&TIM5_ICInitStrue); //初始化定时器5输入捕获通道
NVIC_InitStrue.NVIC_IRQChannel=TIM5_IRQn; //设置中断通道为定时器5中断
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2; //设置抢占优先级为2
NVIC_InitStrue.NVIC_IRQChannelSubPriority=0; //设置响应优先级为0
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStrue); //设置中断分组
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE); //使能定时器5的允许更新中断和捕获中断
TIM_Cmd(TIM5,ENABLE); //使能定时器5
}
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
void TIM5_IRQHandle(void)
{
if((TIM5CH1_CAPTURE_STA&0x80)==0)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
if(TIM5CH1_CAPTURE_STA&0x40)
{
if((TIM5CH1_CAPTURE_STA&0x3F)==0X3F)
{
TIM5CH1_CAPTURE_STA|=0x80;
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)
{
if(TIM5CH1_CAPTURE_STA&0x40)
{
TIM5CH1_CAPTURE_STA|=0x80;
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
}else
{
TIM5CH1_CAPTURE_STA=0;
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_STA=0X40;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);
}
|
|