移植与电子模块通信相关代码

This commit is contained in:
andy
2023-10-06 18:47:05 +08:00
parent bf440a35bc
commit 8e3a140bec
77 changed files with 13331 additions and 1168 deletions

View File

@@ -0,0 +1,365 @@
#include "base/define.h"
#include "timer_cfg.h"
#include "base/delay.h"
Timerupdatefunc p_timer4update_func = NULL;
/*
@brief 发送时钟校准波形
@param pre_us 发送的周期
@param count 发送周期的个数
*/
static volatile uint16_t amend_plus_count = 0;
TimerTriger p_timertriger = NULL;
void FireBus_ClkAmend(uint16_t pre_us,uint16_t trigger_us,uint16_t count,void *p_fun)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构
TIM_OCInitTypeDef TIM_OCInitStructure;//通道输出初始化结构
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE );
p_timertriger = (TimerTriger)p_fun;
amend_plus_count = count;
NVIC_DisableIRQ(TIM3_IRQn);
//TIM初始化
TIM_TimeBaseStructure.TIM_Period = pre_us-1; //周期0FFFF
TIM_TimeBaseStructure.TIM_Prescaler = 71 ; //时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分 1us
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化
//TIM3通道初始化
TIM_OCStructInit(& TIM_OCInitStructure); //默认参数
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //工作状态
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设定为输出需要PWM输出才需要这行代码
TIM_OCInitStructure.TIM_Pulse = pre_us-trigger_us - 1; //占空长度
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //高电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ClearFlag(TIM3,TIM_IT_CC1);
TIM_ITConfig(TIM3, TIM_IT_CC1 , ENABLE);//使能CC1中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_SetCompare3(TIM3,0);
TIM_Cmd(TIM3, ENABLE); //开启定时器
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 9;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //TIM2全局中断使能
NVIC_ClearPendingIRQ(TIM3_IRQn);
NVIC_Init(&NVIC_InitStructure);
}
/*
使用轮询的方式检测校准结束
*/
void FireBus_ClkAmendCycle(void)
{
//使用查询的方式,关闭中断
NVIC_DisableIRQ(TIM3_IRQn);
TIM_ITConfig(TIM3, TIM_IT_CC1 , DISABLE);//使能CC1中断
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
if(p_timertriger == NULL)
{
return;
}
__disable_irq();
while(1)
{
uint8_t flag = 0;
if( TIM_GetITStatus(TIM3,TIM_IT_Update))
{
if(amend_plus_count > 0)
amend_plus_count--;
flag = 1;
p_timertriger(flag);
TIM3->SR = 0;
}else if(TIM_GetITStatus(TIM3,TIM_IT_CC1))
{
flag = 2;
p_timertriger(flag);
TIM3->SR = 0;
}
if(amend_plus_count == 0)
{
flag = 3;
TIM_DeInit(TIM3);
p_timertriger(flag);
p_timertriger = NULL;
break;
}
}
__enable_irq();
}
void TIM3_IRQHandler()
{
uint8_t flag = 0;
rt_interrupt_enter();
if( TIM_GetITStatus(TIM3,TIM_IT_Update))
{
if(amend_plus_count > 0)
amend_plus_count--;
flag = 1;
}else if(TIM_GetITStatus(TIM3,TIM_IT_CC1))
{
flag = 2;
}
//timer_interrupt_flag_clear(TIMER2,TIMER_FLAG_UP|TIMER_FLAG_CH2|TIMER_FLAG_CH2O);
TIM3->SR = 0;
if(p_timertriger != NULL)
{
p_timertriger(flag);
}
if(amend_plus_count == 0)
{
flag = 3;
NVIC_DisableIRQ(TIM3_IRQn);
TIM_DeInit(TIM3);
p_timertriger(flag);
p_timertriger = NULL;
}
rt_interrupt_leave();
}
/*
@brief 超时定时器,单位10ms
@param ms 最大可设置6553。
@param pfunc 超时回调函数,注意回调函数中不能做长延时任务
*/
void RunTimeOut_Timer(uint16_t ms,Timerupdatefunc pfunc )
{
NVIC_InitTypeDef NVIC_InitStructure;
//定时器初始化数据结构定义
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE );
p_timer4update_func = pfunc;
ms = ms*2-1;
NVIC_DisableIRQ(TIM1_UP_IRQn);
//复位计数器
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period = ms; //计数上限100*100us = 10000us = 10ms
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;//2K; //预分频72MHz主频分频后时钟周期0.5ms
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
//初始化
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
//清中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
//定时器清零
TIM_SetCounter(TIM1,0);
TIM_ARRPreloadConfig(TIM1, DISABLE);
//定时器启动
TIM_Cmd(TIM1,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //TIM2全局中断使能
NVIC_ClearPendingIRQ(TIM1_UP_IRQn);
NVIC_Init(&NVIC_InitStructure);
}
//停止超时定时器计数
void RunTimeoutStop(void)
{
TIM_DeInit(TIM1);
}
//获取超时定时器计数值
uint16_t GetRunTimeOutCount(void)
{
return TIM1->CNT;
}
void TIM1_UP_IRQHandler()
{
// uint8_t flag = 0;
rt_interrupt_enter();
if(TIM_GetITStatus(TIM1,TIM_IT_Update))
{
if(p_timer4update_func != NULL)
{
TIM_Cmd(TIM1,DISABLE);
p_timer4update_func();
}
}
TIM1->SR = 0x00;
rt_interrupt_leave();
}
/*
延时定时器初始化,单次向上计数
*/
void DelayTimer_Init(void)
{
//定时器初始化数据结构定义
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //计数上限100*100us = 10000us = 10ms
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //预分频48,48MHz主频分频后时钟周期1us
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_ARRPreloadConfig(TIM2, DISABLE);
//初始化
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
StartDelayTime();
}
/*
延时定时器初始化,单次向上计数
*/
void TimerCount_Init(void)
{
//定时器初始化数据结构定义
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //计数上限100*100us = 10000us = 10ms
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //预分频48,48MHz主频分频后时钟周期1us
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_ARRPreloadConfig(TIM2, DISABLE);
//初始化
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
}
/*
@brief 重启延时定时器
*/
void StartDelayTime()
{
TIM_Cmd(TIM2,DISABLE);
TIM2->CNT = 0;
TIM2->PSC = (uint32_t)7200-1;//10K 0.1ms
TIM2->EGR |= TIM_EventSource_Update;
TIM2->SR = 0;
TIM_Cmd(TIM2,ENABLE);
}
/*
@brief 定时器是否运行到大于当前值
@param 当前比较值
*/
uint8_t isDelayEnd(uint16_t wait_time)
{
if((TIM2->CNT > wait_time) && (TIM2->SR > 0) )
return 0;
return 1;
}
/*
@breif 等待定时器计数值大于设定值
@param 等待定时器的结束值单位0.1ms
*/
void WaitDelayEnd(uint16_t wait_time)
{
while((TIM2->CNT < wait_time) && (TIM2->SR < 1))
{
}
}
/*
@brief 获取当前定时器计数值单位1us。并重启计数
@rtv 返回上次的计数值
*/
uint16_t Get1usCount(void)
{
uint16_t us_value ;
if(TIM2->SR > 0)
{
us_value = 65535;
}else{
us_value = TIM2->CNT;
}
TIM_Cmd(TIM2,DISABLE);
TIM2->CNT = 0;
TIM2->PSC = (uint32_t)71;//1M 1us
TIM2->EGR |= TIM_EventSource_Update;
TIM2->SR = 0;
TIM_Cmd(TIM2,ENABLE);
return us_value;
}
/*
@brief 获取当前定时器计数值单位10us。并重启计数
@rtv 返回上次的计数值
*/
uint16_t Get10usCount(void)
{
uint16_t us_value ;
if(TIM2->SR > 0)
{
us_value = 65535;
}else{
us_value = TIM2->CNT;
}
TIM_Cmd(TIM2,DISABLE);
TIM2->CNT = 0;
TIM2->PSC = (uint32_t)720-1;//100K 10us
TIM2->EGR |= TIM_EventSource_Update;
TIM2->SR = 0;
TIM_Cmd(TIM2,ENABLE);
return us_value;
}
/*
@brief 获取当前定时器计数值单位0.1ms。并重启计数
@rtv 返回上次的计数值
*/
uint16_t Get100usCount(void)
{
uint16_t us_value ;
if(TIM2->SR > 0)
{
us_value = 65535;
}else{
us_value = TIM2->CNT;
}
TIM_Cmd(TIM2,DISABLE);
TIM2->CNT = 0;
TIM2->PSC = (uint32_t)7200-1;//10K 100us
TIM2->EGR |= TIM_EventSource_Update;
TIM2->SR = 0;
TIM_Cmd(TIM2,ENABLE);
return us_value;
}
/*
@brief 直接获取定时器的值
*/
uint16_t GetCountTimerCnt()
{
return TIM2->CNT;
}