/* * 说明:硬件复位 */ static void ICACHE_FLASH_ATTR TM7705_ResetHard(void) { RESET_1(); bsp_DelayMS(1); RESET_0(); bsp_DelayMS(2); RESET_1(); bsp_DelayMS(1); os_printf("TM7705 Reset!\r\n"); }
/* ********************************************************************************************************* * 函 数 名: MG323_PowerOn * 功能说明: 给MG323模块上电 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void MG323_Reset(void) { /* 根据MG323手册, RESET 管脚用于实现模块硬件复位。当模块出现软件死机的情况时,通过拉低 RESET 管脚 ≥ 10 ms 后,模块进行硬件复位。 */ MG_RESET_0(); bsp_DelayMS(20); MG_RESET_1(); bsp_DelayMS(10); }
/** * @brief USB_OTG_BSP_mDelay * This function provides delay time in milli sec * @param msec : Value of delay required in milli sec * @retval None */ void USB_OTG_BSP_mDelay (const uint32_t msec) { // #ifdef USE_ACCURATE_TIME // BSP_Delay(msec,TIM_MSEC_DELAY); // #else // USB_OTG_BSP_uDelay(msec * 1000); // #endif bsp_DelayMS(msec); }
/* ********************************************************************************************************* * 函 数 名: MG323_PowerOn * 功能说明: 给MG323模块上电 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void MG323_PowerOn(void) { comClearRxFifo(COM_MG323); /* 清零串口接收缓冲区 */ MG323_Reset(); /* 根据MG323手册,模块上电后延迟250ms,然后驱动 TERM_ON口线为低电平 750ms 之后驱动为高,完成开机时序 */ TERM_ON_1(); bsp_DelayMS(250); TERM_ON_0(); bsp_DelayMS(750); TERM_ON_1(); /* 等待模块完成上电,判断是否接收到 ^SYSSTART */ MG323_WaitResponse("^SYSSTART", 5000); }
/*------------------------------------------------------------ * Function Name : SD_EraseFlashOperation * Description : 擦除flash操作 * Input : None * Output : None * Return : None *------------------------------------------------------------*/ ErrorStatus SD_EraseFlashOperation( uint16_t x, uint16_t y ) { ErrorStatus Err = SUCCESS; uint32_t addr = 0; const uint8_t ERASE_FLASH_NUM = 3; const uint32_t erase_addr[ERASE_FLASH_NUM] = {ADDR_FLASH_SECTOR_5,ADDR_FLASH_SECTOR_6,ADDR_FLASH_SECTOR_7}; uint8_t i = 0; char buff[10]; uint8_t process = 0; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 正在擦除flash...",UPDATE_FONT); x += 216; /* Enable the flash control register access */ FLASH_Unlock(); /* Erase the user Flash area ************************************************/ /* area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR */ /* Clear pending flags (if any) */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); for (i=0; i<ERASE_FLASH_NUM; ++i) { /* Get the number of the start and end sectors */ addr = GetSector(erase_addr[i]); /* Device voltage range supposed to be [2.7V to 3.6V], the operation will be done by word */ if (FLASH_EraseSector(addr, VoltageRange_3) != FLASH_COMPLETE) { /* Error occurred while sector erase. User can add here some code to deal with this error */ Err = ERROR; break; } process += 30; usprintf(buff,"%3d%%",process); lcd_font24(x,y,COLOR_POINT,COLOR_BACK,buff,UPDATE_FONT); } bsp_DelayMS(DELAY_TIME); lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"100%",UPDATE_FONT); FLASH_Lock(); return Err; }
/* ********************************************************************************************************* * 函 数 名: bsp_InitTM7705 * 功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void ICACHE_FLASH_ATTR bsp_InitTM7705(void) { bsp_DelayMS(10); TM7705_ResetHard(); /* 硬件复位 */ /* 在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期), TM7705 将会回到默认状态。 */ bsp_DelayMS(5); TM7705_SyncSPI(); /* 同步SPI接口时序 */ bsp_DelayMS(5); /* 配置时钟寄存器 */ TM7705_WriteByte(REG_CLOCK | WRITE | CH_1); /* 先写通信寄存器,下一步是写时钟寄存器 */ TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); /* 刷新速率50Hz */ //TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ); /* 刷新速率500Hz */ }
void BeepInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0); bsp_DelayMS(200); GPIO_ResetBits(GPIOA, GPIO_Pin_0); }
/* ********************************************************************************************************* * 函 数 名: SIM800_PowerOff * 功能说明: 控制SIM800模块关机 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void SIM800_PowerOff(void) { /* 用户可以通过把PWRKEY 信号拉低1.5秒用来关机,拉低时间超过33秒模块会重新开机。 关机过程中,模块首先从网络上注销,让内部软件进入安全状态并且保存相关数据,最后关闭内部电 源。在最后断电前模块的串口将发送以下字符: NORMAL POWER DOWN 这之后模块将不会执行AT命令。模块进入关机模式,仅RTC处于激活状态。关机模式可以通过 VDD_EXT引脚来检测,在关机模式下此引脚输出为低电平。 */ /* 硬件关机 */ PWRKEY_0(); bsp_DelayMS(1500); PWRKEY_1(); }
/* ********************************************************************************************************* * 函 数 名: TM7705_WaitDRDY * 功能说明: 等待内部操作完成。 自校准时间较长,需要等待。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static void ICACHE_FLASH_ATTR TM7705_WaitDRDY(void) { u32 i; for (i = 0; i < 8000; i++){ if (DRDY_IS_LOW()){ break; } //bsp_DelayMS(1); os_delay_us(200); } if (i >= 8000){ os_printf("TM7705_WaitDRDY() timeout ...\r\n"); TM7705_SyncSPI(); /* 同步SPI接口时序 */ bsp_DelayMS(1); } }
/* ********************************************************************************************************* * 函 数 名: SIM800_PowerOn * 功能说明: 模块上电. 函数内部先判断是否已经开机,如果已开机则直接返回1 * 形 参: 无 * 返 回 值: 1 表示上电成功 0: 表示异常 ********************************************************************************************************* */ uint8_t SIM800_PowerOn(void) { uint8_t ret_value = 0; uint8_t i; /* 判断是否开机 */ for (i = 0; i < 5; i++) { SIM800_SendAT("AT"); if (SIM800_WaitResponse("OK", 100)) { return 1; } } comClearRxFifo(COM_SIM800); /* 清零串口接收缓冲区 */ /* 通过拉低 PWRKEY 引脚至少 1.2 秒然后释放,使模块开机。*/ PWRKEY_0(); bsp_DelayMS(2000); PWRKEY_1(); /* 等待模块完成上电,如果是自动波特率则收不到RDT */ //if (SIM800_WaitResponse("RDY", 5000) == 0) { /* 开始同步波特率: 主机发送AT,只到接收到正确的OK 当模块开机后建议延迟 2 至 3 秒后再发送同步字符,用户可发送“ AT” (大写、小写均可)来和模块 同步波特率,当主机收到模块返回“ OK”, */ for (i = 0; i < 50; i++) { SIM800_SendAT("OK"); if (SIM800_WaitResponse("OK", 100)) { ret_value = 1; break; /* 模块上电成功 */ } } } return ret_value; }
/*------------------------------------------------------------ * Function Name : UDP_EraseFlashCue * Description : UDPÉý¼¶Ê§°Ü * Input : None * Output : None * Return : None *------------------------------------------------------------*/ void UDP_EraseFlashCue( uint8_t process ) { char buff[10]; switch ( process ) { case 0: lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"> ×¼±¸ÏµÍ³Éý¼¶...",UPDATE_FONT); udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"> ÕýÔÚ²Á³ýflash...",UPDATE_FONT); break; case 100: bsp_DelayMS(DELAY_TIME); lcd_font24(udp_lcd_x+216,udp_lcd_y,COLOR_POINT,COLOR_BACK,"100%",UPDATE_FONT); udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; break; default: usprintf(buff,"%3d%%",process); lcd_font24(udp_lcd_x+216,udp_lcd_y,COLOR_POINT,COLOR_BACK,buff,UPDATE_FONT); break; } }
//LAN8720初始化 //返回值:0,成功; // 其他,失败 uint8_t bsp_InitLan8720(void) { uint8_t rval=0; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOB , ENABLE);//使能GPIO时钟 RMII接口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG时钟 SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); //MAC和PHY之间使用RMII接口 /*网络引脚设置 RMII接口 ETH_MDIO -------------------------> PA2 ETH_MDC --------------------------> PC1 ETH_RMII_REF_CLK------------------> PA1 ETH_RMII_CRS_DV ------------------> PA7 ETH_RMII_RXD0 --------------------> PC4 ETH_RMII_RXD1 --------------------> PC5 ETH_RMII_TX_EN -------------------> PB11 ETH_RMII_TXD0 --------------------> PB12 ETH_RMII_TXD1 --------------------> PB13 ETH_RESET-------------------------> PA0*/ //配置PA1 PA2 PA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); //引脚复用到网络接口上 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); //配置PC1,PC4 and PC5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); //引脚复用到网络接口上 GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); //配置PG11, PG14 and PG13 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); //配置PD3为推完输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); LAN8720_CLR; //硬件复位LAN8720 bsp_DelayMS(50); LAN8720_SET; //复位结束 ETHERNET_NVICConfiguration(); rval=ETH_MACDMA_Config(); return !rval; //ETH的规则为:0,失败;1,成功;所以要取反一下 }
/** * @brief USB_OTG_BSP_mDelay * This function provides delay time in milli sec * @param msec : Value of delay required in milli sec * @retval None */ void USB_OTG_BSP_mDelay (const uint32_t msec) { bsp_DelayMS(msec); }
/*------------------------------------------------------------ * Function Name : SD_UpDate * Description : SD卡升级 * Input : None * Output : None * Return : None *------------------------------------------------------------*/ ErrorStatus SD_UpDate( void ) { char version[50]; uint16_t x = UPDATE_WORD_START_X; uint16_t y = UPDATE_WORD_START_Y; lcd_clear(COLOR_BACK); lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"========================================",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK," > 欢迎使用SD卡升级系统 <",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; strcpy(version," > "); strcat(version,SOFT_VERSION); lcd_font24(x,y,COLOR_POINT,COLOR_BACK,version,UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"========================================",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 正在查找SD卡升级文件...",UPDATE_FONT); bsp_DelayMS(DELAY_TIME); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; if (Check_SD_UpdateFileExist() == NO) { lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 未找到升级文件!",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 升级失败!",UPDATE_FONT); return ERROR; } lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 准备系统升级...",UPDATE_FONT); bsp_DelayMS(DELAY_TIME); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; if (ERROR == SD_EraseFlashOperation(x,y)) { y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 擦除flash失败!",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 升级失败!",UPDATE_FONT); return ERROR; } y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 正在写入文件...",UPDATE_FONT); bsp_DelayMS(DELAY_TIME); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; if (ERROR == SD_UpdateExecute(x,y)) { return ERROR; } y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; lcd_font24(x,y,COLOR_POINT,COLOR_BACK,"> 升级成功!",UPDATE_FONT); y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE; AutoEnterSystemCue(x,y,COLOR_POINT,COLOR_BACK,UPDATE_FONT); return SUCCESS; }