330 lines
8.2 KiB
C
330 lines
8.2 KiB
C
|
|
/**
|
|||
|
|
******************************************************************************
|
|||
|
|
* @file global.c
|
|||
|
|
* @author TMC Scan Team
|
|||
|
|
* @version V1.0.0
|
|||
|
|
* @date 09/12/2019
|
|||
|
|
* @brief
|
|||
|
|
******************************************************************************
|
|||
|
|
*
|
|||
|
|
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|||
|
|
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|||
|
|
* TIME. AS A RESULT, TMC SHALL NOT BE HELD LIABLE FOR ANY
|
|||
|
|
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|||
|
|
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|||
|
|
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|||
|
|
*
|
|||
|
|
* <h2><center>© COPYRIGHT 2016 TMC</center></h2>
|
|||
|
|
******************************************************************************
|
|||
|
|
**/
|
|||
|
|
|
|||
|
|
#include "global.h"
|
|||
|
|
|
|||
|
|
//ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>
|
|||
|
|
UART_HandleTypeDef ghuart1; //UARTȫ<54>ֱ<EFBFBD><D6B1><EFBFBD>
|
|||
|
|
volatile uint16_t gUartLen = 0x00; //UART<52><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
uint8_t gUartBuff[MAX_RECEIVE_DATA_LEN]; //UARTȫ<54><C8AB>BUF
|
|||
|
|
|
|||
|
|
volatile uint8_t gCommFlag = UART; //Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>UART<52><54><EFBFBD><EFBFBD>USB<53><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USB<53>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>USB
|
|||
|
|
uint32_t gReturnBLCnt; //<2F>ָ<EFBFBD>BootLoader<65><72>ʱ<EFBFBD><CAB1>
|
|||
|
|
uint32_t gFunTrace=0;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function ResetChip
|
|||
|
|
* @brief <EFBFBD><EFBFBD>λоƬ
|
|||
|
|
* @param[in]
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
//void ResetChip(void)
|
|||
|
|
void ResetChip(uint8_t entid)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
char tmp[20];
|
|||
|
|
if(entid>9)
|
|||
|
|
{
|
|||
|
|
sprintf(tmp,"Fault(%d,%d)\r\n",entid,gFunTrace);
|
|||
|
|
JJJ_Prompt(tmp);
|
|||
|
|
Delay_us(500);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
|
SCB->AIRCR = 0x05FA0004;
|
|||
|
|
NVIC_SystemReset();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function TimerDelay
|
|||
|
|
* @brief <EFBFBD><EFBFBD>msΪ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ӳٺ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param[in] TIMx xȡֵ1~6
|
|||
|
|
* @param[in] ms <EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
void TimerDelay(TIM_TypeDef *TIMx, uint32_t ms)
|
|||
|
|
{
|
|||
|
|
uint32_t HSIClock = 12000000;
|
|||
|
|
TIM_TimeInitTypeDef timeBaseInit;
|
|||
|
|
|
|||
|
|
if(TIMx == TIM1)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER1, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM2)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER2, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM3)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER3, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM4)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER4, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM5)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER5, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER6, RCC_TIMER_CLKSRC_HSI, HSIClock / 2000000 - 1, ENABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
timeBaseInit.TIM_CounterMode = TIM_MODE_CONTINUITY_RELOAD;
|
|||
|
|
timeBaseInit.TIM_Presclar = TIM_PRESCLAR_NOT_DIV;
|
|||
|
|
timeBaseInit.TIM_SizeMode = TIM_SIZE_32BIT;
|
|||
|
|
TIM_TimeInit(TIMx, &timeBaseInit);
|
|||
|
|
TIM_SetLoadValue(TIMx, 2000 * ms);
|
|||
|
|
TIM_Cmd(TIMx, ENABLE);
|
|||
|
|
|
|||
|
|
while(!TIM_GetFlagStatus(TIMx));
|
|||
|
|
|
|||
|
|
TIM_ClearFlag(TIMx);
|
|||
|
|
TIM_Cmd(TIMx, DISABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function TimerHSIClockCount
|
|||
|
|
* @brief timer count HSI clock cycles
|
|||
|
|
* @param[in] TIMx xȡֵ1~6
|
|||
|
|
* @param[in] controlType
|
|||
|
|
* @arg START_TIMER
|
|||
|
|
* @arg GET_TIMER
|
|||
|
|
* @arg STOP_TIMER
|
|||
|
|
* @return when controlType=GET_TIMER,return HSI clock cycles, others return 0.
|
|||
|
|
*/
|
|||
|
|
uint32_t TimerHSIClockCount(TIM_TypeDef *TIMx, uint8_t controlType)
|
|||
|
|
{
|
|||
|
|
TIM_TimeInitTypeDef timeBaseInit;
|
|||
|
|
|
|||
|
|
if(controlType == START_TIMER)
|
|||
|
|
{
|
|||
|
|
if(TIMx == TIM1)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER1, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM2)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER2, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM3)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER3, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM4)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER4, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM5)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER5, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER6, RCC_TIMER_CLKSRC_HSI, 31, ENABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
timeBaseInit.TIM_CounterMode = TIM_MODE_CONTINUITY_RELOAD;
|
|||
|
|
timeBaseInit.TIM_Presclar = TIM_PRESCLAR_NOT_DIV;
|
|||
|
|
timeBaseInit.TIM_SizeMode = TIM_SIZE_32BIT;
|
|||
|
|
TIM_TimeInit(TIMx, &timeBaseInit);
|
|||
|
|
TIM_SetLoadValue(TIMx, 0xffffffff);
|
|||
|
|
TIM_Cmd(TIMx, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(controlType == GET_TIMER)
|
|||
|
|
{
|
|||
|
|
return ((0xFFFFFFFF - TIMx->VALUE) << 5);
|
|||
|
|
}
|
|||
|
|
else if(controlType == STOP_TIMER)
|
|||
|
|
{
|
|||
|
|
TIM_Cmd(TIMx, DISABLE);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//TIME <20>ж<EFBFBD>
|
|||
|
|
/**
|
|||
|
|
* @function AppTIMxInterrupt
|
|||
|
|
* @brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>TIMx<EFBFBD>жϳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
|
* @param[in] ms <EFBFBD><EFBFBD>ʱ<EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void AppTIMxInterrupt(TIM_TypeDef *TIMx, uint32_t ms)
|
|||
|
|
{
|
|||
|
|
uint32_t HSIClock = 12000000;
|
|||
|
|
TIM_TimeInitTypeDef TimerInterInit;
|
|||
|
|
|
|||
|
|
if(TIMx == TIM1)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER1, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM2)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER1_2, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER2, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM3)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER3, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM4)
|
|||
|
|
{
|
|||
|
|
RCC_APB3PeriphClockCmd(RCC_APB3Periph_TIMER3_4, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER4, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM5)
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER5, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIMER5_6, ENABLE);
|
|||
|
|
RCC_TimerClockConfig(PERIPHERAL_TIMER6, RCC_TIMER_CLKSRC_HSI, HSIClock/2000000-1, ENABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TimerInterInit.TIM_CounterMode = TIM_MODE_CONTINUITY_RELOAD;
|
|||
|
|
TimerInterInit.TIM_Presclar = TIM_PRESCLAR_NOT_DIV;
|
|||
|
|
TimerInterInit.TIM_SizeMode = TIM_SIZE_32BIT;
|
|||
|
|
TIM_TimeInit(TIMx, &TimerInterInit);
|
|||
|
|
|
|||
|
|
TIM_SetLoadValue(TIMx, 2000*ms);
|
|||
|
|
|
|||
|
|
//ʹ<><CAB9><EFBFBD>ж<EFBFBD>
|
|||
|
|
if(TIMx == TIM1)
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER1_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER1_IRQn);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM2)
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER2_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER2_IRQn);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM3)
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER3_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER3_IRQn);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM4)
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER4_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER4_IRQn);
|
|||
|
|
}
|
|||
|
|
else if(TIMx == TIM5)
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER5_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER5_IRQn);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
NVIC_ClearPendingIRQ(TIMER6_IRQn);
|
|||
|
|
NVIC_EnableIRQ(TIMER6_IRQn);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC>ʱ
|
|||
|
|
TIM_ITConfig(TIMx, ENABLE);
|
|||
|
|
TIM_Cmd(TIMx, ENABLE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function Memcmp
|
|||
|
|
* @brief <EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param[in] pchDest ָ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param[in] pchSrc ָ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param[in] bLen <EFBFBD><EFBFBD><EFBFBD>鳤<EFBFBD><EFBFBD>
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>TRUE,<EFBFBD><EFBFBD>FALSE
|
|||
|
|
*/
|
|||
|
|
uint8_t Memcmp(uint8_t *pchDest, uint8_t *pchSrc, uint16_t bLen)
|
|||
|
|
{
|
|||
|
|
uint16_t i;
|
|||
|
|
|
|||
|
|
for(i = 0; i < bLen; i++)
|
|||
|
|
{
|
|||
|
|
if(pchDest[i] != pchSrc[i])
|
|||
|
|
{
|
|||
|
|
return FALSE;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return TRUE;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function Memcpy
|
|||
|
|
* @brief memory copy
|
|||
|
|
* @param[in] *dst :point destination address
|
|||
|
|
* @param[in] *src :point source address
|
|||
|
|
* @param[in] len :length to be copyed, unit byte
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
void Memcpy(uint8_t *dst, uint8_t *src, uint16_t len)
|
|||
|
|
{
|
|||
|
|
memcpy(dst, src, len);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function Delay
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|||
|
|
* @param[in] n <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
void Delay(u32 n)
|
|||
|
|
{
|
|||
|
|
u32 i;
|
|||
|
|
|
|||
|
|
for(i = 0; i < n; i++)
|
|||
|
|
{;}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @function NOP
|
|||
|
|
* @brief
|
|||
|
|
* @param[in]
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
__asm void NOP(void)
|
|||
|
|
{
|
|||
|
|
nop
|
|||
|
|
BX lr
|
|||
|
|
nop
|
|||
|
|
}
|
|||
|
|
|