/** ****************************************************************************** * @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. * *

© COPYRIGHT 2016 TMC

****************************************************************************** **/ #include "global.h" //全局变量 UART_HandleTypeDef ghuart1; //UART全局变量 volatile uint16_t gUartLen = 0x00; //UART接收数据长度 uint8_t gUartBuff[MAX_RECEIVE_DATA_LEN]; //UART全局BUF volatile uint8_t gCommFlag = UART; //硬件检测判断是UART还是USB,如果进USB中断,则是USB uint32_t gReturnBLCnt; //恢复BootLoader计时器 uint32_t gFunTrace=0; /** * @function ResetChip * @brief 复位芯片 * @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); } //复位操作 SCB->AIRCR = 0x05FA0004; NVIC_SystemReset(); } /** * @function TimerDelay * @brief 以ms为单位的时间延迟函数 * @param[in] TIMx x取值1~6 * @param[in] ms 延时时间 * @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 中断 /** * @function AppTIMxInterrupt * @brief 定时器TIMx中断初始化 * @param[in] ms 定时中断时间 * @return 无 */ 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); //使能中断 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); } //开始计时 TIM_ITConfig(TIMx, ENABLE); TIM_Cmd(TIMx, ENABLE); } /** * @function Memcmp * @brief 比较两个数组是否相等 * @param[in] pchDest 指针指向目标数组 * @param[in] pchSrc 指针指向源数组 * @param[in] bLen 数组长度 * @return 数组是否相等,是返回TRUE,否返回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 计数循环延时 * @param[in] n 延时数量 * @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 }