中级会员
 
- 积分
- 208
- 金钱
- 208
- 注册时间
- 2018-4-9
- 在线时间
- 111 小时
|

楼主 |
发表于 2018-12-18 10:21:09
|
显示全部楼层
[mw_shl_code=applescript,true]定时器5的初始化代码 、(参照例程改的) 还有初始化后的定时器5的寄存器值,希望大家能帮我找一找错误
#include "timer5.h"
#include "stdio.h"
#include "sys.h"
int TIMSRAM5[50000] __attribute__((at(0XCFF00000)));//测试用数组
u32 ts5=0;
int temp5=0;
//int TIMSRAM5[10000];
/***************************************************************************
****************************************************************************
下面是输入捕获相关源码实验相关函数源码
****************************************************************************
****************************************************************************/
TIM_HandleTypeDef TIM5_Handler; //定时器5句柄
//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{
TIM_IC_InitTypeDef TIM5_CH1Config;
GPIO_InitTypeDef GPIO_Initure;
TIM5_Handler.Instance=TIM5; //通用定时器5
TIM5_Handler.Init.Prescaler=psc; //分频
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM5_Handler.Init.Period=arr; //自动装载值
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
// HAL_TIM_IC_Init(&TIM5_Handler);
assert_param(IS_TIM_INSTANCE(TIM5_Handler->Instance));
assert_param(IS_TIM_COUNTER_MODE(TIM5_Handler->Init.CounterMode));
assert_param(IS_TIM_CLOCKDIVISION_DIV(TIM5_Handler->Init.ClockDivision));
if(TIM5_Handler.State == HAL_TIM_STATE_RESET)
{
TIM5_Handler.Lock = HAL_UNLOCKED;
__HAL_RCC_TIM5_CLK_ENABLE(); //使能TIM5时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_0 ; //PA0 PA1
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF2_TIM5 ; //PA0复用为TIM5通道1
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
HAL_NVIC_SetPriority(TIM5_IRQn,0,0); //设置中断优先级,抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(TIM5_IRQn); //开启ITM5中断
}
TIM5_Handler.State = HAL_TIM_STATE_BUSY;
TIM_Base_SetConfig(TIM5_Handler.Instance, &TIM5_Handler.Init);
TIM5_Handler.State= HAL_TIM_STATE_READY;
TIM5_CH1Config.ICPolarity=TIM_ICPOLARITY_RISING; //上升沿捕获
TIM5_CH1Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上
TIM5_CH1Config.ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_CH1Config.ICFilter=0; //配置输入滤波器,不滤波
HAL_TIM_IC_ConfigChannel(&TIM5_Handler,&TIM5_CH1Config,TIM_CHANNEL_1);//配置TIM5通道1
HAL_TIM_IC_Start_IT(&TIM5_Handler,TIM_CHANNEL_1); //开始捕获TIM5的通道1
__HAL_TIM_ENABLE_IT(&TIM5_Handler,TIM_IT_UPDATE); //使能更新中断
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u32 TIM5CH1_CAPTURE_VAL; //输入捕获值(TIM2/TIM5是32位)
//定时器5中断服务函数
void TIM5_IRQHandler(void)
{
//溢出中断
if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_UPDATE) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_UPDATE) !=RESET)
{
__HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_UPDATE);
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
}
}
//捕获更新
if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_CC1) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_CC1) !=RESET)
{
{
__HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_CC1);
TIM5_Handler.Channel = HAL_TIM_ACTIVE_CHANNEL_1;
if((TIM5_Handler.Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的捕获值.
if(TIM5CH1_CAPTURE_STA &0X80) //成功捕获到高电平
{
temp5=TIM5CH1_CAPTURE_VAL&0X3F;
temp5*=0xffffffff; //溢出时间总和
temp5+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间
TIMSRAM5[ts5]=temp5;
ts5++; //下一位
TIM5CH1_CAPTURE_STA=0; //开启下一次捕获
}
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
}else //还未开始,第一次捕获上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
__HAL_TIM_DISABLE(&TIM5_Handler); //关闭定时器5
__HAL_TIM_SET_COUNTER(&TIM5_Handler,0);
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获
__HAL_TIM_ENABLE(&TIM5_Handler);//使能定时器5
}
}
}
}
}
}
}
[/mw_shl_code]
|
|