基础版本

This commit is contained in:
bathfire
2026-04-27 16:55:02 +08:00
commit 64b3e488da
269 changed files with 383851 additions and 0 deletions
+347
View File
@@ -0,0 +1,347 @@
/*C*****************************************************************************
* NAME: at45db.c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
* at45Db驱动。
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
#include "config.h" //全局声明
u8 FlashType = 0;
F_uniGlobal_Typedef F_uniGlobal;
#define Data_INIT
const u8 initATDB45_Flag = 0x38;
const PREXDATA_Type initPREXDATA = {0,0,0,0,0,0,0,0,0};
const AT45DBDataIndex AT45DBTab[20] =
{ ///FRAM数据1区(数据操作相对不频烦)
/// pInitData; upData pData firstAdr; len; Tpye; //(注意,校验增加在数据包尾)
{(u8*)&initATDB45_Flag, (u8*)(&buf_ATDB45_Flag), (u8*)(&TXHData.ATDB45_Flag), ATDB45_Flag_FADR, ATDB45_Flag_LEN, ATDB45_Flag_Group, CA_ATDB45_Flag},
{(u8*)&initATDB45_Flag, (u8*)(&buf_Frame), (u8*)(&TXHData.Frame), Frame_FADR, Frame_LEN, Frame_Group, CA_Frame},
{(u8*)&initPREXDATA, (u8*)(&buf_PREXDATA), (u8*)(&TXHData.PREXDATA), PREXDATA_FADR, PREXDATA_LEN, PREXDATA_Group, CA_PREXDATA},
{(u8*)&initATDB45_Flag, (u8*)(&buf_DeviceFrame), (u8*)(&TXHData.Frame), DeviceFrame_FADR, DeviceFrame_LEN, DeviceFrame_Group, CA_DeviceFrame},
};
////==============================================================================
/**
* @brief 对指定长度的数据区域进行校验和计算
*
* @param pData 指向数据区域的指针
* @param len 数据区域的长度
* @return u8 返回校验和结果
*/
u8 AT45DBDataCheck(volatile u8* pData, u16 len)
{
u8 result; // 校验和变量
result = *pData; // 初始化为第一个字节的值
while(len--)
{
result += *pData++; // 累加每个字节的值
}
return result; // 返回校验和结果
}
/****************************************************
函数名:AT45DB_SendByte
功能 :Flash存储部分用到的SPI发送函数
参数 dt 要发送的数据
返回值:无
****************************************************/
u8 AT45DB_SendByte(u8 dt)
{
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, dt);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
//F*****************************************************************************
//* NAME: ReadDFStatus
//*-----------------------------------------------------------------------------
//* PURPOSE:
//* 读取45db状态
//*-----------------------------------------------------------------------------
//* PARAMS:
//* return: 如果返回值等0,说明驱动器错误
//*-----------------------------------------------------------------------------
//* NOTE:
//******************************************************************************
u8 ReadDFStatus (void)
{
u8 result;
CLI();
AT45DB_CS_EN;
AT45DB_SendByte(0xd7);
result = AT45DB_SendByte(0xff);//要读两次,不然要加10ms延时,暂时不知道为什么
//delay_ms(10);
AT45DB_CS_DIS;
SEI();
return result;
}
//F*****************************************************************************
//* NAME: ReadDriverID
//*-----------------------------------------------------------------------------
//* PURPOSE:
//* 读取45dbID 判断存储器类型
//*-----------------------------------------------------------------------------
//* PARAMS:
//* return: Drive ID(Byte 1)Family Code Density Code
// 0 0 1((AT45D) 0 0 1 0 0 (4-Mbit)
// 0 0 1((AT45D) 0 0 1 1 1 (32-Mbit)
//*-----------------------------------------------------------------------------
//* NOTE:
//******************************************************************************
u16 ii = 0;
u8 resultF = 0;
u8 ReadDriverID (void)
{
CLI();
for(ii = 0;ii < 200;ii ++)
{
if(ReadDFStatus() & 0x80)
break;
delay_ms(1);
}
if(ii < 200)
{
AT45DB_CS_EN;
AT45DB_SendByte(0x9F);
AT45DB_SendByte(0xFF);
resultF = AT45DB_SendByte(0xFF);
AT45DB_CS_DIS;
SEI();
return resultF;
}
SEI();
return 0;
}
u8 AT45DB_SetPageByte (void)
{
CLI();
for(ii = 0;ii < 200;ii ++)
{
if(ReadDFStatus() & 0x80)
break;
delay_ms(1);
}
if(ii < 200)
{
AT45DB_CS_EN;
AT45DB_SendByte(0x3D);
AT45DB_SendByte(0x2A);
AT45DB_SendByte(0x80);
AT45DB_SendByte(0xA7);//A6:512;A7:528
AT45DB_CS_DIS;
SEI();
return 1;
}
SEI();
return 0;
}
u8 AT45DB_WriteBuff(u8 *Buff,u16 Len)
{
u16 i = 0;
CLI();
for(ii = 0;ii < 200;ii ++)
{
if(ReadDFStatus() & 0x80)
break;
delay_ms(1);
}
if(ii < 200)
{
AT45DB_CS_EN;
AT45DB_SendByte(0x84);
AT45DB_SendByte(0x00);
AT45DB_SendByte(0x00);
AT45DB_SendByte(0x00);
for(i = 0;i < Len;i ++)
AT45DB_SendByte(*(Buff + i));
AT45DB_CS_DIS;
SEI();
return 1;
}
SEI();
return 0;
}
u8 AT45DB_WritePage(u8 *Buff,u16 Page,u16 Len)//len = 10,79us
{
CLI();
if(AT45DB_WriteBuff(Buff,Len) == 0)
return 0;
for(ii = 0;ii < 200;ii ++)
{
if(ReadDFStatus() & 0x80)
break;
delay_ms(1);
}
if(ii < 200)
{
AT45DB_CS_EN;
AT45DB_SendByte(0x83);
AT45DB_SendByte((u8)(Page >> 6));
AT45DB_SendByte((u8)(Page << 2));
AT45DB_SendByte(0x00);
AT45DB_CS_DIS;
SEI();
return 1;
}
SEI();
return 0;
}
u8 AT45DB_ReadPage(u8 *Buff,u16 Page,u16 Len)//len = 10,75us
{
u16 i = 0;
CLI();
for(ii = 0;ii < 200;ii ++)
{
if(ReadDFStatus() & 0x80)
break;
delay_ms(1);
}
if(ii < 200)
{
AT45DB_CS_EN;
AT45DB_SendByte(0xE8);
AT45DB_SendByte((u8)(Page >> 6));
AT45DB_SendByte((u8)(Page << 2));
AT45DB_SendByte(0x00);
for(i = 0;i < 4;i ++)
AT45DB_SendByte(0x00);
for(i = 0;i < Len;i ++)
*(Buff + i) = AT45DB_SendByte(0xff);
AT45DB_CS_DIS;
SEI();
return 1;
}
SEI();
return 0;
}
void AT45DB_Data_Init(void)
{
volatile u16 i = 0,j = 0,Item = 0;
u8 Temp_Buff[660];
u8 Temp = 0;
for(Item = 0;Item< FramItemEnd;Item ++)
{
for(i = 0;i < AT45DBTab[Item].Group;i ++)
{
for(j = 0;j < AT45DBTab[Item].len - checkLen_1;j ++)
Temp_Buff[j] = *(AT45DBTab[Item].upData + j) = *(AT45DBTab[Item].pInitData+j);
Temp_Buff[AT45DBTab[Item].len - checkLen_1] = AT45DBDataCheck(Temp_Buff,AT45DBTab[Item].len - checkLen_1);
AT45DB_WritePage(Temp_Buff,AT45DBTab[Item].firstAdr + i,AT45DBTab[Item].len);
}
}
// __set_FAULTMASK(1);
// NVIC_SystemReset();
}
u8 AT45DBItemWrite(AT45DBItem Type, u16 Group)
{
u16 i = 0,j = 0,k = 0;
u8 Temp_Buff[660];
u8 Temp = 0;
if(Group >= AT45DBTab[Type].Group)
return 0;
for(i = 0;i < AT45DBTab[Type].len - checkLen_1;i ++)
{
*(AT45DBTab[Type].upData + i) = *(AT45DBTab[Type].pData + i);
Temp_Buff[i] = *(AT45DBTab[Type].upData + i);
}
Temp_Buff[AT45DBTab[Type].len - checkLen_1] = AT45DBDataCheck(Temp_Buff,AT45DBTab[Type].len - checkLen_1);
for(j = 0;j < 6;j ++)
{
AT45DB_WritePage(Temp_Buff,AT45DBTab[Type].firstAdr + Group,AT45DBTab[Type].len);
if(AT45DBItemRead(Type,Group) == 1)
{
return 1;
}
delay_ms(100);
}
// TXHData.ErrState.Flag.e_errFlashParameter = 1;
return 0;
}
u8 CRCTemp = 0;
u8 AT45DBItemRead(AT45DBItem Type, u16 Group)
{
volatile u16 i = 0,j = 0;
u8 Temp_Buff[660];
u8 Temp_Buff1[660];
u8 CRCTemp1 = 0;
if(Group >= AT45DBTab[Type].Group)
return 0;
for(j = 0;j < 6;j ++)
{
AT45DB_ReadPage(FuniGlobal.Global,AT45DBTab[Type].firstAdr + Group,AT45DBTab[Type].len);
for(i = 0;i < AT45DBTab[Type].len;i ++)
*(Temp_Buff+i) = *(AT45DBTab[Type].upData+i);
CRCTemp = AT45DBDataCheck(Temp_Buff,AT45DBTab[Type].len - checkLen_1);
if(CRCTemp == Temp_Buff[AT45DBTab[Type].len - checkLen_1])
{
for(i = 0;i < AT45DBTab[Type].len - checkLen_1;i ++)
*(AT45DBTab[Type].pData+i) = *(AT45DBTab[Type].upData+i);
return 1;
}
delay_ms(100);
}
// pGun.ErrState.Flag.e_errFlashParameter = 1;
return 0;
}
u8 ExChangeByte(u8 data)
{
u8 Temp = 0;
Temp = data;
data = (Temp >> 4) | (Temp << 4);
return data;
}
u8 NotByte(u8 data)
{
if(data == 0 || data == 0xff)
return data;
else
return ~data;
}
void AT45DB_Init(void)
{
volatile u16 Frame = 0;
u8* pBuff;
u8 Temp_Buff[660];
FlashType = ReadDriverID();
AT45DB_SetPageByte();
switch(FlashType)
{
case 0x24: TXHData.ATDB45Type = At45DB041;break;
case 0x27: TXHData.ATDB45Type = At45DB321;break;
case 0x28: TXHData.ATDB45Type = At45DB641;break;
}
// if(SWF8 == SWF_ON)
// {
// if(TXHData.ATDB45Type >= At45DB321)
// {
// for(Frame = 0;Frame < 1024;Frame ++)
// {
// ReadFlashNx512Btye(&TXHData.Frame[0],FLASH_APP_ADDR + Frame *512);
// switch(Frame%8)
// {
// case 0:TXHData.Frame[2] = ExChangeByte(TXHData.Frame[2]);
// TXHData.Frame[54] = NotByte(TXHData.Frame[54]);
// TXHData.Frame[288] = ExChangeByte(TXHData.Frame[288]);GPIO_SetBits(GPIOE,GPIO_Pin_2);break;
// case 1:TXHData.Frame[469] = NotByte(TXHData.Frame[469]);break;
// case 2:TXHData.Frame[104] = ExChangeByte(TXHData.Frame[104]);break;
// case 3:break;
// case 4:TXHData.Frame[0] = NotByte(TXHData.Frame[0]);break;
// case 5:TXHData.Frame[253] = ExChangeByte(TXHData.Frame[253]);GPIO_ResetBits(GPIOE,GPIO_Pin_2);break;
// }
// AT45DBItemWrite(CA_Frame,Frame + (TXHData.ROM_UpData.ROM_UpData_State.RomAddrNow * 1024));
// }
// }
// }
}
+95
View File
@@ -0,0 +1,95 @@
#ifndef _AT45DB_H_
#define _AT45DB_H_
/*H*****************************************************************************
* NAME: at45db.h
*******************************************************************************/
//*****************************************************************************
/*_____ M A C R O S __________________________________________________________*/
//端口定义
#define AT45DB_CS_EN GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_3);
#define AT45DB_CS_DIS GPIO_SetBits(GPIOA, GPIO_Pin_4);
//******************************************************************************
//
#define FLASH_APP_ADDR 0x08008000 //第一个应用程序起始地址(存放在FLASH)
#define RomUpDataAddr_Old 0
#define RomUpDataAddr_New 1024
#define FuniGlobal F_uniGlobal.u
//******************************************************************************
// AT45DB_DATA_MAP
#define checkLen_1 1 ///如果数据组带有校验,增加1byte
//存储器完好标致
///全局缓冲中的值
#define buf_ATDB45_Flag FuniGlobal.ATDB45_Flag
///结构体定义
#define ATDB45_Flag_FADR (0)
#define ATDB45_Flag_LEN (sizeof(buf_ATDB45_Flag) + checkLen_1)
#define ATDB45_Flag_Group 1 //组数
///全局缓冲中的值
#define buf_Frame FuniGlobal.Frame
///结构体定义
#define Frame_FADR (ATDB45_Flag_FADR + ATDB45_Flag_Group)
#define Frame_LEN sizeof(buf_Frame) + checkLen_1
#define Frame_Group 2048 //组数
///全局缓冲中的值
#define buf_PREXDATA FuniGlobal.PREXDATA
///结构体定义
#define PREXDATA_FADR (Frame_FADR + Frame_Group)
#define PREXDATA_LEN sizeof(buf_PREXDATA) + checkLen_1
#define PREXDATA_Group 2000 //组数
///全局缓冲中的值
#define buf_DeviceFrame FuniGlobal.Frame
///结构体定义
#define DeviceFrame_FADR (PREXDATA_FADR + PREXDATA_Group)
#define DeviceFrame_LEN sizeof(buf_DeviceFrame) + checkLen_1
#define DeviceFrame_Group 800*5 //组数
typedef struct
{
union
{
u8 Global[530]; //全局最大个数
u8 ATDB45_Flag;
u8 Frame[512];
PREXDATA_Type PREXDATA[5];
}u;
u8 CheckAdd;
}F_uniGlobal_Typedef; //存储器读写缓存共用体
typedef enum
{
CA_ATDB45_Flag,
CA_Frame,
CA_PREXDATA,
CA_DeviceFrame,
AT45DBItemEnd,
}AT45DBItem;
//********************************************************************************
typedef struct
{
u8* pInitData;//初始化指针
u8* upData; //共用体数据缓存区指针
u8* pData; //pGun数据指针
u32 firstAdr; //第一地址
u16 len; //长度
u16 Group;
u8 Tpye; //类型
}AT45DBDataIndex;
u8 AT45DBItemWrite(AT45DBItem Type, u16 Group);
u8 AT45DBItemRead(AT45DBItem Type, u16 Group);
void AT45DB_Data_Init(void);
void AT45DB_Init(void);
#endif
+275
View File
@@ -0,0 +1,275 @@
/*C*****************************************************************************
* NAME: .c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
*
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
#include "config.h" //全局声明
/*_____ M A C R O S __________________________________________________________*/
/*_____ D E F I N I T I O N __________________________________________________*/
//AD参考电压2.5V,压力传感器输出4-20毫安,对应电压范围0.48-2.4v
/*_____ D E C L A R A T I O N ________________________________________________*/
u16 PressureAdcBuf[20];//压力检测ADC缓存,每把枪C_PressureAdcBuf
u16 PressureADCValue[2];//压力值缓存
u32 pressureCalibrate = 3932; //10倍AD对应2.4V 40MP 2979
u32 pressureBass = (3932/5); //10倍对应0.48V 0MP
u8 PrssureTask_Flag = 0;//压力检测任务开关
#define C_timerPressure 5 //压力异常定时数值
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测IO配置
参数 :无
返回值:无
****************************************************/
void Pressure_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测ADCDMA配置
参数 :无
返回值:无
****************************************************/
void Pressure_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 20;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_2;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)PressureAdcBuf;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);
DMA_Cmd(DMA2_Stream0, ENABLE);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测ADC配置
参数 :无
返回值:无
****************************************************/
void Pressure_ADC_Configuration(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能 ADC1 时钟
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1 复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束
//②初始化通用配置
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟 5 个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA 失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频 4 分频。
//ADCCLK=PCLK2/4=84/4=21Mhz,ADC 时钟最好不要超过 36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//初始化
//③初始化 ADC1 相关参数
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12 位模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfConversion = 6;//6 个转换在规则序列中
ADC_Init(ADC3, &ADC_InitStructure);//ADC 初始化
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_480Cycles);
ADC_DMACmd(ADC1, ENABLE);//开启ADC1DMA
//④开启 ADC 转换
ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器
ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
ADC_SoftwareStartConv(ADC1); //使能指定的 ADC1 的软件转换启动功能
}
/****************************************************
函数名:Pressure_NVIC_Configuration
功能 DMA中断配置
参数 :无
返回值:无
****************************************************/
void Pressure_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
//ADC1_DMA
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; //ADC3_DMA
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测初始化
参数 :无
返回值:无
****************************************************/
void Pressure_Init(void)
{
u8 Number = 0;
Pressure_IO_Configuration();
Pressure_ADC_Configuration();
Pressure_DMA_Configuration();
Pressure_NVIC_Configuration();
/**********压力定时器初始化**********/
TXHData.AnalogTimer.Cycle = 1;
TXHData.AnalogTimer.Flag = 0;
TXHData.AnalogTimer.ON_OFF = 1;
TXHData.AnalogTimer.Init = 0;
TXHData.AnalogTimer.TimerCount = 0;
TXHData.AnalogTimer.TimerCountMax = 500;//200周期2S
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测DMA中断
参数 :无
返回值:无
****************************************************/
void Pressure_ADCDMA_IRQHandler(void)
{
PrssureTask_Flag = 1; //开启压力检测任务
DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测任务
参数 :无
返回值:无
****************************************************/
void PrssureTask(void)
{
volatile u8 Number = 0;
volatile u8 i;
u16 *pBuf = PressureAdcBuf;
volatile u32 sum[2]= {0,0},Temp[2]={0,0};
if(PrssureTask_Flag)
{
PrssureTask_Flag = 0;
for(Number = 0;Number < 2;Number ++)
{
sum[Number] = 0;
for(i = 0; i < 20; i += 2 )
sum[Number] += *(pBuf+i+Number); //求和
PressureADCValue[Number] =(sum[Number] ) / 160;//计算平均值
// if((PressureADCValue[Number] > (pressureBass-470)) && (PressureADCValue[Number] < pressureCalibrate))//压力大于0小于2.5,压力传感器在线
// {
// switch(Number)
// {
// case 0:
// {
// JQJData.ErrState.Flag.e_errPressure_InCut = 0;//清除压力传感器掉线标志位
// if(PressureADCValue[Number] > pressureBass)
// {
// JQJData.AnalogValue.Pressure_In = ((PressureADCValue[Number]- pressureBass) * JQJData.Pressure_Range.Pressure_In_Range * 10)/(pressureCalibrate - pressureBass); //
// if(JQJData.AnalogValue.Pressure_In > (JQJData.Pressure_Limit.Pressure_In_Limit * 10))
// {
// JQJData.ErrState.Flag.e_errPressure_InPass = 1;
// if(JQJData.FuelState.Flag.StartFlag == 1)
// JQJData.ValveClose_Flag = 1;
// }
// else
// JQJData.ErrState.Flag.e_errPressure_InPass = 0;
// }
// else
// {
// JQJData.AnalogValue.Pressure_In = 0;
// }
// if(JQJData.AnalogValue.Pressure_In > JQJData.Pressure_Limit.Pressure_Out_Stop)
// {
// if(V_Moto_State == 1)
// JQJData.ValveClose_Flag = 1;
// }
// }
// break;
// case 1:
// {
// JQJData.ErrState.Flag.e_errPressure_OutCut = 0;//清除压力传感器掉线标志位
// if(PressureADCValue[Number] > pressureBass)
// {
// JQJData.AnalogValue.Pressure_Out = ((PressureADCValue[Number]- pressureBass) * JQJData.Pressure_Range.Pressure_Out_Range * 10)/(pressureCalibrate - pressureBass); //
// if(JQJData.AnalogValue.Pressure_Out > JQJData.Pressure_Limit.Pressure_Out_Limit)
// {
// JQJData.ErrState.Flag.e_errPressure_OutPass = 1;
// if(JQJData.FuelState.Flag.StartFlag == 1)
// JQJData.ValveClose_Flag = 1;
// }
// else
// {
// JQJData.ErrState.Flag.e_errPressure_OutPass = 0;
// }
// if(JQJData.AnalogValue.Pressure_Out > JQJData.Pressure_Limit.Pressure_Out_Stop)
// {
// if(V_Moto_State == 1)
// JQJData.ValveClose_Flag = 1;
// }
// }
// else
// {
// JQJData.AnalogValue.Pressure_Out = 0;
// }
// }
// break;
// }
// }
// else///压力传感器检测不到,启动异常定时器
// {
// switch(Number)
// {
// case 0:
// {
// }
// break;
// case 1:
// {
// }
// break;
//
// }
// }
}
}
}
+26
View File
@@ -0,0 +1,26 @@
#ifndef __Analog_H_
#define __Analog_H_
/*H******************************************************************************
* NAME: pressure.h
*********************************************************************************/
//3.3V,LMV358 跟随器,线性范围0.2~2.6v,4~40ms 输入电阻选用120欧
//******************************************************************************
//*-------------- 变量声名 -----------------------------------------------------
//******************************************************************************
extern u16 PressureAdcBuf[20];
extern u16 PressureADCValue[2];
extern u8 PrssureTask_Flag;
#define Prssure_DMAAddrSet(x) (DMA2_Stream0->M0AR = x) //设置发送缓存地址
#define Prssure_DMALenSet(x) (DMA2_Stream0->NDTR = x) //设置DMA发送长度
#define Prssure_DMAStart() DMA_Cmd(DMA2_Stream0,ENABLE) //开启DMA发送
#define Prssure_DMAStop() DMA_Cmd(DMA2_Stream0,DISABLE) //关闭DMA发送
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
extern void Pressure_Init(void);
extern void Pressure_ADCDMA_IRQHandler(void);
extern void PrssureTask(void);
#endif //#ifndef
+916
View File
@@ -0,0 +1,916 @@
/****************************** (C) COPYRIGHT 2011 YQDZ **************************
* 文 件 名 : CH376INC.H
* 作 者 : 亿全电子
* FAE现场应用工程师 QQ:1027413631
* 7*24小时技术支持电话:15366066738
* http://shop57138657.taobao.com/
* 版 本 : V1.0
* 日 期 : 2011/08/29
* 描 述 : CH376芯片命令相关定义.
*********************************************************************************/
#ifndef __CH376INC_H__
#define __CH376INC_H__
#ifdef __cplusplus
extern "C" {
#endif
/* ********************************************************************************************************************* */
/* 常用类型和常量定义 */
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef UINT8
typedef unsigned char UINT8;
#endif
#ifndef UINT16
typedef unsigned short UINT16;
#endif
#ifndef UINT32
typedef unsigned long UINT32;
#endif
#ifndef PUINT8
typedef unsigned char *PUINT8;
#endif
#ifndef PUINT16
typedef unsigned short *PUINT16;
#endif
#ifndef PUINT32
typedef unsigned long *PUINT32;
#endif
#ifndef UINT8V
typedef unsigned char volatile UINT8V;
#endif
#ifndef PUINT8V
typedef unsigned char volatile *PUINT8V;
#endif
/* ********************************************************************************************************************* */
/* 硬件特性 */
#define CH376_DAT_BLOCK_LEN 0x40 /* USB单个数据包, 数据块的最大长度, 默认缓冲区的长度 */
/* ********************************************************************************************************************* */
/* 命令代码 */
/* 部分命令兼容CH375芯片, 但是输入数据或者输出数据的可能局部不同) */
/* 一个命令操作顺序包含:
一个命令码(对于串口方式,命令码之前还需要两个同步码),
若干个输入数据(可以是0个),
产生中断通知 或者 若干个输出数据(可以是0个), 二选一, 有中断通知则一定没有输出数据, 有输出数据则一定不产生中断
仅CMD01_WR_REQ_DATA命令例外, 顺序包含: 一个命令码, 一个输出数据, 若干个输入数据
命令码起名规则: CMDxy_NAME
其中的x和y都是数字, x说明最少输入数据个数(字节数), y说明最少输出数据个数(字节数), y如果是H则说明产生中断通知,
有些命令能够实现0到多个字节的数据块读写, 数据块本身的字节数未包含在上述x或y之内 */
/* 本文件默认会同时提供与CH375芯片命令码兼容的命令码格式(即去掉x和y之后), 如果不需要, 那么可以定义_NO_CH375_COMPATIBLE_禁止 */
/* ********************************************************************************************************************* */
/* 主要命令(手册一), 常用 */
#define CMD01_GET_IC_VER 0x01 /* 获取芯片及固件版本 */
/* 输出: 版本号( 位7为0, 位6为1, 位5~位0为版本号 ) */
/* CH376返回版本号的值为041H即版本号为01H */
#define CMD21_SET_BAUDRATE 0x02 /* 串口方式: 设置串口通讯波特率(上电或者复位后的默认波特率为9600bps,由D4/D5/D6引脚选择) */
/* 输入: 波特率分频系数, 波特率分频常数 */
/* 输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 ) */
#define CMD00_ENTER_SLEEP 0x03 /* 进入睡眠状态 */
#define CMD00_RESET_ALL 0x05 /* 执行硬件复位 */
#define CMD11_CHECK_EXIST 0x06 /* 测试通讯接口和工作状态 */
/* 输入: 任意数据 */
/* 输出: 输入数据的按位取反 */
#define CMD20_CHK_SUSPEND 0x0B /* 设备方式: 设置检查USB总线挂起状态的方式 */
/* 输入: 数据10H, 检查方式 */
/* 00H=不检查USB挂起, 04H=以50mS为间隔检查USB挂起, 05H=以10mS为间隔检查USB挂起 */
#define CMD20_SET_SDO_INT 0x0B /* SPI接口方式: 设置SPI的SDO引脚的中断方式 */
/* 输入: 数据16H, 中断方式 */
/* 10H=禁止SDO引脚用于中断输出,在SCS片选无效时三态输出禁止, 90H=SDO引脚在SCS片选无效时兼做中断请求输出 */
#define CMD14_GET_FILE_SIZE 0x0C /* 主机文件模式: 获取当前文件长度 */
/* 输入: 数据68H */
/* 输出: 当前文件长度(总长度32位,低字节在前) */
#define CMD50_SET_FILE_SIZE 0x0D /* 主机文件模式: 设置当前文件长度 */
/* 输入: 数据68H, 当前文件长度(总长度32位,低字节在前) */
#define CMD11_SET_USB_MODE 0x15 /* 设置USB工作模式 */
//00H=未启用的设备方式, 01H=已启用的设备方式并且使用外部固件模式(串口不支持),
//02H=已启用的设备方式并且使用内置固件模式 03H=SD卡主机模式/未启用的主机模式,用于管理和存取SD卡中的文件
//04H=未启用的主机方式, 05H=已启用的主机方式, 06H=已启用的主机方式并且自动产生SOF包, 07H=已启用的主机方式并且复位USB总线 */
//输出: 操作状态( CMD_RET_SUCCESS或CMD_RET_ABORT, 其它值说明操作未完成 )
#define CMD01_GET_STATUS 0x22 /* 获取中断状态并取消中断请求 */
/* 输出: 中断状态 */
#define CMD00_UNLOCK_USB 0x23 /* 设备方式: 释放当前USB缓冲区 */
#define CMD01_RD_USB_DATA0 0x27 /* 从当前USB中断的端点缓冲区或者主机端点的接收缓冲区读取数据块 */
/* 输出: 长度, 数据流 */
#define CMD01_RD_USB_DATA 0x28 /* 设备方式: 从当前USB中断的端点缓冲区读取数据块, 并释放缓冲区, 相当于 CMD01_RD_USB_DATA0 + CMD00_UNLOCK_USB */
/* 输出: 长度, 数据流 */
#define CMD10_WR_USB_DATA7 0x2B /* 设备方式: 向USB端点2的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */
#define CMD10_WR_HOST_DATA 0x2C /* 向USB主机端点的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */
#define CMD01_WR_REQ_DATA 0x2D /* 向内部指定缓冲区写入请求的数据块 */
/* 输出: 长度 */
/* 输入: 数据流 */
#define CMD20_WR_OFS_DATA 0x2E /* 向内部缓冲区指定偏移地址写入数据块 */
/* 输入: 偏移, 长度, 数据流 */
#define CMD10_SET_FILE_NAME 0x2F /* 主机文件模式: 设置将要操作的文件的文件名 */
/* 输入: 以0结束的字符串(含结束符0在内长度不超过14个字符) */
/* ********************************************************************************************************************* */
/* 主要命令(手册一), 常用, 以下命令总是在操作结束时产生中断通知, 并且总是没有输出数据 */
#define CMD0H_DISK_CONNECT 0x30 /* 主机文件模式/不支持SD卡: 检查磁盘是否连接 */
/* 输出中断 */
#define CMD0H_DISK_MOUNT 0x31 /* 主机文件模式: 初始化磁盘并测试磁盘是否就绪 */
/* 输出中断 */
#define CMD0H_FILE_OPEN 0x32 /* 主机文件模式: 打开文件或者目录(文件夹),或者枚举文件和目录(文件夹) */
/* 输出中断 */
#define CMD0H_FILE_ENUM_GO 0x33 /* 主机文件模式: 继续枚举文件和目录(文件夹) */
/* 输出中断 */
#define CMD0H_FILE_CREATE 0x34 /* 主机文件模式: 新建文件,如果文件已经存在那么先删除 */
/* 输出中断 */
#define CMD0H_FILE_ERASE 0x35 /* 主机文件模式: 删除文件,如果已经打开则直接删除,否则对于文件会先打开再删除,子目录必须先打开 */
/* 输出中断 */
#define CMD1H_FILE_CLOSE 0x36 /* 主机文件模式: 关闭当前已经打开的文件或者目录(文件夹) */
/* 输入: 是否允许更新文件长度 */
/* 00H=禁止更新长度, 01H=允许更新长度 */
/* 输出中断 */
#define CMD1H_DIR_INFO_READ 0x37 /* 主机文件模式: 读取文件的目录信息 */
/* 输入: 指定需要读取的目录信息结构在扇区内的索引号 */
/* 索引号范围为00H~0FH, 索引号0FFH则为当前已经打开的文件 */
/* 输出中断 */
#define CMD0H_DIR_INFO_SAVE 0x38 /* 主机文件模式: 保存文件的目录信息 */
/* 输出中断 */
#define CMD4H_BYTE_LOCATE 0x39 /* 主机文件模式: 以字节为单位移动当前文件指针 */
/* 输入: 偏移字节数(总长度32位,低字节在前) */
/* 输出中断 */
#define CMD2H_BYTE_READ 0x3A /* 主机文件模式: 以字节为单位从当前位置读取数据块 */
/* 输入: 请求读取的字节数(总长度16位,低字节在前) */
/* 输出中断 */
#define CMD0H_BYTE_RD_GO 0x3B /* 主机文件模式: 继续字节读 */
/* 输出中断 */
#define CMD2H_BYTE_WRITE 0x3C /* 主机文件模式: 以字节为单位向当前位置写入数据块 */
/* 输入: 请求写入的字节数(总长度16位,低字节在前) */
/* 输出中断 */
#define CMD0H_BYTE_WR_GO 0x3D /* 主机文件模式: 继续字节写 */
/* 输出中断 */
#define CMD0H_DISK_CAPACITY 0x3E /* 主机文件模式: 查询磁盘物理容量 */
/* 输出中断 */
#define CMD0H_DISK_QUERY 0x3F /* 主机文件模式: 查询磁盘空间信息 */
/* 输出中断 */
#define CMD0H_DIR_CREATE 0x40 /* 主机文件模式: 新建目录(文件夹)并打开,如果目录已经存在那么直接打开 */
/* 输出中断 */
#define CMD4H_SEC_LOCATE 0x4A /* 主机文件模式: 以扇区为单位移动当前文件指针 */
/* 输入: 偏移扇区数(总长度32位,低字节在前) */
/* 输出中断 */
#define CMD1H_SEC_READ 0x4B /* 主机文件模式/不支持SD卡: 以扇区为单位从当前位置读取数据块 */
/* 输入: 请求读取的扇区数 */
/* 输出中断 */
#define CMD1H_SEC_WRITE 0x4C /* 主机文件模式/不支持SD卡: 以扇区为单位在当前位置写入数据块 */
/* 输入: 请求写入的扇区数 */
/* 输出中断 */
#define CMD0H_DISK_BOC_CMD 0x50 /* 主机方式/不支持SD卡: 对USB存储器执行BulkOnly传输协议的命令 */
/* 输出中断 */
#define CMD5H_DISK_READ 0x54 /* 主机方式/不支持SD卡: 从USB存储器读物理扇区 */
/* 输入: LBA物理扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) */
/* 输出中断 */
#define CMD0H_DISK_RD_GO 0x55 /* 主机方式/不支持SD卡: 继续执行USB存储器的物理扇区读操作 */
/* 输出中断 */
#define CMD5H_DISK_WRITE 0x56 /* 主机方式/不支持SD卡: 向USB存储器写物理扇区 */
/* 输入: LBA物理扇区地址(总长度32位, 低字节在前), 扇区数(01H~FFH) */
/* 输出中断 */
#define CMD0H_DISK_WR_GO 0x57 /* 主机方式/不支持SD卡: 继续执行USB存储器的物理扇区写操作 */
/* 输出中断 */
/* ********************************************************************************************************************* */
/* 辅助命令(手册二), 不太常用或者是为了与CH375和CH372兼容 */
#define CMD10_SET_USB_SPEED 0x04 /* 设置USB总线速度, 在每次CMD11_SET_USB_MODE设置USB工作模式时会自动恢复到12Mbps全速 */
/* 输入: 总线速度代码 */
/* 00H=12Mbps全速FullSpeed(默认值), 01H=1.5Mbps(仅修改频率), 02H=1.5Mbps低速LowSpeed */
#define CMD11_GET_DEV_RATE 0x0A /* 主机方式: 获取当前连接的USB设备的数据速率类型 */
/* 输入: 数据07H */
/* 输出: 数据速率类型 */
/* 位4为1则是1.5Mbps低速USB设备, 否则是12Mbps全速USB设备 */
#define CMD11_GET_TOGGLE 0x0A /* 获取OUT事务的同步状态 */
/* 输入: 数据1AH */
/* 输出: 同步状态 */
/* 位4为1则OUT事务同步, 否则OUT事务不同步 */
#define CMD11_READ_VAR8 0x0A /* 读取指定的8位文件系统变量 */
/* 输入: 变量地址 */
/* 输出: 数据 */
/*#define CMD11_GET_MAX_LUN = CMD11_READ_VAR8( VAR_UDISK_LUN )*/ /* 主机方式: 获取USB存储器最大和当前逻辑单元号 */
#define CMD20_SET_RETRY 0x0B /* 主机方式: 设置USB事务操作的重试次数 */
/* 输入: 数据25H, 重试次数 */
/* 位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试, 位7为1位6为1则收到NAK时最多重试3秒, 位5~位0为超时后的重试次数 */
#define CMD20_WRITE_VAR8 0x0B /* 设置指定的8位文件系统变量 */
/* 输入: 变量地址, 数据 */
/*#define CMD20_SET_DISK_LUN = CMD20_WRITE_VAR8( VAR_UDISK_LUN )*/ /* 主机方式: 设置USB存储器的当前逻辑单元号 */
#define CMD14_READ_VAR32 0x0C /* 读取指定的32位文件系统变量 */
/* 输入: 变量地址 */
/* 输出: 数据(总长度32位,低字节在前) */
#define CMD50_WRITE_VAR32 0x0D /* 设置指定的32位文件系统变量 */
/* 输入: 变量地址, 数据(总长度32位,低字节在前) */
#define CMD01_DELAY_100US 0x0F /* 延时100uS(串口不支持) */
/* 输出: 延时期间输出0,延时结束输出非0 */
#define CMD40_SET_USB_ID 0x12 /* 设备方式: 设置USB厂商VID和产品PID */
/* 输入: 厂商ID低字节, 厂商ID高字节, 产品ID低字节, 产品ID高字节 */
#define CMD10_SET_USB_ADDR 0x13 /* 设置USB地址 */
/* 输入: 地址值 */
#define CMD01_TEST_CONNECT 0x16 /* 主机方式/不支持SD卡: 检查USB设备连接状态 */
/* 输出: 状态( USB_INT_CONNECT或USB_INT_DISCONNECT或USB_INT_USB_READY, 其它值说明操作未完成 ) */
#define CMD00_ABORT_NAK 0x17 /* 主机方式: 放弃当前NAK的重试 */
#define CMD10_SET_ENDP2 0x18 /* 设备方式(串口不支持): 设置USB端点0的接收器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */
#define CMD10_SET_ENDP3 0x19 /* 设备方式(串口不支持): 设置USB端点0的发送器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */
#define CMD10_SET_ENDP4 0x1A /* 设备方式(串口不支持): 设置USB端点1的接收器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */
#define CMD10_SET_ENDP5 0x1B /* 设备方式(串口不支持): 设置USB端点1的发送器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000~1000-就绪ACK, 1110-正忙NAK, 1111-错误STALL */
#define CMD10_SET_ENDP6 0x1C /* 设置USB端点2/主机端点的接收器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但不返回ACK, 1110-正忙NAK, 1111-错误STALL */
#define CMD10_SET_ENDP7 0x1D /* 设置USB端点2/主机端点的发送器 */
/* 输入: 工作方式 */
/* 位7为1则位6为同步触发位, 否则同步触发位不变 */
/* 位3~位0为事务响应方式: 0000-就绪ACK, 1101-就绪但无须应答, 1110-正忙NAK, 1111-错误STALL */
#define CMD00_DIRTY_BUFFER 0x25 /* 主机文件模式: 清除内部的磁盘和文件缓冲区 */
#define CMD10_WR_USB_DATA3 0x29 /* 设备方式(串口不支持): 向USB端点0的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */
#define CMD10_WR_USB_DATA5 0x2A /* 设备方式(串口不支持): 向USB端点1的发送缓冲区写入数据块 */
/* 输入: 长度, 数据流 */
/* ********************************************************************************************************************* */
/* 辅助命令(手册二), 不太常用或者是为了与CH375和CH372兼容, 以下命令总是在操作结束时产生中断通知, 并且总是没有输出数据 */
#define CMD1H_CLR_STALL 0x41 /* 主机方式: 控制传输-清除端点错误 */
/* 输入: 端点号 */
/* 输出中断 */
#define CMD1H_SET_ADDRESS 0x45 /* 主机方式: 控制传输-设置USB地址 */
/* 输入: 地址值 */
/* 输出中断 */
#define CMD1H_GET_DESCR 0x46 /* 主机方式: 控制传输-获取描述符 */
/* 输入: 描述符类型 */
/* 输出中断 */
#define CMD1H_SET_CONFIG 0x49 /* 主机方式: 控制传输-设置USB配置 */
/* 输入: 配置值 */
/* 输出中断 */
#define CMD0H_AUTO_SETUP 0x4D /* 主机方式/不支持SD卡: 自动配置USB设备 */
/* 输出中断 */
#define CMD2H_ISSUE_TKN_X 0x4E /* 主机方式: 发出同步令牌, 执行事务, 该命令可代替 CMD10_SET_ENDP6/CMD10_SET_ENDP7 + CMD1H_ISSUE_TOKEN */
/* 输入: 同步标志, 事务属性 */
/* 同步标志的位7为主机端点IN的同步触发位, 位6为主机端点OUT的同步触发位, 位5~位0必须为0 */
/* 事务属性的低4位是令牌, 高4位是端点号 */
/* 输出中断 */
#define CMD1H_ISSUE_TOKEN 0x4F /* 主机方式: 发出令牌, 执行事务, 建议用CMD2H_ISSUE_TKN_X命令 */
/* 输入: 事务属性 */
/* 低4位是令牌, 高4位是端点号 */
/* 输出中断 */
#define CMD0H_DISK_INIT 0x51 /* 主机方式/不支持SD卡: 初始化USB存储器 */
/* 输出中断 */
#define CMD0H_DISK_RESET 0x52 /* 主机方式/不支持SD卡: 控制传输-复位USB存储器 */
/* 输出中断 */
#define CMD0H_DISK_SIZE 0x53 /* 主机方式/不支持SD卡: 获取USB存储器的容量 */
/* 输出中断 */
#define CMD0H_DISK_INQUIRY 0x58 /* 主机方式/不支持SD卡: 查询USB存储器特性 */
/* 输出中断 */
#define CMD0H_DISK_READY 0x59 /* 主机方式/不支持SD卡: 检查USB存储器就绪 */
/* 输出中断 */
#define CMD0H_DISK_R_SENSE 0x5A /* 主机方式/不支持SD卡: 检查USB存储器错误 */
/* 输出中断 */
#define CMD0H_RD_DISK_SEC 0x5B /* 主机文件模式: 从磁盘读取一个扇区的数据到内部缓冲区 */
/* 输出中断 */
#define CMD0H_WR_DISK_SEC 0x5C /* 主机文件模式: 将内部缓冲区的一个扇区的数据写入磁盘 */
/* 输出中断 */
#define CMD0H_DISK_MAX_LUN 0x5D /* 主机方式: 控制传输-获取USB存储器最大逻辑单元号 */
/* 输出中断 */
/* ********************************************************************************************************************* */
/* 以下定义只是为了兼容CH375的INCLUDE文件中的命令名称格式 */
#ifndef _NO_CH375_COMPATIBLE_
#define CMD_GET_IC_VER CMD01_GET_IC_VER
#define CMD_SET_BAUDRATE CMD21_SET_BAUDRATE
#define CMD_ENTER_SLEEP CMD00_ENTER_SLEEP
#define CMD_RESET_ALL CMD00_RESET_ALL
#define CMD_CHECK_EXIST CMD11_CHECK_EXIST
#define CMD_CHK_SUSPEND CMD20_CHK_SUSPEND
#define CMD_SET_SDO_INT CMD20_SET_SDO_INT
#define CMD_GET_FILE_SIZE CMD14_GET_FILE_SIZE
#define CMD_SET_FILE_SIZE CMD50_SET_FILE_SIZE
#define CMD_SET_USB_MODE CMD11_SET_USB_MODE
#define CMD_GET_STATUS CMD01_GET_STATUS
#define CMD_UNLOCK_USB CMD00_UNLOCK_USB
#define CMD_RD_USB_DATA0 CMD01_RD_USB_DATA0
#define CMD_RD_USB_DATA CMD01_RD_USB_DATA
#define CMD_WR_USB_DATA7 CMD10_WR_USB_DATA7
#define CMD_WR_HOST_DATA CMD10_WR_HOST_DATA
#define CMD_WR_REQ_DATA CMD01_WR_REQ_DATA
#define CMD_WR_OFS_DATA CMD20_WR_OFS_DATA
#define CMD_SET_FILE_NAME CMD10_SET_FILE_NAME
#define CMD_DISK_CONNECT CMD0H_DISK_CONNECT
#define CMD_DISK_MOUNT CMD0H_DISK_MOUNT
#define CMD_FILE_OPEN CMD0H_FILE_OPEN
#define CMD_FILE_ENUM_GO CMD0H_FILE_ENUM_GO
#define CMD_FILE_CREATE CMD0H_FILE_CREATE
#define CMD_FILE_ERASE CMD0H_FILE_ERASE
#define CMD_FILE_CLOSE CMD1H_FILE_CLOSE
#define CMD_DIR_INFO_READ CMD1H_DIR_INFO_READ
#define CMD_DIR_INFO_SAVE CMD0H_DIR_INFO_SAVE
#define CMD_BYTE_LOCATE CMD4H_BYTE_LOCATE
#define CMD_BYTE_READ CMD2H_BYTE_READ
#define CMD_BYTE_RD_GO CMD0H_BYTE_RD_GO
#define CMD_BYTE_WRITE CMD2H_BYTE_WRITE
#define CMD_BYTE_WR_GO CMD0H_BYTE_WR_GO
#define CMD_DISK_CAPACITY CMD0H_DISK_CAPACITY
#define CMD_DISK_QUERY CMD0H_DISK_QUERY
#define CMD_DIR_CREATE CMD0H_DIR_CREATE
#define CMD_SEC_LOCATE CMD4H_SEC_LOCATE
#define CMD_SEC_READ CMD1H_SEC_READ
#define CMD_SEC_WRITE CMD1H_SEC_WRITE
#define CMD_DISK_BOC_CMD CMD0H_DISK_BOC_CMD
#define CMD_DISK_READ CMD5H_DISK_READ
#define CMD_DISK_RD_GO CMD0H_DISK_RD_GO
#define CMD_DISK_WRITE CMD5H_DISK_WRITE
#define CMD_DISK_WR_GO CMD0H_DISK_WR_GO
#define CMD_SET_USB_SPEED CMD10_SET_USB_SPEED
#define CMD_GET_DEV_RATE CMD11_GET_DEV_RATE
#define CMD_GET_TOGGLE CMD11_GET_TOGGLE
#define CMD_READ_VAR8 CMD11_READ_VAR8
#define CMD_SET_RETRY CMD20_SET_RETRY
#define CMD_WRITE_VAR8 CMD20_WRITE_VAR8
#define CMD_READ_VAR32 CMD14_READ_VAR32
#define CMD_WRITE_VAR32 CMD50_WRITE_VAR32
#define CMD_DELAY_100US CMD01_DELAY_100US
#define CMD_SET_USB_ID CMD40_SET_USB_ID
#define CMD_SET_USB_ADDR CMD10_SET_USB_ADDR
#define CMD_TEST_CONNECT CMD01_TEST_CONNECT
#define CMD_ABORT_NAK CMD00_ABORT_NAK
#define CMD_SET_ENDP2 CMD10_SET_ENDP2
#define CMD_SET_ENDP3 CMD10_SET_ENDP3
#define CMD_SET_ENDP4 CMD10_SET_ENDP4
#define CMD_SET_ENDP5 CMD10_SET_ENDP5
#define CMD_SET_ENDP6 CMD10_SET_ENDP6
#define CMD_SET_ENDP7 CMD10_SET_ENDP7
#define CMD_DIRTY_BUFFER CMD00_DIRTY_BUFFER
#define CMD_WR_USB_DATA3 CMD10_WR_USB_DATA3
#define CMD_WR_USB_DATA5 CMD10_WR_USB_DATA5
#define CMD_CLR_STALL CMD1H_CLR_STALL
#define CMD_SET_ADDRESS CMD1H_SET_ADDRESS
#define CMD_GET_DESCR CMD1H_GET_DESCR
#define CMD_SET_CONFIG CMD1H_SET_CONFIG
#define CMD_AUTO_SETUP CMD0H_AUTO_SETUP
#define CMD_ISSUE_TKN_X CMD2H_ISSUE_TKN_X
#define CMD_ISSUE_TOKEN CMD1H_ISSUE_TOKEN
#define CMD_DISK_INIT CMD0H_DISK_INIT
#define CMD_DISK_RESET CMD0H_DISK_RESET
#define CMD_DISK_SIZE CMD0H_DISK_SIZE
#define CMD_DISK_INQUIRY CMD0H_DISK_INQUIRY
#define CMD_DISK_READY CMD0H_DISK_READY
#define CMD_DISK_R_SENSE CMD0H_DISK_R_SENSE
#define CMD_RD_DISK_SEC CMD0H_RD_DISK_SEC
#define CMD_WR_DISK_SEC CMD0H_WR_DISK_SEC
#define CMD_DISK_MAX_LUN CMD0H_DISK_MAX_LUN
#endif
/* ********************************************************************************************************************* */
/* 并口方式, 状态端口(读命令端口)的位定义 */
#ifndef PARA_STATE_INTB
#define PARA_STATE_INTB 0x80 /* 并口方式状态端口的位7: 中断标志,低有效 */
#define PARA_STATE_BUSY 0x10 /* 并口方式状态端口的位4: 忙标志,高有效 */
#endif
/* ********************************************************************************************************************* */
/* 串口方式, 操作命令前的引导同步码 */
#ifndef SER_CMD_TIMEOUT
#define SER_CMD_TIMEOUT 32 /* 串口命令超时时间, 单位为mS, 同步码之间及同步码与命令码之间的间隔应该尽量短, 超时后的处理方式为丢弃 */
#define SER_SYNC_CODE1 0x57 /* 启动操作的第1个串口同步码 */
#define SER_SYNC_CODE2 0xAB /* 启动操作的第2个串口同步码 */
#endif
/* ********************************************************************************************************************* */
/* 操作状态 */
#ifndef CMD_RET_SUCCESS
#define CMD_RET_SUCCESS 0x51 /* 命令操作成功 */
#define CMD_RET_ABORT 0x5F /* 命令操作失败 */
#endif
/* ********************************************************************************************************************* */
/* USB中断状态 */
#ifndef USB_INT_EP0_SETUP
/* 以下状态代码为特殊事件中断, 如果通过CMD20_CHK_SUSPEND启用USB总线挂起检查, 那么必须处理USB总线挂起和睡眠唤醒的中断状态 */
#define USB_INT_USB_SUSPEND 0x05 /* USB总线挂起事件 */
#define USB_INT_WAKE_UP 0x06 /* 从睡眠中被唤醒事件 */
/* 以下状态代码0XH用于USB设备方式 */
/* 内置固件模式下只需要处理: USB_INT_EP1_OUT, USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN */
/* 位7-位4为0000 */
/* 位3-位2指示当前事务, 00=OUT, 10=IN, 11=SETUP */
/* 位1-位0指示当前端点, 00=端点0, 01=端点1, 10=端点2, 11=USB总线复位 */
#define USB_INT_EP0_SETUP 0x0C /* USB端点0的SETUP */
#define USB_INT_EP0_OUT 0x00 /* USB端点0的OUT */
#define USB_INT_EP0_IN 0x08 /* USB端点0的IN */
#define USB_INT_EP1_OUT 0x01 /* USB端点1的OUT */
#define USB_INT_EP1_IN 0x09 /* USB端点1的IN */
#define USB_INT_EP2_OUT 0x02 /* USB端点2的OUT */
#define USB_INT_EP2_IN 0x0A /* USB端点2的IN */
/* USB_INT_BUS_RESET 0x0000XX11B */ /* USB总线复位 */
#define USB_INT_BUS_RESET1 0x03 /* USB总线复位 */
#define USB_INT_BUS_RESET2 0x07 /* USB总线复位 */
#define USB_INT_BUS_RESET3 0x0B /* USB总线复位 */
#define USB_INT_BUS_RESET4 0x0F /* USB总线复位 */
#endif
/* 以下状态代码2XH-3XH用于USB主机方式的通讯失败代码 */
/* 位7-位6为00 */
/* 位5为1 */
/* 位4指示当前接收的数据包是否同步 */
/* 位3-位0指示导致通讯失败时USB设备的应答: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=超时 */
/* USB_INT_RET_ACK 0x001X0010B */ /* 错误:对于IN事务返回ACK */
/* USB_INT_RET_NAK 0x001X1010B */ /* 错误:返回NAK */
/* USB_INT_RET_STALL 0x001X1110B */ /* 错误:返回STALL */
/* USB_INT_RET_DATA0 0x001X0011B */ /* 错误:对于OUT/SETUP事务返回DATA0 */
/* USB_INT_RET_DATA1 0x001X1011B */ /* 错误:对于OUT/SETUP事务返回DATA1 */
/* USB_INT_RET_TOUT 0x001XXX00B */ /* 错误:返回超时 */
/* USB_INT_RET_TOGX 0x0010X011B */ /* 错误:对于IN事务返回数据不同步 */
/* USB_INT_RET_PID 0x001XXXXXB */ /* 错误:未定义 */
/* 以下状态代码1XH用于USB主机方式的操作状态代码 */
#ifndef USB_INT_SUCCESS
#define USB_INT_SUCCESS 0x14 /* USB事务或者传输操作成功 */
#define USB_INT_CONNECT 0x15 /* 检测到USB设备连接事件, 可能是新连接或者断开后重新连接 */
#define USB_INT_DISCONNECT 0x16 /* 检测到USB设备断开事件 */
#define USB_INT_BUF_OVER 0x17 /* USB传输的数据有误或者数据太多缓冲区溢出 */
#define USB_INT_USB_READY 0x18 /* USB设备已经被初始化(已经分配USB地址) */
#define USB_INT_DISK_READ 0x1D /* USB存储器请求数据读出 */
#define USB_INT_DISK_WRITE 0x1E /* USB存储器请求数据写入 */
#define USB_INT_DISK_ERR 0x1F /* USB存储器操作失败 */
#endif
/* 以下状态代码用于主机文件模式下的文件系统错误码 */
#ifndef ERR_DISK_DISCON
#define ERR_DISK_DISCON 0x82 /* 磁盘尚未连接,可能磁盘已经断开 */
#define ERR_LARGE_SECTOR 0x84 /* 磁盘的扇区太大,只支持每扇区512字节 */
#define ERR_TYPE_ERROR 0x92 /* 磁盘分区类型不支持,只支持FAT12/FAT16/BigDOS/FAT32,需要由磁盘管理工具重新分区 */
#define ERR_BPB_ERROR 0xA1 /* 磁盘尚未格式化,或者参数错误,需要由WINDOWS采用默认参数重新格式化 */
#define ERR_DISK_FULL 0xB1 /* 磁盘文件太满,剩余空间太少或者已经没有,需要磁盘整理 */
#define ERR_FDT_OVER 0xB2 /* 目录(文件夹)内文件太多,没有空闲的目录项,FAT12/FAT16根目录下的文件数应该少于512个,需要磁盘整理 */
#define ERR_FILE_CLOSE 0xB4 /* 文件已经关闭,如果需要使用,应该重新打开文件 */
#define ERR_OPEN_DIR 0x41 /* 指定路径的目录(文件夹)被打开 */
#define ERR_MISS_FILE 0x42 /* 指定路径的文件没有找到,可能是文件名称错误 */
#define ERR_FOUND_NAME 0x43 /* 搜索到相匹配的文件名,或者是要求打开目录(文件夹)而实际结果却打开了文件 */
/* 以下文件系统错误码用于文件系统子程序 */
#define ERR_MISS_DIR 0xB3 /* 指定路径的某个子目录(文件夹)没有找到,可能是目录名称错误 */
#define ERR_LONG_BUF_OVER 0x48 /* 长文件缓冲区溢出 */
#define ERR_LONG_NAME_ERR 0x49 /* 短文件名没有对应的长文件名或者长文件名错误 */
#define ERR_NAME_EXIST 0x4A /* 同名的短文件已经存在,建议重新生成另外一个短文件名 */
#endif
/* ********************************************************************************************************************* */
/* 以下状态代码用于主机文件模式下的磁盘及文件状态, VAR_DISK_STATUS */
#ifndef DEF_DISK_UNKNOWN
#define DEF_DISK_UNKNOWN 0x00 /* 尚未初始化,未知状态 */
#define DEF_DISK_DISCONN 0x01 /* 磁盘没有连接或者已经断开 */
#define DEF_DISK_CONNECT 0x02 /* 磁盘已经连接,但是尚未初始化或者无法识别该磁盘 */
#define DEF_DISK_MOUNTED 0x03 /* 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 */
#define DEF_DISK_READY 0x10 /* 已经分析磁盘的文件系统并且能够支持 */
#define DEF_DISK_OPEN_ROOT 0x12 /* 已经打开根目录,使用后必须关闭,注意FAT12/FAT16根目录是固定长度 */
#define DEF_DISK_OPEN_DIR 0x13 /* 已经打开子目录(文件夹) */
#define DEF_DISK_OPEN_FILE 0x14 /* 已经打开文件 */
#endif
/* ********************************************************************************************************************* */
/* 文件系统常用定义 */
#ifndef DEF_SECTOR_SIZE
#define DEF_SECTOR_SIZE 512 /* U盘或者SD卡默认的物理扇区的大小 */
#endif
#ifndef DEF_WILDCARD_CHAR
#define DEF_WILDCARD_CHAR 0x2A /* 路径名的通配符 '*' */
#define DEF_SEPAR_CHAR1 0x5C /* 路径名的分隔符 '\' */
#define DEF_SEPAR_CHAR2 0x2F /* 路径名的分隔符 '/' */
#define DEF_FILE_YEAR 2004 /* 默认文件日期: 2004年 */
#define DEF_FILE_MONTH 1 /* 默认文件日期: 1月 */
#define DEF_FILE_DATE 1 /* 默认文件日期: 1日 */
#endif
#ifndef ATTR_DIRECTORY
/* FAT数据区中文件目录信息 */
typedef struct _FAT_DIR_INFO {
UINT8 DIR_Name[11]; /* 00H,文件名,共11字节,不足处填空格 */
UINT8 DIR_Attr; /* 0BH,文件属性,参考后面的说明 */
UINT8 DIR_NTRes; /* 0CH */
UINT8 DIR_CrtTimeTenth; /* 0DH,文件创建的时间,以0.1秒单位计数 */
UINT16 DIR_CrtTime; /* 0EH,文件创建的时间 */
UINT16 DIR_CrtDate; /* 10H,文件创建的日期 */
UINT16 DIR_LstAccDate; /* 12H,最近一次存取操作的日期 */
UINT16 DIR_FstClusHI; /* 14H */
UINT16 DIR_WrtTime; /* 16H,文件修改时间,参考前面的宏MAKE_FILE_TIME */
UINT16 DIR_WrtDate; /* 18H,文件修改日期,参考前面的宏MAKE_FILE_DATE */
UINT16 DIR_FstClusLO; /* 1AH */
UINT32 DIR_FileSize; /* 1CH,文件长度 */
} FAT_DIR_INFO, *P_FAT_DIR_INFO; /* 20H */
/* 文件属性 */
#define ATTR_READ_ONLY 0x01 /* 文件为只读属性 */
#define ATTR_HIDDEN 0x02 /* 文件为隐含属性 */
#define ATTR_SYSTEM 0x04 /* 文件为系统属性 */
#define ATTR_VOLUME_ID 0x08 /* 卷标 */
#define ATTR_DIRECTORY 0x10 /* 子目录(文件夹) */
#define ATTR_ARCHIVE 0x20 /* 文件为存档属性 */
#define ATTR_LONG_NAME ( ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID ) /* 长文件名属性 */
#define ATTR_LONG_NAME_MASK ( ATTR_LONG_NAME | ATTR_DIRECTORY | ATTR_ARCHIVE )
/* 文件属性 UINT8 */
/* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */
/* 只 隐 系 卷 目 存 未定义 */
/* 读 藏 统 标 录 档 */
/* 文件时间 UINT16 */
/* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */
#define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* 生成指定时分秒的文件时间数据 */
/* 文件日期 UINT16 */
/* Date = ((Year-1980)<<9) + (Month<<5) + Day */
#define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* 生成指定年月日的文件日期数据 */
#define LONE_NAME_MAX_CHAR (255*2) /* 长文件名最多字符数/字节数 */
#define LONG_NAME_PER_DIR (13*2) /* 长文件名在每个文件目录信息结构中的字符数/字节数 */
#endif
/* ********************************************************************************************************************* */
/* SCSI命令和数据输入输出结构 */
#ifndef SPC_CMD_INQUIRY
/* SCSI命令码 */
#define SPC_CMD_INQUIRY 0x12
#define SPC_CMD_READ_CAPACITY 0x25
#define SPC_CMD_READ10 0x28
#define SPC_CMD_WRITE10 0x2A
#define SPC_CMD_TEST_READY 0x00
#define SPC_CMD_REQUEST_SENSE 0x03
#define SPC_CMD_MODESENSE6 0x1A
#define SPC_CMD_MODESENSE10 0x5A
#define SPC_CMD_START_STOP 0x1B
/* BulkOnly协议的命令块 */
typedef struct _BULK_ONLY_CBW {
UINT32 CBW_Sig;
UINT32 CBW_Tag;
UINT8 CBW_DataLen0; /* 08H,输入: 数据传输长度,对于输入数据其有效值是0到48,对于输出数据其有效值为0到33 */
UINT8 CBW_DataLen1;
UINT16 CBW_DataLen2;
UINT8 CBW_Flag; /* 0CH,输入: 传输方向等标志,位7为1则输入数据,位为0则输出数据或者没有数据 */
UINT8 CBW_LUN;
UINT8 CBW_CB_Len; /* 0EH,输入: 命令块的长度,有效值是1到16 */
UINT8 CBW_CB_Buf[16]; /* 0FH,输入: 命令块,该缓冲区最多为16个字节 */
} BULK_ONLY_CBW, *P_BULK_ONLY_CBW; /* BulkOnly协议的命令块, 输入CBW结构 */
/* INQUIRY命令的返回数据 */
typedef struct _INQUIRY_DATA {
UINT8 DeviceType; /* 00H, 设备类型 */
UINT8 RemovableMedia; /* 01H, 位7为1说明是移动存储 */
UINT8 Versions; /* 02H, 协议版本 */
UINT8 DataFormatAndEtc; /* 03H, 指定返回数据格式 */
UINT8 AdditionalLength; /* 04H, 后续数据的长度 */
UINT8 Reserved1;
UINT8 Reserved2;
UINT8 MiscFlag; /* 07H, 一些控制标志 */
UINT8 VendorIdStr[8]; /* 08H, 厂商信息 */
UINT8 ProductIdStr[16]; /* 10H, 产品信息 */
UINT8 ProductRevStr[4]; /* 20H, 产品版本 */
} INQUIRY_DATA, *P_INQUIRY_DATA; /* 24H */
/* REQUEST SENSE命令的返回数据 */
typedef struct _SENSE_DATA {
UINT8 ErrorCode; /* 00H, 错误代码及有效位 */
UINT8 SegmentNumber;
UINT8 SenseKeyAndEtc; /* 02H, 主键码 */
UINT8 Information0;
UINT8 Information1;
UINT8 Information2;
UINT8 Information3;
UINT8 AdditSenseLen; /* 07H, 后续数据的长度 */
UINT8 CmdSpecInfo[4];
UINT8 AdditSenseCode; /* 0CH, 附加键码 */
UINT8 AddSenCodeQual; /* 0DH, 详细的附加键码 */
UINT8 FieldReplaUnit;
UINT8 SenseKeySpec[3];
} SENSE_DATA, *P_SENSE_DATA; /* 12H */
#endif
/* ********************************************************************************************************************* */
/* 主机文件模式下的数据输入和输出结构 */
#ifndef MAX_FILE_NAME_LEN
#define MAX_FILE_NAME_LEN (13+1) /* 文件名最大长度,最大长度是1个根目录符+8个主文件名+1个小数点+3个类型名+结束符=14 */
/* 命令的输入数据和输出数据 */
typedef union _CH376_CMD_DATA {
struct {
UINT8 mBuffer[ MAX_FILE_NAME_LEN ];
} Default;
INQUIRY_DATA DiskMountInq; /* 返回: INQUIRY命令的返回数据 */
/* CMD0H_DISK_MOUNT: 初始化磁盘并测试磁盘是否就绪,首次执行时 */
FAT_DIR_INFO OpenDirInfo; /* 返回: 枚举到的文件目录信息 */
/* CMD0H_FILE_OPEN: 枚举文件和目录(文件夹) */
FAT_DIR_INFO EnumDirInfo; /* 返回: 枚举到的文件目录信息 */
/* CMD0H_FILE_ENUM_GO: 继续枚举文件和目录(文件夹) */
struct {
UINT8 mUpdateFileSz; /* 输入参数: 是否允许更新文件长度, 0则禁止更新长度 */
} FileCLose; /* CMD1H_FILE_CLOSE: 关闭当前已经打开的文件 */
struct {
UINT8 mDirInfoIndex; /* 输入参数: 指定需要读取的目录信息结构在扇区内的索引号, 0FFH则为当前已经打开的文件 */
} DirInfoRead; /* CMD1H_DIR_INFO_READ: 读取文件的目录信息 */
union {
UINT32 mByteOffset; /* 输入参数: 偏移字节数,以字节为单位的偏移量(总长度32位,低字节在前) */
UINT32 mSectorLba; /* 返回: 当前文件指针对应的绝对线性扇区号,0FFFFFFFFH则已到文件尾(总长度32位,低字节在前) */
} ByteLocate; /* CMD4H_BYTE_LOCATE: 以字节为单位移动当前文件指针 */
struct {
UINT16 mByteCount; /* 输入参数: 请求读取的字节数(总长度16位,低字节在前) */
} ByteRead; /* CMD2H_BYTE_READ: 以字节为单位从当前位置读取数据块 */
struct {
UINT16 mByteCount; /* 输入参数: 请求写入的字节数(总长度16位,低字节在前) */
} ByteWrite; /* CMD2H_BYTE_WRITE: 以字节为单位向当前位置写入数据块 */
union {
UINT32 mSectorOffset; /* 输入参数: 偏移扇区数,以扇区为单位的偏移量(总长度32位,低字节在前) */
UINT32 mSectorLba; /* 返回: 当前文件指针对应的绝对线性扇区号,0FFFFFFFFH则已到文件尾(总长度32位,低字节在前) */
} SectorLocate; /* CMD4H_SEC_LOCATE: 以扇区为单位移动当前文件指针 */
struct {
UINT8 mSectorCount; /* 输入参数: 请求读取的扇区数 */
/* 返回: 允许读取的扇区数 */
UINT8 mReserved1;
UINT8 mReserved2;
UINT8 mReserved3;
UINT32 mStartSector; /* 返回: 允许读取的扇区块的起始绝对线性扇区号(总长度32位,低字节在前) */
} SectorRead; /* CMD1H_SEC_READ: 以扇区为单位从当前位置读取数据块 */
struct {
UINT8 mSectorCount; /* 输入参数: 请求写入的扇区数 */
/* 返回: 允许写入的扇区数 */
UINT8 mReserved1;
UINT8 mReserved2;
UINT8 mReserved3;
UINT32 mStartSector; /* 返回: 允许写入的扇区块的起始绝对线性扇区号(总长度32位,低字节在前) */
} SectorWrite; /* CMD1H_SEC_WRITE: 以扇区为单位在当前位置写入数据块 */
struct {
UINT32 mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数(总长度32位,低字节在前) */
} DiskCapacity; /* CMD0H_DISK_CAPACITY: 查询磁盘物理容量 */
struct {
UINT32 mTotalSector; /* 返回: 当前逻辑盘的总扇区数(总长度32位,低字节在前) */
UINT32 mFreeSector; /* 返回: 当前逻辑盘的剩余扇区数(总长度32位,低字节在前) */
UINT8 mDiskFat; /* 返回: 当前逻辑盘的FAT类型,1-FAT12,2-FAT16,3-FAT32 */
} DiskQuery; /* CMD_DiskQuery, 查询磁盘信息 */
BULK_ONLY_CBW DiskBocCbw; /* 输入参数: CBW命令结构 */
/* CMD0H_DISK_BOC_CMD: 对USB存储器执行BulkOnly传输协议的命令 */
struct {
UINT8 mMaxLogicUnit; /* 返回: USB存储器的最大逻辑单元号 */
} DiskMaxLun; /* CMD0H_DISK_MAX_LUN: 控制传输-获取USB存储器最大逻辑单元号 */
INQUIRY_DATA DiskInitInq; /* 返回: INQUIRY命令的返回数据 */
/* CMD0H_DISK_INIT: 初始化USB存储器 */
INQUIRY_DATA DiskInqData; /* 返回: INQUIRY命令的返回数据 */
/* CMD0H_DISK_INQUIRY: 查询USB存储器特性 */
SENSE_DATA ReqSenseData; /* 返回: REQUEST SENSE命令的返回数据 */
/* CMD0H_DISK_R_SENSE: 检查USB存储器错误 */
struct {
UINT32 mDiskSizeSec; /* 返回: 整个物理磁盘的总扇区数(总长度32位,高字节在前) */
} DiskSize; /* CMD0H_DISK_SIZE: 获取USB存储器的容量 */
struct {
UINT32 mStartSector; /* 输入参数: LBA扇区地址(总长度32位,低字节在前) */
UINT8 mSectorCount; /* 输入参数: 请求读取的扇区数 */
} DiskRead; /* CMD5H_DISK_READ: 从USB存储器读数据块(以扇区为单位) */
struct {
UINT32 mStartSector; /* 输入参数: LBA扇区地址(总长度32位,低字节在前) */
UINT8 mSectorCount; /* 输入参数: 请求写入的扇区数 */
} DiskWrite; /* CMD5H_DISK_WRITE: 向USB存储器写数据块(以扇区为单位) */
} CH376_CMD_DATA, *P_CH376_CMD_DATA;
#endif
/* ********************************************************************************************************************* */
/* 主机文件模式下的文件系统变量的地址 */
#ifndef VAR_FILE_SIZE
/* 8位/单字节变量 */
#define VAR_SYS_BASE_INFO 0x20 /* 当前系统的基本信息 */
/* 位6用于指示USB存储设备的子类别SubClass-Code, 位6为0则说明子类别为6, 位6为1则说明子类别是非6的其它值 */
/* 位5用于指示USB设备方式下的USB配置状态和USB主机方式下的USB设备连接状态 */
/* USB设备方式下, 位5为1则USB配置完成, 位5位0则尚未配置 */
/* USB主机方式下, 位5为1则USB端口存在USB设备, 位5位0则USB端口没有USB设备 */
/* 位4用于指示USB设备方式下的缓冲区锁定状态, 位4为1则说明USB缓冲区处于锁定状态, 位6为1则说明已经释放 */
/* 其它位, 保留,请勿修改 */
#define VAR_RETRY_TIMES 0x25 /* USB事务操作的重试次数 */
/* 位7为0则收到NAK时不重试, 位7为1位6为0则收到NAK时无限重试(可以用CMD_ABORT_NAK命令放弃重试), 位7为1位6为1则收到NAK时最多重试3秒 */
/* 位5~位0为超时后的重试次数 */
#define VAR_FILE_BIT_FLAG 0x26 /* 主机文件模式下的位标志 */
/* 位1和位0, 逻辑盘的FAT文件系统标志, 00-FAT12, 01-FAT16, 10-FAT32, 11-非法 */
/* 位2, 当前缓冲区中的FAT表数据是否被修改标志, 0-未修改, 1-已修改 */
/* 位3, 文件长度需要修改标志, 当前文件被追加数据, 0-未追加无需修改, 1-已追加需要修改 */
/* 其它位, 保留,请勿修改 */
#define VAR_DISK_STATUS 0x2B /* 主机文件模式下的磁盘及文件状态 */
#define VAR_SD_BIT_FLAG 0x30 /* 主机文件模式下SD卡的位标志 */
/* 位0, SD卡版本, 0-只支持SD第一版,1-支持SD第二版 */
/* 位1, 自动识别, 0-SD卡, 1-MMC卡 */
/* 位2, 自动识别, 0-标准容量SD卡, 1-大容量SD卡(HC-SD) */
/* 位4, ACMD41命令超时 */
/* 位5, CMD1命令超时 */
/* 位6, CMD58命令超时 */
/* 其它位, 保留,请勿修改 */
#define VAR_UDISK_TOGGLE 0x31 /* USB存储设备的BULK-IN/BULK-OUT端点的同步标志 */
/* 位7, Bulk-In端点的同步标志 */
/* 位6, Bulk-In端点的同步标志 */
/* 位5~位0, 必须为0 */
#define VAR_UDISK_LUN 0x34 /* USB存储设备的逻辑单元号 */
/* 位7~位4, USB存储设备的当前逻辑单元号,CH376初始化USB存储设备后,默认是访问0#逻辑单元 */
/* 位3~位0, USB存储设备的最大逻辑单元号,加1后等于逻辑单元数 */
#define VAR_SEC_PER_CLUS 0x38 /* 逻辑盘的每簇扇区数 */
#define VAR_FILE_DIR_INDEX 0x3B /* 当前文件目录信息在扇区内的索引号 */
#define VAR_CLUS_SEC_OFS 0x3C /* 当前文件指针在簇内的扇区偏移,为0xFF则指向文件末尾,簇结束 */
/* 32位/4字节变量 */
#define VAR_DISK_ROOT 0x44 /* 对于FAT16盘为根目录占用扇区数,对于FAT32盘为根目录起始簇号(总长度32位,低字节在前) */
#define VAR_DSK_TOTAL_CLUS 0x48 /* 逻辑盘的总簇数(总长度32位,低字节在前) */
#define VAR_DSK_START_LBA 0x4C /* 逻辑盘的起始绝对扇区号LBA(总长度32位,低字节在前) */
#define VAR_DSK_DAT_START 0x50 /* 逻辑盘的数据区域的起始LBA(总长度32位,低字节在前) */
#define VAR_LBA_BUFFER 0x54 /* 当前磁盘数据缓冲区的数据对应的LBA(总长度32位,低字节在前) */
#define VAR_LBA_CURRENT 0x58 /* 当前读写的磁盘起始LBA地址(总长度32位,低字节在前) */
#define VAR_FAT_DIR_LBA 0x5C /* 当前文件目录信息所在的扇区LBA地址(总长度32位,低字节在前) */
#define VAR_START_CLUSTER 0x60 /* 当前文件或者目录(文件夹)的起始簇号(总长度32位,低字节在前) */
#define VAR_CURRENT_CLUST 0x64 /* 当前文件的当前簇号(总长度32位,低字节在前) */
#define VAR_FILE_SIZE 0x68 /* 当前文件的长度(总长度32位,低字节在前) */
#define VAR_CURRENT_OFFSET 0x6C /* 当前文件指针,当前读写位置的字节偏移(总长度32位,低字节在前) */
#endif
/* ********************************************************************************************************************* */
/* 常用USB定义 */
/* USB的包标识PID, 主机方式可能用到 */
#ifndef DEF_USB_PID_SETUP
#define DEF_USB_PID_NULL 0x00 /* 保留PID, 未定义 */
#define DEF_USB_PID_SOF 0x05
#define DEF_USB_PID_SETUP 0x0D
#define DEF_USB_PID_IN 0x09
#define DEF_USB_PID_OUT 0x01
#define DEF_USB_PID_ACK 0x02
#define DEF_USB_PID_NAK 0x0A
#define DEF_USB_PID_STALL 0x0E
#define DEF_USB_PID_DATA0 0x03
#define DEF_USB_PID_DATA1 0x0B
#define DEF_USB_PID_PRE 0x0C
#endif
/* USB请求类型, 外置固件模式可能用到 */
#ifndef DEF_USB_REQ_TYPE
#define DEF_USB_REQ_READ 0x80 /* 控制读操作 */
#define DEF_USB_REQ_WRITE 0x00 /* 控制写操作 */
#define DEF_USB_REQ_TYPE 0x60 /* 控制请求类型 */
#define DEF_USB_REQ_STAND 0x00 /* 标准请求 */
#define DEF_USB_REQ_CLASS 0x20 /* 设备类请求 */
#define DEF_USB_REQ_VENDOR 0x40 /* 厂商请求 */
#define DEF_USB_REQ_RESERVE 0x60 /* 保留请求 */
#endif
/* USB标准设备请求, RequestType的位6位5=00(Standard), 外置固件模式可能用到 */
#ifndef DEF_USB_GET_DESCR
#define DEF_USB_CLR_FEATURE 0x01
#define DEF_USB_SET_FEATURE 0x03
#define DEF_USB_GET_STATUS 0x00
#define DEF_USB_SET_ADDRESS 0x05
#define DEF_USB_GET_DESCR 0x06
#define DEF_USB_SET_DESCR 0x07
#define DEF_USB_GET_CONFIG 0x08
#define DEF_USB_SET_CONFIG 0x09
#define DEF_USB_GET_INTERF 0x0A
#define DEF_USB_SET_INTERF 0x0B
#define DEF_USB_SYNC_FRAME 0x0C
#endif
/* *************************************************************************** */
#ifdef __cplusplus
}
#endif
#endif
/************************************ End *************************************/
+170
View File
@@ -0,0 +1,170 @@
/****************************** (C) COPYRIGHT 2011 YQDZ **************************
* 文 件 名 : FILE_SYS.H
* 作 者 : 亿全电子
* FAE现场应用工程师 QQ:1027413631
* 7*24小时技术支持电话:15366066738
* http://shop57138657.taobao.com/
* 版 本 : V1.0
* 日 期 : 2011/08/29
* 描 述 : CH376芯片 文件系统层 V1.0
* 提供文件系统常用子程序,提供命令打包.
* 不使用的子程序可以注释掉,从而节约单片机的程序ROM空间和数据
* RAM空间.
* 这里的子程序是通过括号中的变量传递参数,如果参数较多,为了节
* 约RAM,也可以参考CH375子程序库改成通过同一全局变量/联合结构
* CH376_CMD_DATA传递.
*********************************************************************************/
/* name 参数是指短文件名, 可以包括根目录符, 但不含有路径分隔符, 总长度不超过1+8+1+3+1字节 */
/* PathName 参数是指全路径的短文件名, 包括根目录符、多级子目录及路径分隔符、文件名/目录名 */
/* LongName 参数是指长文件名, 以UNICODE小端顺序编码, 以两个0字节结束, 使用长文件名子程序必须先定义全局缓冲区GlobalBuf, 长度不小于64字节, 可以与其它子程序共用 */
/* 定义 NO_DEFAULT_CH376_INT 用于禁止默认的Wait376Interrupt子程序,禁止后,应用程序必须自行定义一个同名子程序 */
/* 定义 DEF_INT_TIMEOUT 用于设置默认的Wait376Interrupt子程序中的等待中断的超时时间/循环计数值, 0则不检查超时而一直等待 */
/* 定义 EN_DIR_CREATE 用于提供新建多级子目录的子程序,默认是不提供 */
/* 定义 EN_DISK_QUERY 用于提供磁盘容量查询和剩余空间查询的子程序,默认提供 */
/* 定义 EN_SECTOR_ACCESS 用于提供以扇区为单位读写文件的子程序,默认是不提供 */
/* 定义 EN_LONG_NAME 用于提供支持长文件名的子程序,默认是不提供 */
#ifndef __FILE_SYS_H__
#define __FILE_SYS_H__
#define ERR_USB_UNKNOWN 0xFA /* 未知错误,不应该发生的情况,需检查硬件或者程序错误 */
#define STRUCT_OFFSET( s, m ) ( (u8)( & ((s *)0) -> m ) ) /* 定义获取结构成员相对偏移地址的宏 */
#ifdef EN_LONG_NAME
#ifndef LONG_NAME_BUF_LEN
#define LONG_NAME_BUF_LEN ( LONG_NAME_PER_DIR * 20 ) /* 自行定义的长文件名缓冲区长度,最小值为LONG_NAME_PER_DIR*1 */
#endif
#endif
#define CH376_EN GPIO_SetBits(GPIOB,GPIO_Pin_12);
#define CH376_DIS GPIO_ResetBits(GPIOB,GPIO_Pin_12);GPIO_SetBits(GPIOD,GPIO_Pin_12);
#define CH376_INT GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
void CH376_PORT_INIT( void ); /* CH376通讯接口初始化 */
void xEndCH376Cmd( void ); /* 结束SPI命令 */
void xWriteCH376Cmd( u8 mCmd ); /* 向CH376写命令 */
void xWriteCH376Data( u8 mData ); /* 向CH376写数据 */
u8 xReadCH376Data( void ); /* 从CH376读数据 */
u8 Query376Interrupt( void ); /* 查询CH376中断(INT#引脚为低电平) */
u8 mInitCH376Host( void ); /* 初始化CH376 */
u8 SPIx_ReadWriteByte(u8 TxData);//SPI总线读写一个字节
u8 CH376ReadBlock( u8* buf ); /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */
u8 CH376WriteReqBlock( u8 * buf ); /* 向内部指定缓冲区写入请求的数据块,返回长度 */
void CH376WriteHostBlock( u8 * buf, u8 len ); /* 向USB主机端点的发送缓冲区写入数据块 */
void CH376WriteOfsBlock( u8 * buf, u8 ofs, u8 len ); /* 向内部缓冲区指定偏移地址写入数据块 */
void CH376SetFileName( u8 * name ); /* 设置将要操作的文件的文件名 */
u32 CH376Read32bitDat( void ); /* 从CH376芯片读取32位的数据并结束命令 */
u8 CH376ReadVar8( u8 var ); /* 读CH376芯片内部的8位变量 */
void CH376WriteVar8( u8 var, u8 dat ); /* 写CH376芯片内部的8位变量 */
u32 CH376ReadVar32( u8 var ); /* 读CH376芯片内部的32位变量 */
void CH376WriteVar32( u8 var, u32 dat ); /* 写CH376芯片内部的32位变量 */
void CH376EndDirInfo( void ); /* 在调用CH376DirInfoRead获取FAT_DIR_INFO结构之后应该通知CH376结束 */
u32 CH376GetFileSize( void ); /* 读取当前文件长度 */
u8 CH376GetDiskStatus( void ); /* 获取磁盘和文件系统的工作状态 */
u8 CH376GetIntStatus( void ); /* 获取中断状态并取消中断请求 */
#ifndef NO_DEFAULT_CH376_INT
u8 Wait376Interrupt( void ); /* 等待CH376中断(INT#低电平),返回中断状态码, 超时则返回ERR_USB_UNKNOWN */
#endif
u8 CH376SendCmdWaitInt( u8 mCmd ); /* 发出命令码后,等待中断 */
u8 CH376SendCmdDatWaitInt( u8 mCmd, u8 mDat ); /* 发出命令码和一字节数据后,等待中断 */
u8 CH376DiskReqSense( void ); /* 检查USB存储器错误 */
u8 CH376DiskConnect( void ); /* 检查U盘是否连接,不支持SD卡 */
u8 CH376DiskMount( void ); /* 初始化磁盘并测试磁盘是否就绪 */
u8 CH376FileOpen( u8 * name ); /* 在根目录或者当前目录下打开文件或者目录(文件夹) */
u8 CH376FileCreate( u8 * name ); /* 在根目录或者当前目录下新建文件,如果文件已经存在那么先删除 */
u8 CH376DirCreate( u8 * name ); /* 在根目录下新建目录(文件夹)并打开,如果目录已经存在那么直接打开 */
u8 CH376SeparatePath( u8 * path ); /* 从路径中分离出最后一级文件名或者目录(文件夹)名,返回最后一级文件名或者目录名的字节偏移 */
u8 CH376FileOpenDir( u8 * PathName, u8 StopName ); /* 打开多级目录下的文件或者目录的上级目录,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */
/* StopName 指向最后一级文件名或者目录名 */
u8 CH376FileOpenPath( u8 * PathName ); /* 打开多级目录下的文件或者目录(文件夹),支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */
u8 CH376FileCreatePath( u8 * PathName ); /* 新建多级目录下的文件,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */
#ifdef EN_DIR_CREATE
u8 CH376DirCreatePath( u8 * PathName ); /* 新建多级目录下的目录(文件夹)并打开,支持多级目录路径,支持路径分隔符,路径长度不超过255个字符 */
#endif
u8 CH376FileErase( u8 * PathName ); /* 删除文件,如果已经打开则直接删除,否则对于文件会先打开再删除,支持多级目录路径 */
u8 CH376FileClose( u8 UpdateSz ); /* 关闭当前已经打开的文件或者目录(文件夹) */
u8 CH376DirInfoRead( void ); /* 读取当前文件的目录信息 */
u8 CH376DirInfoSave( void ); /* 保存文件的目录信息 */
u8 CH376ByteLocate( u32 offset ); /* 以字节为单位移动当前文件指针 */
u8 CH376ByteRead( u8 * buf, UINT16 ReqCount, PUINT16 RealCount ); /* 以字节为单位从当前位置读取数据块 */
u8 CH376ByteWrite( u8 * buf, UINT16 ReqCount, PUINT16 RealCount ); /* 以字节为单位向当前位置写入数据块 */
u8 CH376DiskCapacity( u32 * DiskCap ); /* 查询磁盘物理容量,扇区数 */
u8 CH376DiskQuery( u32 * DiskFre ); /* 查询磁盘剩余空间信息,扇区数 */
u8 CH376SecLocate( u32 offset ); /* 以扇区为单位移动当前文件指针 */
#ifdef EN_SECTOR_ACCESS
u8 CH376DiskReadSec( u8 * buf, u32 iLbaStart, u8 iSectorCount ); /* 从U盘读取多个扇区的数据块到缓冲区,不支持SD卡 */
u8 CH376DiskWriteSec( u8 * buf, u32 iLbaStart, u8 iSectorCount ); /* 将缓冲区中的多个扇区的数据块写入U盘,不支持SD卡 */
u8 CH376SecRead( u8 * buf, u8 ReqCount, u8 * RealCount ); /* 以扇区为单位从当前位置读取数据块,不支持SD卡 */
u8 CH376SecWrite( u8 * buf, u8 ReqCount, u8 * RealCount ); /* 以扇区为单位在当前位置写入数据块,不支持SD卡 */
#endif
#ifdef EN_LONG_NAME
u8 CH376LongNameWrite( u8 * buf, UINT16 ReqCount ); /* 长文件名专用的字节写子程序 */
u8 CH376CheckNameSum( u8 * DirName ); /* 计算长文件名的短文件名检验和,输入为无小数点分隔符的固定11字节格式 */
u8 CH376LocateInUpDir( u8 * PathName ); /* 在上级目录(文件夹)中移动文件指针到当前文件目录信息所在的扇区 */
/* 另外,顺便将当前文件目录信息所在的扇区的前一个扇区的LBA地址写入CH376内部VAR_FAT_DIR_LBA变量(为了方便收集长文件名时向前搜索,否则要多移动一次) */
/* 使用了全局缓冲区GlobalBuf的前12个字节 */
u8 CH376GetLongName( u8 * PathName, u8 * LongName ); /* 由短文件名或者目录(文件夹)名获得相应的长文件名 */
/* 需要输入短文件名的完整路径PathName,需要提供缓冲区接收长文件名LongName(以UNICODE小端编码,以双0结束) */
/* 使用了全局缓冲区GlobalBuf的前34个字节,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)+2 */
u8 CH376CreateLongName( u8 * PathName, u8 * LongName ); /* 新建具有长文件名的文件,关闭文件后返回,LongName输入路径必须在RAM中 */
/* 需要输入短文件名的完整路径PathName(请事先参考FAT规范由长文件名自行产生),需要输入以UNICODE小端编码的以双0结束的长文件名LongName */
/* 使用了全局缓冲区GlobalBuf的前64个字节,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)*2 */
#endif
#endif
File diff suppressed because it is too large Load Diff
+242
View File
@@ -0,0 +1,242 @@
#include "config.h" //全局声明
//===========================================================================
//Subroutine: iic_init
//IIC初始化
//===========================================================================
//void delay_us(unsigned int Counter)
//{
// uint32_t count;
// while (Counter--)
// {
// count = 42; // 根据主频和编译器调整该值
// while (count--)
// {
// __asm__ volatile("nop"); // 确保不被优化
// }
// }
//}
void DS1307_Init()
{
u8 i = 0;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = iic_scl|iic_sda;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(iic_gpio, &GPIO_InitStructure);
GPIO_SetBits(iic_gpio,iic_scl|iic_sda);
TXHData.CTIMEReadTimer.Init = 0; //清除初始化标志
TXHData.CTIMEReadTimer.Flag = 0; //清除到时标志
TXHData.CTIMEReadTimer.ON_OFF = 1; //打开
TXHData.CTIMEReadTimer.Cycle = 1; //设置为循环模式,发送时启动
TXHData.CTIMEReadTimer.TimerCountMax = 500;//周期0.5秒
DS1307_Read();
if(TXHData.CTIME.Sec > 0x59)
{
//TXHData.PREXDATA_WaitUpNummber = 0;
TXHData.CTIME.Year = 0x24;//年
TXHData.CTIME.Month = 0x08;//月
TXHData.CTIME.Day = 0x30;//日
//TXHData.CTIME.Week = 0x02;//周
TXHData.CTIME.Hour = 0x14;//时
TXHData.CTIME.Min = 0x20;//分
TXHData.CTIME.Sec = 0x00;//秒
DS1307_Write();
}
}
//===========================================================================
//Subroutine: iic_start
//IIC数据传送启动信号
//SCL为高电平的时候,SDA下降沿
//===========================================================================
void iic_start(void)
{
iic_sdaout(); //SDA线输出
GPIO_SetBits(iic_gpio,iic_sda); //SDA为高电平
GPIO_SetBits(iic_gpio,iic_scl); //SCL为高电平
delay_us(4);
GPIO_ResetBits(iic_gpio,iic_sda); //SDA下降沿
}
//===========================================================================
//Subroutine: iic_stop
//IIC数据传送停止信号
//SCL为高电平时,SDA上升沿
//===========================================================================
void iic_stop(void)
{
iic_sdaout(); //SDA线输出
GPIO_ResetBits(iic_gpio,iic_sda); //SDA为低电平
delay_us(4);
GPIO_SetBits(iic_gpio,iic_scl); //SCL高电平
GPIO_SetBits(iic_gpio,iic_sda); //SDA上升沿,I2C总线数据传送结束信号
}
//===========================================================================
//Subroutine: iic_wait4ack
//IIC等待应答
//返回值:1,接收应答失败
// 0,接收应答成功
//===========================================================================
u8 iic_wait4ack(void)
{
u8 times=0;
iic_sdain(); //SDA设置为输入
GPIO_SetBits(iic_gpio,iic_sda);//sda发送高点平
delay_us(1);
GPIO_SetBits(iic_gpio,iic_scl); //时钟高电平,上升沿
delay_us(1);
while(GPIO_ReadInputDataBit(iic_gpio, iic_sda)) //读数据,直到从机给出应答
{
if(++times>IICWAITTIMEOUT)
{
iic_stop(); //无应答,停止
return 1;
}
}
GPIO_ResetBits(iic_gpio,iic_scl);//时钟输出低电平,下降沿
return 0;
}
//===========================================================================
//Subroutine: iic_act 产生应答
//表示将继续接收数据
//===========================================================================
void iic_ack(void)
{
GPIO_ResetBits(iic_gpio,iic_scl); //时钟低电平
iic_sdaout();
GPIO_ResetBits(iic_gpio,iic_sda); //数据低电平,表示有应答
delay_us(2);
GPIO_SetBits(iic_gpio,iic_scl); //时钟上升沿
delay_us(2);
GPIO_ResetBits(iic_gpio,iic_scl); //时钟下降沿
}
//===========================================================================
//Subroutine: iic_noact 无应答或否认应答
//表示不再接收数据
//===========================================================================
void iic_noack(void)
{
GPIO_ResetBits(iic_gpio,iic_scl); //时钟低电平
iic_sdaout();
GPIO_SetBits(iic_gpio,iic_sda); //数据高电平,表示无应答
delay_us(2);
GPIO_SetBits(iic_gpio,iic_scl); //时钟上升沿
delay_us(2);
GPIO_ResetBits(iic_gpio,iic_scl); //时钟下降沿
}
//===========================================================================
//Subroutine: iic_sendbyte
//IIC发送一个字节
//===========================================================================
void iic_sendbyte(u8 txd)
{
u8 t;
iic_sdaout(); //SDA设置为输出,因为要发送数据
GPIO_ResetBits(iic_gpio,iic_scl); //时钟低电平,只有SCL为低才可改变数据
for(t=0;t<8;t++)//循环发送8个字节
{
if ((txd&0x80)>>7) GPIO_SetBits(iic_gpio,iic_sda); //发出第7-t位
else GPIO_ResetBits(iic_gpio,iic_sda);
txd<<=1;
delay_us(2);
GPIO_SetBits(iic_gpio,iic_scl); //拉高SCL,发数据
delay_us(2);
GPIO_ResetBits(iic_gpio,iic_scl); //SCL恢复低电平,准备修改SDA
delay_us(2);
}
}
//===========================================================================
//Subroutine: iic_readbyte
//读1个字节,ack=1时,读之后发送ACKack=0,读者后发送nACK
//===========================================================================
u8 iic_readbyte(u8 ack)
{
unsigned char i,receive=0;
iic_sdain();//准备接收数据,SDA设置为输入
for(i=0;i<8;i++ ) //循环接收8位
{
GPIO_ResetBits(iic_gpio,iic_scl); //SCL为低电平
delay_us(2);
GPIO_SetBits(iic_gpio,iic_scl); //SCL上升沿,开始读取数据
receive<<=1;
if(GPIO_ReadInputDataBit(iic_gpio, iic_sda)) //读取数据
receive|=0x01; //如果读到的数据为1,receive最低位应为1
delay_us(1);
}
if (ack) //如果需要应答
iic_ack();//发送应答
else
iic_noack(); //发送无应答
return receive;
}
//===========================================================================
//在指定地址读出一个数据
//返回值 :读到的数据
//===========================================================================
void DS1307_Read(void)//93us
{
u8 temp[7],i;
iic_start(); //启动
iic_sendbyte(0XD0); //发送器件地址0XD0
iic_wait4ack(); //等待应答
iic_sendbyte(0); //发送字地址
iic_wait4ack(); //等待应答
iic_start(); //产生一个起动条件
iic_sendbyte(0XD1); //发送地址0XD1进入接收模式
iic_wait4ack(); //等待应答
for (i = 0;i < 7;i ++)
{
if (i < 6)
temp[i] = iic_readbyte(1);
else
temp[i] = iic_readbyte(0);
}
iic_stop(); //产生一个停止条件
TXHData.CTIME.Year = temp[6];//年
TXHData.CTIME.Month = temp[5];//月
TXHData.CTIME.Day = temp[4];//日
TXHData.CTIME.Hour = temp[2];//时
TXHData.CTIME.Min = temp[1];//分
TXHData.CTIME.Sec = temp[0];//秒
}
//===========================================================================
//在指定地址写一个数据
//返回值 :无
//===========================================================================
void DS1307_Write(void)
{
u8 i = 0,temp[7];
temp[0]= TXHData.CTIME.Sec;
temp[1]= TXHData.CTIME.Min;
temp[2]= TXHData.CTIME.Hour;
temp[3]= 0x01;
temp[4]= TXHData.CTIME.Day;
temp[5]= TXHData.CTIME.Month;
temp[6]= TXHData.CTIME.Year;
iic_start();
iic_sendbyte(0XD0); //发送器件地址0XD0
iic_wait4ack(); //等待应答
iic_sendbyte(0x00); //发送字地址
iic_wait4ack(); //等待应答
for(i = 0;i < 7;i ++)
{
iic_sendbyte(temp[i]); //发送字节
iic_wait4ack(); //等待应答
}
iic_stop(); //产生一个停止条件
}
+32
View File
@@ -0,0 +1,32 @@
#ifndef __DS1307_H
#define __DS1307_H
//==============================================================================
//macro: iic_sdain iic_sdaout
//设置sda为输入或输出
//方法: 设置CRL 高4位为 1000 位7 sda 上下拉输入
// 设置CRL 高4位为 0011 位7 sda 推挽输出 最高频率50M
//因为可以保证不会设置为AF
//==============================================================================
#define iic_sdain() GPIOF->MODER &= 0XFFFFF3FF;//
#define iic_sdaout() GPIOF->MODER |= 0X00000400;//
#define IICWAITTIMEOUT 250
#define iic_gpio GPIOF
#define iic_scl GPIO_Pin_4
#define iic_sda GPIO_Pin_5
//void delay_us(unsigned int Counter);
void DS1307_Init(void);
void iic_start(void);
void iic_stop(void);
u8 iic_wait4ack(void);
void iic_ack(void);
void iic_noack(void);
void iic_sendbyte(u8);
u8 iic_readbyte(unsigned char ack);
void DS1307_Read(void);
void DS1307_Write(void);
#endif
+39
View File
@@ -0,0 +1,39 @@
#include "config.h" //全局声明
void delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//用于配置延时函数
}
//延时函数:毫秒级别
void delay_ms(uint32_t nms)
{
uint32_t tmp;
while(nms--)
{
SysTick->LOAD = 168000000/8/1000; //计数初值,延时1ms
SysTick->VAL = 0; //清空当前值
SysTick->CTRL |= 0x1; //开始计数
while ((SysTick->CTRL & 0x00010000)==0);
SysTick->VAL = 0; //清空当前值
SysTick->CTRL &= 0; //关闭计数
}
}
//延时函数:微秒级别
void delay_us(uint32_t nus)
{
uint32_t tmp;
while(nus--)
{
SysTick->LOAD = 168000000/8/1000000; //计数初值,延时1us
SysTick->VAL = 0; //清空当前值
SysTick->CTRL |= 0x1; //开始计数
while ((SysTick->CTRL & 0x00010000)==0);
SysTick->VAL = 0; //清空当前值
SysTick->CTRL &= 0; //关闭计数
}
}
+10
View File
@@ -0,0 +1,10 @@
#ifndef _DELAY_H_
#define _DELAY_H_
#include "stm32f4xx.h"
void delay_init(void) ;
void delay_ms(uint32_t nms);
void delay_us(uint32_t nus);
#endif
+436
View File
@@ -0,0 +1,436 @@
/*C*****************************************************************************
* NAME: fRamDrive.c
*-------------------------------------------------------------------------------
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
//#define FRAM_INIT
#include "config.h" //全局声明
volatile s_uniGlobal_Typedef s_uniGlobal;
//参数初始化====================================================================
//密码
const u8 initFRam_Flag = 0x38;
const PrintInfo_Type InitPrintInfo={
" Ho So Giao Dich ",//交易记录
"TEN CUA HANG: ",//地址
"DIA CHI: ",//税号
"MA SO THUE: ",//
" ",
" ",
"SO VOL: ",//抢号
"SO TIEN: ",//金额
"SO LIT: ",//加油量
"DONGIA: ",//单价
" ",
"NGAY: ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"CAM ON & HEN GAP LAI QUY KHACH !",
};
const MD_Port_Data_Type InitMD_Port_Data = {
//BaudRate StopBits Parity_Even POSType GunNumber MBCountTime Display_Type
{ 9600, 1, 0, 0, 0, 10, 0 ,MD_RS485,{0,0,0,0,0,0,0,0,0,0}},
{//Num Addr State Standby[35]
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
}
};
/*typedef struct
{
char CMD_SOCKA[50];
char IMEI[20];
char APN[40];
char WiFIName[40];
char WiFIPassWord[20];
}WirelessData_Type;*/
//Tast URL http://test.joyfueling.com:8012/
// http://3.92.208.210:7011/
const POSData_Type InitPOSData={
//
//{"AT+SOCKA=TCP,3.92.208.210,7011\r\n"},POS_Connect_Typ_Station};
{"joyfuel.joyfueling.com,7011","","","KFB-2.4G","KFB123456"},POS_Connect_Typ_Station};
const u8 InitMD_Port_Num_Top = 0;
const ROM_UpData_Type InitROM_UpData = {{0x06},900};//主程序最大450K
const u32 InitPREXDATA_WaitUpNummber = 0;
const u32 InitPREXDATA_TTC = 0;
const PREXDATA_Type initPrintLastRecord= {0,0,0,0,0,0,0,0,0};
const POSNetSetState_TypeDef InitPOSNetSetState;
const MD_Multiplex_Port_Data_Type InitMD_Multiplex_Port_Data;//端口5,多路复用口PREXDATA_NowFrameLen
const WhiteList_Type InitWhiteList;
const PREXDATA_Upload_Type InitPREXDATA_Upload;
//==============================================================================
const framDataIndex FDITab[] =
{ ///FRAM数据1区(数据操作相对不频烦)
/// pInitData; upData pData firstAdr; len; Group Tpye; //(注意,校验增加在数据包尾)
{(u8*)&initFRam_Flag, (u8*)(&buf_FRam_Flag), (u8*)(&TXHData.FRam_Flag), FRam_Flag_FADR, FRam_Flag_LEN, FRam_Flag_Group, CF_FRam_Flag},
{(u8*)&InitROM_UpData, (u8*)(&buf_ROM_UpData), (u8*)(&TXHData.ROM_UpData), ROM_UpData_FADR, ROM_UpData_LEN, ROM_UpData_Group, CF_ROM_UpData},
{(u8*)&InitMD_Port_Data, (u8*)(&buf_MD_Port_Data), (u8*)(&TXHData.MD_Port_Data), MD_Port_Data_FADR, MD_Port_Data_LEN, MD_Port_Data_Group, CF_MD_Port_Data},
{(u8*)&InitPOSData, (u8*)(&buf_POSData), (u8*)(&TXHData.POSData), POSData_FADR, POSData_LEN, POSData_Group, CF_POSData},
{(u8*)&InitMD_Port_Num_Top, (u8*)(&buf_MD_Port_Num_Top), (u8*)(&TXHData.MD_Port_Num_Top), MD_Port_Num_Top_FADR, MD_Port_Num_Top_LEN, MD_Port_Num_Top_Group, CF_MD_Port_Num_Top},
{(u8*)&InitPREXDATA_WaitUpNummber,(u8*)(&buf_PREXDATA_WaitUpNummber), (u8*)(&TXHData.PREXDATA_WaitUpNummber),PREXDATA_WaitUpNummber_FADR, PREXDATA_WaitUpNummber_LEN, PREXDATA_WaitUpNummber_Group, CF_PREXDATA_WaitUpNummber},
{(u8*)&InitPREXDATA_TTC, (u8*)(&buf_PREXDATA_TTC), (u8*)(&TXHData.PREXDATA_TTC), PREXDATA_TTC_FADR, PREXDATA_TTC_LEN, PREXDATA_TTC_Group, CF_PREXDATA_TTC},
{(u8*)&InitPrintInfo, (u8*)(&buf_PrintInfo), (u8*)(&TXHData.PrintInfo), PrintInfo_FADR, PrintInfo_LEN, PrintInfo_Group, CF_PrintInfo},
{(u8*)&initPrintLastRecord, (u8*)(&buf_PrintLastRecord), (u8*)(&TXHData.PrintLastRecord), PrintLastRecord_FADR, PrintLastRecord_LEN, PrintLastRecord_Group, CF_PrintLastRecord},
{(u8*)&InitPOSNetSetState, (u8*)(&buf_POSNetSetState), (u8*)(&TXHData.POSNetSetState), POSNetSetState_FADR, POSNetSetState_LEN, POSNetSetState_Group, CF_POSNetSetState},
{(u8*)&InitMD_Multiplex_Port_Data,(u8*)(&buf_MD_Multiplex_Port_Data), (u8*)(&TXHData.MD_Multiplex_Port_Data),MD_Multiplex_Port_Data_FADR, MD_Multiplex_Port_Data_LEN, MD_Multiplex_Port_Data_Group, CF_MD_Multiplex_Port_Data},
{(u8*)&InitWhiteList, (u8*)(&buf_WhiteList), (u8*)(&TXHData.WhiteList), WhiteList_FADR, WhiteList_LEN, WhiteList_Group, CF_WhiteList},
{(u8*)&InitPREXDATA_Upload, (u8*)(&buf_PREXDATA_Upload), (u8*)(&TXHData.PREXDATA_Upload), PREXDATA_Upload_FADR, PREXDATA_Upload_LEN, PREXDATA_Upload_Group, CF_PREXDATA_Upload},
};
////==============================================================================
//F*****************************************************************************
//* NAME: FRamDataCheck
//* PURPOSE: 校验函数
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 FRamDataCheck(volatile u8* pData, u16 len)
{
u8 result;
result = *pData;
while(len--)
{
result += *pData++;
};
return result;
}
/****************************************************
函数名:FM_IO_Configuration
功能 :FM存储部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void FM_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/*!< Configure SPI1 pins: SCK MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*!< Configure SPI1: MISO */
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //modi
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************************
函数名:FM_SPI_Configuration
功能 :FM存储部分用到的SPI初始化
参数 :无
返回值:无
****************************************************/
void FM_SPI_Configuration(void)
{
/* SPI1 configuration */
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//???
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8?????
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//?????SCK?1
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//??????2???????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//???
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//????
SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC???
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//????
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
/****************************************************
函数名:FM_SPI2_SendByte
功能 :FM存储部分用到的SPI发送函数
参数 dt 要发送的数据
返回值:无
****************************************************/
u8 FM_SPI1_SendByte(u8 dt)
{
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, dt);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
/****************************************************
函数名:FM_ReadData
功能 :读取指定地址的数据
参数 *pBuff:读取缓存
addr :读取的地址
Len :数据长度
返回值:无
****************************************************/
void FM_ReadData(u8 *pBuff,u32 addr,u16 Len)
{
u16 i = 0;
CLI();
FM_CS_EN;
FM_SPI1_SendByte(0x03);
FM_SPI1_SendByte((u8)(addr>>16));
FM_SPI1_SendByte((u8)(addr>>8));
FM_SPI1_SendByte((u8)addr);
for(i = 0;i < Len;i ++)
{
*pBuff = FM_SPI1_SendByte(0x00);
pBuff ++;
}
FM_CS_DIS;
SEI();
}
/****************************************************
函数名:FM_WriteData
功能 :写取指定地址的数据
参数 *pBuff:数据缓存
addr :写入的地址
Len :数据长度
返回值:无
****************************************************/
void FM_WriteData(u8 *pBuff,u32 addr,u16 Len)
{
u16 i = 0;
CLI();
FM_CS_EN;
FM_SPI1_SendByte(0x06);
FM_CS_DIS;
FM_CS_EN;
FM_SPI1_SendByte(0x02);
FM_SPI1_SendByte((u8)(addr>>16));
FM_SPI1_SendByte((u8)(addr>>8));
FM_SPI1_SendByte((u8)addr);
for(i = 0;i < Len;i ++)
{
FM_SPI1_SendByte(*pBuff);
pBuff ++;
}
FM_CS_DIS;
SEI();
}
/****************************************************
函数名:FM_Init
功能 FM存储部分初始化
参数 :无
返回值:无
****************************************************/
u16 iiii = 0;//搞不清楚,必须是全局变量才行(可能存在隐患,标注一下)
void FM_Init(void)
{
u16 i = 0,j = 0;
u8* pBuff;
u8 Temp_Buff[1300];
u8 Temp = 0;
u32 Fristflag = 0,delay = 0;
FM_IO_Configuration(); //FM相关IO初始化
FM_SPI_Configuration(); //FM相关SPI初始化
//for(delay = 0;delay<0xfffff;delay++);//无意义延时,等待铁电稳定
delay_ms(10);
pBuff = (u8*)&Fristflag;
{
FM_CS_EN;
FM_SPI1_SendByte(0x06); //写使能
FM_CS_DIS;
FM_CS_EN;
FM_SPI1_SendByte(0x01); //清除保护位
FM_SPI1_SendByte(0x00);
FM_CS_DIS;
}
if((FDITab[FramItemEnd - 1].firstAdr + FDITab[FramItemEnd - 1].len * FDITab[FramItemEnd - 1].Group) > 0x20000)
{
__breakpoint(0); // halt program execution here
while(1);
}
#ifdef FRAM_INIT //初始化
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机写入默认存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
for(j = 0;j < FDITab[iiii].len-checkLen_1;j ++)
Temp_Buff[j]=*(FDITab[iiii].upData+j) = *(FDITab[iiii].pInitData+j);
Temp = FRamDataCheck(Temp_Buff,FDITab[iiii].len - checkLen_1);
FM_WriteData(uniGlobal.Global,FDITab[iiii].firstAdr+FDITab[iiii].len*i, FDITab[iiii].len-checkLen_1);
FM_WriteData(&Temp, FDITab[iiii].firstAdr+FDITab[iiii].len+FDITab[iiii].len*i-checkLen_1,checkLen_1);
}
}
#endif
if(SWF8 == SWF_ON)
{
FM_Data_Init();
}
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机获取存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
if(FMItemRead(iiii,i) == 0)
{
}
}
}
TXHData.SystemErr = TXHData.PREXDATA_WaitUpNummber;
}
void PCBEncryption(void)
{
STM32CPU.v.id[0] = *(u32*)0x1fff7a10;
STM32CPU.v.id[1] = *(u32*)(0x1fff7a10 + 4);
STM32CPU.v.id[2] = *(u32*)(0x1fff7a10 + 8);
TXHData.Encryption[0] = CRC_Check(&STM32CPU.v.byte[0],6);
TXHData.Encryption[1] = CRC_Check(&STM32CPU.v.byte[1],6);
TXHData.Encryption[2] = CRC_Check(&STM32CPU.v.byte[2],8);
TXHData.Encryption[3] = CRC_Check(&STM32CPU.v.byte[3],8);
FM_WriteData((u8*)TXHData.Encryption,Encryption_FADR,sizeof(TXHData.Encryption));
}
void PCBEncryption_Check(void)
{
STM32CPU.v.id[0] = *(u32*)0x1fff7a10;
STM32CPU.v.id[1] = *(u32*)(0x1fff7a10 + 4);
STM32CPU.v.id[2] = *(u32*)(0x1fff7a10 + 8);
FM_ReadData((u8*)TXHData.Encryption,Encryption_FADR,sizeof(TXHData.Encryption));
if(TXHData.Encryption[0] != CRC_Check(&STM32CPU.v.byte[0],6)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[1] != CRC_Check(&STM32CPU.v.byte[1],6)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[2] != CRC_Check(&STM32CPU.v.byte[2],8)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[3] != CRC_Check(&STM32CPU.v.byte[3],8)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
}
void FM_Data_Init(void)
{
u16 i = 0,j = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
u8 BackTemp = 0;
FMItemRead(CF_ROM_UpData,0);
BackTemp = TXHData.ROM_UpData.ROM_UpData_State.State;//IAP初始化的时候用过了,不能重复初始化
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机写入默认存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
for(j = 0;j < FDITab[iiii].len-checkLen_1;j ++)
Temp_Buff[j]=*(FDITab[iiii].upData+j) = *(FDITab[iiii].pInitData+j);
Temp = FRamDataCheck(Temp_Buff,FDITab[iiii].len - checkLen_1);
FM_WriteData(uniGlobal.Global,FDITab[iiii].firstAdr+FDITab[iiii].len*i, FDITab[iiii].len-checkLen_1);
FM_WriteData(&Temp, FDITab[iiii].firstAdr+FDITab[iiii].len+FDITab[iiii].len*i-checkLen_1,checkLen_1);
}
}
TXHData.ROM_UpData.ROM_UpData_State.State = BackTemp;
FMItemWrite(CF_ROM_UpData,0);
}
u8 FMItemWrite(FramItem Type, u16 Group)
{
u16 i = 0,j = 0,k = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
if(Group >= FDITab[Type].Group)
return 0;
if(TXHData.PowerDown.State == 0 && FMItemRead(CF_FRam_Flag,0) == 1)
{
for(i = 0;i < FDITab[Type].len;i ++)
{
*(FDITab[Type].upData + i) = *(FDITab[Type].pData + i + (FDITab[Type].len-1)*Group);
Temp_Buff[i] = *(FDITab[Type].upData + i);
}
for(j = 0;j < 6;j ++)
{
FM_WriteData(uniGlobal.Global,FDITab[Type].firstAdr+FDITab[Type].len*Group,FDITab[Type].len-1);
Temp = FRamDataCheck(Temp_Buff,FDITab[Type].len - checkLen_1);
FM_WriteData(&Temp,FDITab[Type].firstAdr+FDITab[Type].len+FDITab[Type].len*Group-1,checkLen_1);
if(FMItemRead(Type,Group) == 1)
{
return 1;
}
delay_ms(100);
}
}
// pGun.ErrState[0].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
// pGun.ErrState[1].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
return 0;
}
u8 FMItemRead(FramItem Type, u16 Group)
{
volatile u16 ii = 0,j = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
if(Group >= FDITab[Type].Group)
return 0;
for(j = 0;j < 6;j ++)
{
/****************************/
FM_ReadData(uniGlobal.Global,FDITab[CF_FRam_Flag].firstAdr,1);
*(Temp_Buff) = *(FDITab[CF_FRam_Flag].upData);
if(*(Temp_Buff) == 0x38)
{
FM_ReadData(uniGlobal.Global,FDITab[Type].firstAdr+FDITab[Type].len*Group,FDITab[Type].len);
for(ii = 0;ii < FDITab[Type].len;ii ++)
*(Temp_Buff+ii) = *(FDITab[Type].upData+ii);
Temp = FRamDataCheck(Temp_Buff,FDITab[Type].len - checkLen_1);
if(Temp == Temp_Buff[FDITab[Type].len - checkLen_1])
{
for(ii = 0;ii < FDITab[Type].len - checkLen_1;ii ++)
{
*(FDITab[Type].pData+ii+(FDITab[Type].len-1)*Group) = *(FDITab[Type].upData+ii);
}
return 1;
}
}
delay_ms(100);
}
// pGun.ErrState[0].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
// pGun.ErrState[1].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
return 0;
}
+191
View File
@@ -0,0 +1,191 @@
#ifndef _FRam_H_
#define _FRam_H_
/******************************************************************************
* NAME: fRam.h
*******************************************************************************/
/*_____ M A C R O S __________________________________________________________*/
//端口
#define FM_CS_EN GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_SetBits(GPIOA, GPIO_Pin_4);
#define FM_CS_DIS GPIO_SetBits(GPIOA, GPIO_Pin_3);
//FM 命令
#define FM_WREN 0X06 //读写使能
#define FM_READ 0X03 //读命令
#define FM_WRITE 0X02 //写命令
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
/*_____ M A C R O S __________________________________________________________*/
//CONFIG(配置)
#define FRAM_SPACE_SIZE (0X800) ///定义铁电最大保存容量
#define FristStart_Addr 100
//******************************************************************************
// 存储器内容
#define uniGlobal s_uniGlobal.u
#define checkLen_1 1 ///如果数据组带有校验,增加1byte
//******************************************************************************
// FRAM_DATA_MAP
//加密验证数据
///全局缓冲中的值
///结构体定义
#define Encryption_FADR (80)
//存储器完好标致
///全局缓冲中的值
#define buf_FRam_Flag uniGlobal.FRam_Flag
///结构体定义
#define FRam_Flag_FADR (FristStart_Addr)
#define FRam_Flag_LEN (sizeof(buf_FRam_Flag) + checkLen_1)
#define FRam_Flag_Group 1 //组数
///全局缓冲中的值
#define buf_ROM_UpData uniGlobal.ROM_UpData
///结构体定义
#define ROM_UpData_FADR (FRam_Flag_FADR + FRam_Flag_LEN * FRam_Flag_Group)
#define ROM_UpData_LEN (sizeof(buf_ROM_UpData) + checkLen_1)
#define ROM_UpData_Group 1 //组数
//员工数据
///全局缓冲中的值
#define buf_MD_Port_Data uniGlobal.MD_Port_Data
///结构体定义
#define MD_Port_Data_FADR (ROM_UpData_FADR + ROM_UpData_LEN * ROM_UpData_Group)
#define MD_Port_Data_LEN (sizeof(buf_MD_Port_Data) + checkLen_1)
#define MD_Port_Data_Group 4 //组数
//员工数据
///全局缓冲中的值
#define buf_POSData uniGlobal.POSData
///结构体定义
#define POSData_FADR (MD_Port_Data_FADR + MD_Port_Data_LEN * MD_Port_Data_Group)
#define POSData_LEN (sizeof(buf_POSData) + checkLen_1)
#define POSData_Group 1 //组数
//员工数据
///全局缓冲中的值
#define buf_MD_Port_Num_Top uniGlobal.MD_Port_Num_Top
///结构体定义
#define MD_Port_Num_Top_FADR (POSData_FADR + POSData_LEN * POSData_Group)
#define MD_Port_Num_Top_LEN (sizeof(buf_MD_Port_Num_Top) + checkLen_1)
#define MD_Port_Num_Top_Group 1 //组数
///全局缓冲中的值
#define buf_PREXDATA_WaitUpNummber uniGlobal.PREXDATA_WaitUpNummber
///结构体定义
#define PREXDATA_WaitUpNummber_FADR (MD_Port_Num_Top_FADR + MD_Port_Num_Top_LEN * MD_Port_Num_Top_Group)
#define PREXDATA_WaitUpNummber_LEN (sizeof(buf_PREXDATA_WaitUpNummber) + checkLen_1)
#define PREXDATA_WaitUpNummber_Group 1 //组数
///全局缓冲中的值
#define buf_PREXDATA_TTC uniGlobal.PREXDATA_TTC
///结构体定义
#define PREXDATA_TTC_FADR (PREXDATA_WaitUpNummber_FADR + PREXDATA_WaitUpNummber_LEN * PREXDATA_WaitUpNummber_Group)
#define PREXDATA_TTC_LEN (sizeof(buf_PREXDATA_TTC) + checkLen_1)
#define PREXDATA_TTC_Group 1 //组数
///全局缓冲中的值
#define buf_PrintInfo uniGlobal.PrintInfo
///结构体定义
#define PrintInfo_FADR (PREXDATA_TTC_FADR + PREXDATA_TTC_LEN * PREXDATA_TTC_Group)
#define PrintInfo_LEN (sizeof(buf_PrintInfo) + checkLen_1)
#define PrintInfo_Group 1 //组数
///全局缓冲中的值
#define buf_PrintLastRecord uniGlobal.PrintLastRecord
///结构体定义
#define PrintLastRecord_FADR (PrintInfo_FADR + PrintInfo_LEN * PrintInfo_Group)
#define PrintLastRecord_LEN (sizeof(buf_PrintLastRecord) + checkLen_1)
#define PrintLastRecord_Group 64 //组数
///全局缓冲中的值
#define buf_POSNetSetState uniGlobal.POSNetSetState
///结构体定义
#define POSNetSetState_FADR (PrintLastRecord_FADR + PrintLastRecord_LEN * PrintLastRecord_Group)
#define POSNetSetState_LEN (sizeof(buf_POSNetSetState) + checkLen_1)
#define POSNetSetState_Group 1 //组数
///全局缓冲中的值
#define buf_MD_Multiplex_Port_Data uniGlobal.MD_Multiplex_Port_Data
///结构体定义
#define MD_Multiplex_Port_Data_FADR (POSNetSetState_FADR + POSNetSetState_LEN * POSNetSetState_Group)
#define MD_Multiplex_Port_Data_LEN (sizeof(buf_MD_Multiplex_Port_Data) + checkLen_1)
#define MD_Multiplex_Port_Data_Group 1 //组数
///全局缓冲中的值
#define buf_WhiteList uniGlobal.WhiteList
///结构体定义
#define WhiteList_FADR (MD_Multiplex_Port_Data_FADR + MD_Multiplex_Port_Data_LEN * MD_Multiplex_Port_Data_Group)
#define WhiteList_LEN (sizeof(buf_WhiteList) + checkLen_1)
#define WhiteList_Group 1 //组数
///全局缓冲中的值
#define buf_PREXDATA_Upload uniGlobal.PREXDATA_Upload
///结构体定义
#define PREXDATA_Upload_FADR (WhiteList_FADR + WhiteList_LEN * WhiteList_Group)
#define PREXDATA_Upload_LEN (sizeof(buf_PREXDATA_Upload) + checkLen_1)
#define PREXDATA_Upload_Group 1 //组数
typedef struct
{
union
{
u8 Global[1000]; //全局最大个数
u8 FRam_Flag;
MD_Port_Data_Type MD_Port_Data;
POSData_Type POSData;
u8 MD_Port_Num_Top;
ROM_UpData_Type ROM_UpData;
u32 PREXDATA_WaitUpNummber;
u32 PREXDATA_TTC;
PrintInfo_Type PrintInfo;
PREXDATA_Type PrintLastRecord;//越南打印每把枪最后一笔数据
POSNetSetState_TypeDef POSNetSetState;
MD_Multiplex_Port_Data_Type MD_Multiplex_Port_Data;//端口5,多路复用口
WhiteList_Type WhiteList;
PREXDATA_Upload_Type PREXDATA_Upload;
}u;
u8 CheckAdd;
}s_uniGlobal_Typedef; //存储器读写缓存共用体
typedef enum
{
CF_FRam_Flag,
CF_ROM_UpData,
CF_MD_Port_Data,
CF_POSData,
CF_MD_Port_Num_Top,
CF_PREXDATA_WaitUpNummber,
CF_PREXDATA_TTC,
CF_PrintInfo,
CF_PrintLastRecord,
CF_POSNetSetState,
CF_MD_Multiplex_Port_Data,
CF_WhiteList,
CF_PREXDATA_Upload,
FramItemEnd,
}FramItem;
//********************************************************************************
typedef struct
{
u8* pInitData;//初始化指针
u8* upData; //共用体数据缓存区指针
u8* pData; //pGun数据指针
u32 firstAdr; //第一地址
u16 len; //长度
u16 Group;
u8 Tpye; //类型
}framDataIndex;
void FM_Init(void);
u8 FMItemWrite(FramItem Type, u16 Group);
u8 FMItemRead(FramItem Type, u16 Group);
void FM_Data_Init(void);
void PCBEncryption(void);
void PCBEncryption_Check(void);
#endif
+445
View File
@@ -0,0 +1,445 @@
#ifndef _FRam_H_
#define _FRam_H_
/******************************************************************************
* NAME: fRam.h
*******************************************************************************/
/*_____ M A C R O S __________________________________________________________*/
//端口
#define FM_CS_EN GPIO_ResetBits(GPIOC, GPIO_Pin_6);
#define FM_CS_DIS GPIO_SetBits(GPIOC, GPIO_Pin_6);
#define FM_WP_EN GPIO_ResetBits(GPIOC, GPIO_Pin_7);
#define FM_WP_DIS GPIO_SetBits(GPIOC, GPIO_Pin_7);
//FM 命令
#define FM_WREN 0X06 //读写使能
#define FM_READ 0X03 //读命令
#define FM_WRITE 0X02 //写命令
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
/*_____ M A C R O S __________________________________________________________*/
//CONFIG(配置)
#define FRAM_SPACE_SIZE (0X800) ///定义铁电最大保存容量
#define FristStart_Addr 0
//******************************************************************************
// 存储器内容
#define uniGlobal s_uniGlobal.u
//******************************************************************************
// FRAM_DATA_MAP
//******************************************************************************
#define checkLen_1 0 ///如果数据组带有校验,增加1byte
//==============================================================================
//单价
///全局缓冲中的值
#define buf_Price uniGlobal.Price
///结构体定义
#define Price_FADR 100
#define Price_SADR FRAM_SPACE_SIZE/2+100
#define Price_LEN (sizeof(buf_Price) + checkLen_1)
#define Price_arrayNb gunNumber
//==============================================================================
//班累
///全局缓冲中的值
#define buf_M_SquadTop uniGlobal.M_SquadTop
///结构体定义
#define M_SquadTop_FADR (Price_FADR + Price_LEN)
#define M_SquadTop_SADR (Price_SADR + Price_LEN)
#define M_SquadTop_LEN (sizeof(buf_M_SquadTop) + checkLen_1)
#define M_SquadTop_arrayNb gunNumber
//==============================================================================
//班累
///全局缓冲中的值
#define buf_V_SquadTop uniGlobal.V_SquadTop
///结构体定义
#define V_SquadTop_FADR (M_SquadTop_FADR + M_SquadTop_LEN)
#define V_SquadTop_SADR (M_SquadTop_SADR + M_SquadTop_LEN)
#define V_SquadTop_LEN (sizeof(buf_V_SquadTop) + checkLen_1)
#define V_SquadTop_arrayNb gunNumber
//==============================================================================
//班累
///全局缓冲中的值
#define buf_S_SquadTop uniGlobal.S_SquadTop
///结构体定义
#define S_SquadTop_FADR (V_SquadTop_FADR + V_SquadTop_LEN)
#define S_SquadTop_SADR (V_SquadTop_SADR + V_SquadTop_LEN)
#define S_SquadTop_LEN (sizeof(buf_S_SquadTop) + checkLen_1)
#define S_SquadTop_arrayNb gunNumber
//体积总累
///全局缓冲中的值
#define buf_MassTop uniGlobal.MassTop
///结构体定义
#define MassTop_FADR (S_SquadTop_FADR + S_SquadTop_LEN)
#define MassTop_SADR (S_SquadTop_SADR + S_SquadTop_LEN)
#define MassTop_LEN (sizeof(buf_MassTop) + checkLen_1)
#define MassTop_arrayNb gunNumber
//质量总累
///全局缓冲中的值
#define buf_VolumeTop uniGlobal.VolumeTop
///结构体定义
#define VolumeTop_FADR (MassTop_FADR + MassTop_LEN)
#define VolumeTop_SADR (MassTop_SADR + MassTop_LEN)
#define VolumeTop_LEN (sizeof(buf_VolumeTop) + checkLen_1)
#define VolumeTop_arrayNb gunNumber
//金额总累
///全局缓冲中的值
#define buf_SaleTop uniGlobal.SaleTop
///结构体定义
#define SaleTop_FADR (VolumeTop_FADR + VolumeTop_LEN)
#define SaleTop_SADR (VolumeTop_SADR + VolumeTop_LEN)
#define SaleTop_LEN (sizeof(buf_SaleTop) + checkLen_1)
#define SaleTop_arrayNb gunNumber
//卸车总累
///全局缓冲中的值
#define buf_StockTop uniGlobal.StockTop
///结构体定义
#define StockTop_FADR (SaleTop_FADR + SaleTop_LEN)
#define StockTop_SADR (SaleTop_SADR + SaleTop_LEN)
#define StockTop_LEN (sizeof(buf_StockTop) + checkLen_1)
#define StockTop_arrayNb gunNumber
//小数点
///全局缓冲中的值
#define buf_Decimal uniGlobal.Decimal
///结构体定义
#define Decimal_FADR (StockTop_FADR + StockTop_LEN)
#define Decimal_SADR (StockTop_SADR + StockTop_LEN)
#define Decimal_LEN (sizeof(buf_Decimal) + checkLen_1)
#define Decimal_arrayNb gunNumber
//系统时间
///全局缓冲中的值
#define buf_SystemTime uniGlobal.SystemTime
///结构体定义
#define SystemTime_FADR (Decimal_FADR + Decimal_LEN)
#define SystemTime_SADR (Decimal_SADR + Decimal_LEN)
#define SystemTime_LEN (sizeof(buf_SystemTime) + checkLen_1)
#define SystemTime_arrayNb gunNumber
//流量计模式
///全局缓冲中的值
#define buf_GasWorkMode uniGlobal.GasWorkMode
///结构体定义
#define GasWorkMode_FADR (SystemTime_FADR + SystemTime_LEN)
#define GasWorkMode_SADR (SystemTime_SADR + SystemTime_LEN)
#define GasWorkMode_LEN (sizeof(buf_GasWorkMode) + checkLen_1)
#define GasWorkMode_arrayNb gunNumber
//脉冲当量
///全局缓冲中的值
#define buf_PulseEqu uniGlobal.PulseEqu
///结构体定义
#define PulseEqu_FADR (GasWorkMode_FADR + GasWorkMode_LEN)
#define PulseEqu_SADR (GasWorkMode_SADR + GasWorkMode_LEN)
#define PulseEqu_LEN (sizeof(buf_PulseEqu) + checkLen_1)
#define PulseEqu_arrayNb gunNumber
//密度
///全局缓冲中的值
#define buf_Density uniGlobal.Density
///结构体定义
#define Density_FADR (PulseEqu_FADR + PulseEqu_LEN)
#define Density_SADR (PulseEqu_SADR + PulseEqu_LEN)
#define Density_LEN (sizeof(buf_Density) + checkLen_1)
#define Density_arrayNb gunNumber
//最小显示量
///全局缓冲中的值
#define buf_MinDisp uniGlobal.MinDisp
///结构体定义
#define MinDisp_FADR (Density_FADR + Density_LEN)
#define MinDisp_SADR (Density_SADR + Density_LEN)
#define MinDisp_LEN (sizeof(buf_MinDisp) + checkLen_1)
#define MinDisp_arrayNb gunNumber
//提前关阀量
///全局缓冲中的值
#define buf_ValueTurnOff uniGlobal.ValueTurnOff
///结构体定义
#define ValueTurnOff_FADR (MinDisp_FADR + MinDisp_LEN)
#define ValueTurnOff_SADR (MinDisp_SADR + MinDisp_LEN)
#define ValueTurnOff_LEN (sizeof(buf_ValueTurnOff) + checkLen_1)
#define ValueTurnOff_arrayNb gunNumber
//过冲量
///全局缓冲中的值
#define buf_ValueOverShoot uniGlobal.ValueOverShoot
///结构体定义
#define ValueOverShoot_FADR (ValueTurnOff_FADR + ValueTurnOff_LEN)
#define ValueOverShoot_SADR (ValueTurnOff_SADR + ValueTurnOff_LEN)
#define ValueOverShoot_LEN (sizeof(buf_ValueOverShoot) + checkLen_1)
#define ValueOverShoot_arrayNb gunNumber
//时间计数器
///全局缓冲中的值
#define buf_TimeCount uniGlobal.TimeCount
///结构体定义
#define TimeCount_FADR (ValueOverShoot_FADR + ValueOverShoot_LEN)
#define TimeCount_SADR (ValueOverShoot_SADR + ValueOverShoot_LEN)
#define TimeCount_LEN (sizeof(buf_TimeCount) + checkLen_1)
#define TimeCount_arrayNb gunNumber
//当次加油数据
///全局缓冲中的值
#define buf_FuelRecord0 uniGlobal.FuelRecord0
///结构体定义
#define FuelRecord0_FADR (TimeCount_FADR + TimeCount_LEN)
#define FuelRecord0_SADR (TimeCount_SADR + TimeCount_LEN)
#define FuelRecord0_LEN (sizeof(buf_FuelRecord0) + checkLen_1)
#define FuelRecord0_arrayNb gunNumber
//前次加油数据
///全局缓冲中的值
#define buf_FuelRecord1 uniGlobal.FuelRecord1
///结构体定义
#define FuelRecord1_FADR (FuelRecord0_FADR + FuelRecord0_LEN)
#define FuelRecord1_SADR (FuelRecord0_SADR + FuelRecord0_LEN)
#define FuelRecord1_LEN (sizeof(buf_FuelRecord1) + checkLen_1)
#define FuelRecord1_arrayNb gunNumber
//限制加油次数
///全局缓冲中的值
#define buf_TriesLimit uniGlobal.TriesLimit
///结构体定义
#define TriesLimit_FADR (FuelRecord1_FADR + FuelRecord1_LEN)
#define TriesLimit_SADR (FuelRecord1_SADR + FuelRecord1_LEN)
#define TriesLimit_LEN (sizeof(buf_TriesLimit) + checkLen_1)
#define TriesLimit_arrayNb gunNumber
//流量计地址
///全局缓冲中的值
#define buf_GasAddr uniGlobal.GasAddr
///结构体定义
#define GasAddr_FADR (TriesLimit_FADR + TriesLimit_LEN)
#define GasAddr_SADR (TriesLimit_SADR + TriesLimit_LEN)
#define GasAddr_LEN (sizeof(buf_GasAddr) + checkLen_1)
#define GasAddr_arrayNb gunNumber
//流量计地址
///全局缓冲中的值
#define buf_GasAddr uniGlobal.GasAddr
///结构体定义
#define GasAddr_FADR (TriesLimit_FADR + TriesLimit_LEN)
#define GasAddr_SADR (TriesLimit_SADR + TriesLimit_LEN)
#define GasAddr_LEN (sizeof(buf_GasAddr) + checkLen_1)
#define GasAddr_arrayNb gunNumber
//比例系数
///全局缓冲中的值
#define buf_GasScaleCoefficients uniGlobal.GasScaleCoefficients
///结构体定义
#define GasScaleCoefficients_FADR (GasAddr_FADR + GasAddr_LEN)
#define GasScaleCoefficients_SADR (GasAddr_SADR + GasAddr_LEN)
#define GasScaleCoefficients_LEN (sizeof(buf_GasScaleCoefficients) + checkLen_1)
#define GasScaleCoefficients_arrayNb gunNumber
//密度
///全局缓冲中的值
#define buf_GasDensity uniGlobal.GasDensity
///结构体定义
#define GasDensity_FADR (GasScaleCoefficients_FADR + GasScaleCoefficients_LEN)
#define GasDensity_SADR (GasScaleCoefficients_SADR + GasScaleCoefficients_LEN)
#define GasDensity_LEN (sizeof(buf_GasDensity) + checkLen_1)
#define GasDensity_arrayNb gunNumber
///全局缓冲中的值
#define buf_GasPourTo1 uniGlobal.GasPourTo1
///结构体定义
#define GasPourTo1_FADR (GasDensity_FADR + GasDensity_LEN)
#define GasPourTo1_SADR (GasDensity_SADR + GasDensity_LEN)
#define GasPourTo1_LEN (sizeof(buf_GasPourTo1) + checkLen_1)
#define GasPourTo1_arrayNb gunNumber
//低中到高流速切换
///全局缓冲中的值
#define buf_GasPour1To2 uniGlobal.GasPour1To2
///结构体定义
#define GasPour1To2_FADR (GasPourTo1_FADR + GasPourTo1_LEN)
#define GasPour1To2_SADR (GasPourTo1_SADR + GasPourTo1_LEN)
#define GasPour1To2_LEN (sizeof(buf_GasPour1To2) + checkLen_1)
#define GasPour1To2_arrayNb gunNumber
//最大流速
///全局缓冲中的值
#define buf_GasFlowMax uniGlobal.GasFlowMax
///结构体定义
#define GasFlowMax_FADR (GasPour1To2_FADR + GasPour1To2_LEN)
#define GasFlowMax_SADR (GasPour1To2_SADR + GasPour1To2_LEN)
#define GasFlowMax_LEN (sizeof(buf_GasFlowMax) + checkLen_1)
#define GasFlowMax_arrayNb gunNumber
//最小流速
///全局缓冲中的值
#define buf_GasFlowMin uniGlobal.GasFlowMin
///结构体定义
#define GasFlowMin_FADR (GasFlowMax_FADR + GasFlowMax_LEN)
#define GasFlowMin_SADR (GasFlowMax_SADR + GasFlowMax_LEN)
#define GasFlowMin_LEN (sizeof(buf_GasFlowMin) + checkLen_1)
#define GasFlowMin_arrayNb gunNumber
//最大压力值
///全局缓冲中的值
#define buf_PressureMax uniGlobal.PressureMax
///结构体定义
#define PressureMax_FADR (GasFlowMin_FADR + GasFlowMin_LEN)
#define PressureMax_SADR (GasFlowMin_SADR + GasFlowMin_LEN)
#define PressureMax_LEN (sizeof(buf_PressureMax) + checkLen_1)
#define PressureMax_arrayNb gunNumber
//最小压力值
///全局缓冲中的值
#define buf_PressureMin uniGlobal.PressureMin
///结构体定义
#define PressureMin_FADR (PressureMax_FADR + PressureMax_LEN)
#define PressureMin_SADR (PressureMax_SADR + PressureMax_LEN)
#define PressureMin_LEN (sizeof(buf_PressureMin) + checkLen_1)
#define PressureMin_arrayNb gunNumber
//卡介质
///全局缓冲中的值
#define buf_Medium uniGlobal.Medium
///结构体定义
#define Medium_FADR (PressureMin_FADR + PressureMin_LEN)
#define Medium_SADR (PressureMin_SADR + PressureMin_LEN)
#define Medium_LEN (sizeof(buf_Medium) + checkLen_1)
#define Medium_arrayNb gunNumber
//显示类型设置
///全局缓冲中的值
#define buf_DispSet uniGlobal.DispSet
///结构体定义
#define DispSet_FADR (Medium_FADR + Medium_LEN)
#define DispSet_SADR (Medium_SADR + Medium_LEN)
#define DispSet_LEN (sizeof(buf_DispSet) + checkLen_1)
#define DispSet_arrayNb gunNumber
//补偿
///全局缓冲中的值
#define buf_Compensation uniGlobal.Compensation
///结构体定义
#define Compensation_FADR (DispSet_FADR + DispSet_LEN)
#define Compensation_SADR (DispSet_SADR + DispSet_LEN)
#define Compensation_LEN (sizeof(buf_Compensation) + checkLen_1)
#define Compensation_arrayNb gunNumber
//RTC时钟第一次开机标志
///全局缓冲中的值
#define buf_RTCTimer_Flag uniGlobal.RTCTimer_Flag
///结构体定义
#define RTCTimer_Flag_FADR (Compensation_FADR + Compensation_LEN)
#define RTCTimer_Flag_SADR (Compensation_SADR + Compensation_LEN)
#define RTCTimer_Flag_LEN (sizeof(buf_RTCTimer_Flag) + checkLen_1)
#define RTCTimer_Flag_arrayNb gunNumber
//RTC时钟备份
///全局缓冲中的值
#define buf_RTCTimer_BKB uniGlobal.RTCTimer_BKB
///结构体定义
#define RTCTimer_BKB_FADR (RTCTimer_Flag_FADR + RTCTimer_Flag_LEN)
#define RTCTimer_BKB_SADR (RTCTimer_Flag_SADR + RTCTimer_Flag_LEN)
#define RTCTimer_BKB_LEN (sizeof(buf_RTCTimer_BKB) + checkLen_1)
#define RTCTimer_BKB_arrayNb gunNumber
//存储器完好标致
///全局缓冲中的值
#define buf_FRam_Flag uniGlobal.FRam_Flag
///结构体定义
#define FRam_Flag_FADR (RTCTimer_BKB_FADR + RTCTimer_BKB_LEN)
#define FRam_Flag_SADR (RTCTimer_BKB_SADR + RTCTimer_BKB_LEN)
#define FRam_Flag_LEN (sizeof(buf_FRam_Flag) + checkLen_1)
#define FRam_Flag_arrayNb gunNumber
typedef struct
{
u32 volume; //volume与sale 必须连续,符个字符对齐首地址
u32 sale; //金额
u32 price; //单价
}s_FuelRecord_Typedef;
typedef struct
{
union
{
u8 Global[100]; //全局最大个数
u16 Price[gunNumber]; //单价
u64 M_SquadTop[gunNumber]; //班累
u64 V_SquadTop[gunNumber]; //班累
u64 S_SquadTop[gunNumber]; //班累
u64 MassTop[gunNumber]; //质量总累
u64 VolumeTop[gunNumber]; //体积总累
u64 SaleTop[gunNumber]; //金额总累
u64 StockTop[gunNumber]; //卸车总累
u8 Decimal[3]; //小数点 金额 体积 单价
u8 SystemTime[7]; //系统时间 年年 月 日 时 分 秒
u8 GasWorkMode[gunNumber]; //加气模式
u32 PulseEqu[gunNumber]; //脉冲当量
u32 Density[gunNumber]; //密度
u16 MinDisp[gunNumber]; //最小显示量
u8 ValueTurnOff[gunNumber][50]; //提前关阀量
int8_t ValueOverShoot[gunNumber][2]; //过冲量
u32 TimeCount; //时间计数器
s_FuelRecord_Typedef FuelRecord0[gunNumber];//当次加油数据
s_FuelRecord_Typedef FuelRecord1[gunNumber];//前次加油数据
u32 TriesLimit; //限制加油次数
/******************流量计相关*******************/
u8 GasAddr[gunNumber]; //当前地址0开始,按顺序,与抢号对应
u16 GasScaleCoefficients[gunNumber]; //比例系数
u16 GasDensity[gunNumber]; //密度
u8 GasPourTo1[gunNumber]; //低到中流速切换阀值0-5 默认 2 Kg/Min
u8 GasPour1To2[gunNumber]; //中到高流速切换阀值0-5 默认 1.5Kg/Min
u8 GasFlowMax[gunNumber]; //最大流速值0-90 默认 50Kg/Min
u8 GasFlowMin[gunNumber]; //最小流速值0-90 默认 50Kg/Min
/******************压力检测相关******************/
u16 PressureMax[gunNumber]; //最大允许压力0-40 默认20MPa
u16 PressureMin[gunNumber]; //最小允许压力
u16 Medium; //卡介质
u16 DispSet; //显示类型设置
float Compensation[gunNumber];//补偿
u8 RTCTimer_Flag; //RTC初次启动标志
u32 RTCTimer_BKB; //RTC计数备份
u8 FRam_Flag;
}u;
u8 CheckAdd;
}s_uniGlobal_Typedef; //存储器读写缓存共用体
typedef enum
{
CF_Price, //单价
CF_M_SquadTop, //质量班累
CF_V_SquadTop, //体积班累
CF_S_SquadTop, //金额班累
CF_MassTop, //质量总累
CF_VolumeTop, //体积总累
CF_SaleTop, //金额总累
CF_StockTop, //卸车总累
CF_Decimal, //小数点
CF_SystemTime, //系统时间
CF_GasWorkMode, //流量计模式
CF_PulseEqu, //脉冲当量
CF_Density, //密度
CF_MinDisp, //最小显示量
CF_ValueTurnOff, //提前关阀量
CF_ValueOverShoot, //过冲量
CF_TimeCount, //时间计数器
CF_FuelRecord0, //当次加油记录
CF_FuelRecord1, //前次加油记录
CF_TriesLimit, //限制加油次数
CF_GasAddr, //流量计地址
CF_GasScaleCoefficients, //流量计比例系数
CF_GasDensity, //流量计密度
CF_GasPourTo1, //低到中流速切换阀值0-5 默认 2 Kg/Min
CF_GasPour1To2, //低到中流速切换阀值0-5 默认 2 Kg/Min
CF_GasFlowMax, //最大流速值0-90 默认 50Kg/Min
CF_GasFlowMin, //最大流速值0-90 默认 50Kg/Min
CF_PressureMax, //最大允许压力0-40 默认20MPa
CF_Medium, //卡介质
CF_DispSet, //显示类型设置
CF_Compensation, //补偿
CF_RTCTimer_Flag,
CF_RTCTimer_BKB,
CF_FRam_Flag, //存储器出错标志
FramItemEnd,
}FramItem;
//********************************************************************************
typedef struct
{
u8* pInitData;//初始化指针
u8* upData; //共用体数据缓存区指针
u8* pData; //pGun数据指针
u16 firstAdr; //第一地址
u16 secondAdr;//第二地址
u8 len; //长度
u8 Tpye; //类型
}framDataIndex;
void FM_Init(void);
u8 FMItemWrite(FramItem Type);
u8 FMItemRead(FramItem Type);
void FM_Data_Init(void);
#endif
+403
View File
@@ -0,0 +1,403 @@
#include "config.h"
volatile u8 GPSConnectRXTask_Flag = 0;//GPSConnect接受任务标志位,1允许运行
volatile u8 GPSConnectTXTask_Flag = 0;//
volatile u8 GPSConnect_RX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 GPSConnect_TX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 GPSConnect_DMA_RX_Len = 23;
/*_____ D E F I N I T I O N __________________________________________________*/
u16 BigToLittle( u16 BigData)
{
return (BigData << 8 | BigData >> 8);
}
//u32 BigToLittle( u32 BigData)
//{
// union
// {
// u32 Temp;
// u8 Buff[4];
// }Dat;
//
// if(sizeof(BigData) == 2)
// return (BigData << 8 | BigData >> 8);
// else if(sizeof(BigData) == 4)
// {
// Dat.Buff[0] = (BigData >> 24) & 0xff;
// Dat.Buff[1] = (BigData >> 16) & 0xff;
// Dat.Buff[2] = (BigData >> 8) & 0xff;
// Dat.Buff[3] = (BigData >> 0) & 0xff;
// return (Dat.Temp);
// }
//}
/****************************************************
函数名:GPSConnect_IO_Configuration
功能 :GPSConnect卡通讯部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void GPSConnect_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GOIP配置结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
}
/****************************************************
函数名:GPSConnect_NVGPSConnect_Configuration
功能 :GPSConnect卡通讯部分用到的中断向量配置
参数 :无
返回值:无
****************************************************/
void GPSConnect_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream6_IRQn; //USART6_TX_DMA
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //USART??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
NVIC_Init(&NVIC_InitStructure); //??NVIC_InitStruct???????????NVIC???USART1
}
/****************************************************
函数名:GPSConnect_NVGPSConnect_Configuration
功能 :GPSConnect卡通讯部分用到的串口配置
参数 :无
返回值:无
****************************************************/
void GPSConnect_USART_Configuration(u32 BaudRate)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
USART_InitStructure.USART_BaudRate =BaudRate;// Baud;//?????
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART6, &USART_InitStructure);
USART_Cmd(USART6, ENABLE);
USART_ITConfig(USART6, USART_IT_IDLE, ENABLE);
USART_ClearFlag(USART6, USART_FLAG_IDLE);
USART_DMACmd(USART6, USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
}
/*************************************************
函数名 DMA_Configuration()
功能 DMA初始化
传入参数:无
返回值 :无
**************************************************/
void GPSConnect_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/*******************发送TX1*********************/
DMA_DeInit(DMA2_Stream6);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
//DMA_InitStructure.DMA_BufferSize = UART_DMA_SEND_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
//DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)MD_Connect_TX_Buff[0];
DMA_Init(DMA2_Stream6, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream6, DMA_IT_TC, ENABLE);
/*******************RX*********************/
DMA_DeInit(DMA2_Stream1);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 1000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)GPSConnect_RX_Buff;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream1, ENABLE);
}
//F*****************************************************************************
//* NAME: GPSConnect_TXDataCheck
//* PURPOSE: GPSConnect卡键盘通信校验函数
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 GPSConnect_TXDataCheck(volatile u8* pData, u8 len)
{
u8 result;
if(len == 0) len = 16;
result = *pData++;
do
{
result ^= *pData++;
}while(--len);
return result & 0x7f;
}
void GPSConnect_DMATX_IRQHandler(void)
{
u16 i = 0;
DMA_ClearFlag(DMA2_Stream6, DMA_IT_TCIF6);
GPSCount_TX_DMAStop(); //关闭DMA传输
while(! USART_GetFlagStatus(USART6, USART_FLAG_TC))NULL;
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
GPSCount_RX_DMAStart(); //打开DMA传输(Gas就收)长度在选择发送队列时设置
GPSConnectTXTask_Flag = 1;
}
//F*****************************************************************************
//* NAME: GPSConnect_DMARX_IRQHandler
//* PURPOSE: DMA传输完成中断,Gas ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void GPSConnect_DMARX_IRQHandler(void)
{
u8 i = 0;
u16 CRC_Temp = 0;
if(USART_GetITStatus(USART6, USART_IT_IDLE) != RESET)//?????????
{
USART_ClearFlag(USART6, USART_IT_IDLE);
GPSCount_RX_DMAStop(); //DMA接收
USART_ClearFlag(USART6, USART_IT_IDLE);
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
i = USART6->SR;
i = USART6->DR;
GPSCount_RX_DMALenSet(1000);//重置接受长度
GPSCount_RX_DMAStart();
GPSConnectRXTask_Flag = 1;
}
}
void StringToHex(u8 *Str,u8 *H,u8 Len)
{
u8 i = 0;
for(i = 0;i < Len;i += 2)
{
if(*(Str + i) > 0x39)
*(H + (i / 2)) = (*(Str + i) - 0x37) << 4;
else
*(H + (i / 2)) = (*(Str + i) - 0x30) << 4;
if(*(Str + i + 1) > 0x39)
*(H + (i / 2)) |= (*(Str + i + 1) - 0x37) & 0x0f;
else
*(H + (i / 2)) |= (*(Str + i + 1) - 0x30) & 0x0f;
}
}
u16 mystrstr(u8 *s1,u8 *s2)
{
int len2;
u16 i= 0;
if(!(len2=strlen(s2)))//此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
return 1;
for(;*s1;++s1)
{
i ++;
if(*s1==*s2 && strncmp(s1,s2,len2)==0)
return i;
}
return NULL;
}
//F*****************************************************************************
//* NAME: GPSConnect_Init
//* PURPOSE: GPSConnect通讯初始化
//* PARAMS: 无
//* return: 无
//******************************************************************************
char Bluetooth_AT_UART[]="AT+UART=9600\r\n ";
char Bluetooth_AT_NAME[]="AT+NAME=TXH_V1.1.2_0000\r\n ";
char Print_Language[]={0x1b,0x74,0x23};
void GPSConnect_Init(void)
{
u8 i = 0;
GPSConnect_IO_Configuration(); //流量计相关IO初始化
GPSConnect_USART_Configuration(115200); //相关串口初始化
GPSConnect_DMA_Configuration(); //流量计相关DMA初始化
GPSConnect_NVIC_Configuration(); //流量计相关中断初始化
TXHData.GPSDataTimer.Init = 0; //清除初始化标志
TXHData.GPSDataTimer.Flag = 0; //清除到时标志
TXHData.GPSDataTimer.ON_OFF = 1; //打开
TXHData.GPSDataTimer.Cycle = 1; //设置为循环模式,发送时启动
TXHData.GPSDataTimer.TimerCountMax = 10*1000;//10S
GPSCount_TX_DMAAddrSet((u32)Print_Language);
GPSCount_TX_DMALenSet(3);
GPSCount_TX_DMAStart();
// while(!GPSConnectTXTask_Flag);
// delay_ms(500);
// GPSConnect_USART_Configuration(9600);
// for(i = 0;i < 10;i ++)
// Bluetooth_AT_NAME[8+i] = BoxVersion[i];
// for(i = 0;i < 4;i ++)
// Bluetooth_AT_NAME[19+i] = TXHData.POSData.WirelessData.IMEI[16+i];
// GPSCount_TX_DMAAddrSet((u32)Bluetooth_AT_NAME);
// GPSCount_TX_DMALenSet(25);
// GPSCount_TX_DMAStart();
}
void GPSConnectTast(void)
{
u16 i = 0,j = 0,k = 0;
u32 Temp = 0;
u8 Buff[20];
u16 POS_ConnectRX_Len=0;
u16 POS_ConnectRX_CMD = 0;
if(GPSConnectRXTask_Flag == 1)
{
GPSConnectRXTask_Flag = 0;
if(GPSConnect_RX_Buff[0] == 0xF5) // 判断接收缓冲区中的第一个字节是否为 0xF5
{
POS_ConnectRX_Len = (GPSConnect_RX_Buff[1] << 8) | GPSConnect_RX_Buff[2]; // 提取长度码
Temp = CRC_Check(&GPSConnect_RX_Buff[0] , POS_ConnectRX_Len); // 计算数据包 CRC 校验码
if(Temp == ((GPSConnect_RX_Buff[POS_ConnectRX_Len] << 8) | GPSConnect_RX_Buff[POS_ConnectRX_Len + 1])) // 判断 CRC 校验码是否正确
{
POS_ConnectRX_CMD = GPSConnect_RX_Buff[3]; // 提取命令字节
switch (POS_ConnectRX_CMD) // 根据命令字节进行不同的操作
{
case 0xF1: // 配置APN
{
for(i = 0;i < sizeof(TXHData.POSData.WirelessData.APN);i ++) // 将 APN 缓冲区清零
TXHData.POSData.WirelessData.APN[i] = 0;
for(i = 0;i < POS_ConnectRX_Len - 4;i ++) // 从接收缓冲区中提取 APN 数据
TXHData.POSData.WirelessData.APN[i] = GPSConnect_RX_Buff[4+i];
if(FMItemWrite(CF_POSData,0)) // 写入 APN 数据到 Flash 存储器中
{
POS_Network_APN_Set(); // 设置网络 APN 参数
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF1;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
case 0xF2: // 配置LORA子模块
{
TXHData.MD_LORA_Slave_Flag = 1;
TXHData.MD_LORA_SlaveTimer.ON_OFF = 1;
// delay_ms(200);
// MD_Port_LORASet(0);
// MD_Port_LORASet(1);
// MD_Port_LORASet(2);
// MD_Port_LORASet(3);
{
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF2;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
case 0xF3: // 配置LORA子模块
{
TXHData.MD_LORA_Slave_Flag = 0;
TXHData.MD_LORA_SlaveTimer.Init = 1;
{
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF3;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
}
}
}
else if(GPSConnect_RX_Buff[25] == 'O' && GPSConnect_RX_Buff[26] == 'K') // 判断接收缓冲区中“OK\r\n”判断是不是蓝牙设置回复
{
TXHData.USART6_Drive = Bluetooth;
}
else
{
Temp = mystrstr(GPSConnect_RX_Buff,"RMC");
if(Temp)
TXHData.USART6_Drive = GPS;
if(GPSConnect_RX_Buff[Temp + 14] == 'A')//则提取经度和纬度信息
{
for(k = 0;k < 9;k ++)// 提取经度类型信息,保存到TXHData结构体中
Buff[k] = GPSConnect_RX_Buff[Temp + 16 + k];
TXHData.GPSData.GPS.Longitude = (float)atof(Buff) / 100;
TXHData.GPSData.GPS.LongitudeType = GPSConnect_RX_Buff[Temp + 26];
for(k = 0;k < 9;k ++)// 提取维度类型信息,保存到TXHData结构体中
Buff[k] = GPSConnect_RX_Buff[Temp + 28 + k];
TXHData.GPSData.GPS.Latitude = (float)atof(Buff) / 100;
TXHData.GPSData.GPS.LatitudeType = GPSConnect_RX_Buff[Temp + 39];
}
else if(GPSConnect_RX_Buff[Temp + 14] == 'V')// 如果第15个字符是'V',则经纬度信息无效,置为0
{
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
}
}
}
}
+57
View File
@@ -0,0 +1,57 @@
#ifndef __GPS_H_
#define __GPS_H_
/*H******************************************************************************
* NAME: GPSConnect.h
*********************************************************************************/
typedef union
{
u8 Buff[50]; //ModBus寄存器组
__packed struct
{
u8 GPSNum : 8;
u8 Cmd : 8;
u8 Len : 8;
u16 OHi : 16;
u16 OHd : 16;
u16 Crc : 16;
}Register;
__packed struct
{
u8 GPSNum : 8;
u8 Cmd : 8;
u16 Addr : 16;
u16 Dat : 16;
u16 Crc : 16;
}Register_W;
}GPS_RX_Buff_Type;
typedef enum
{
Edle,
Bluetooth ,
GPS ,
}USARTDriveItem;
//******************************************************************************
//硬件定义
#define GPSCount_TX_DMAAddrSet(x) (DMA2_Stream6->M0AR = x) //设置流量计发送缓存地址
#define GPSCount_TX_DMALenSet(x) (DMA2_Stream6->NDTR = x) //设置流量计DMA发送长度
#define GPSCount_TX_DMAStart() DMA_Cmd(DMA2_Stream6,ENABLE) ;GPSConnectTXTask_Flag = 0; //开启流量计DMA发送
#define GPSCount_TX_DMAStop() DMA_Cmd(DMA2_Stream6,DISABLE) //关闭流量计DMA发送
#define GPSCount_RX_DMAAddrSet(x) (DMA2_Stream1->M0AR = x) //设置流量计接收缓存地址
#define GPSCount_RX_DMALenSet(x) (DMA2_Stream1->NDTR = x) //设置流量计DMA接收
#define GPSCount_RX_DMAStart() DMA_Cmd(DMA2_Stream1,ENABLE) //开启流量计DMA接收
#define GPSCount_RX_DMAStop() DMA_Cmd(DMA2_Stream1,DISABLE) //关闭流量计DMA接收
extern volatile u8 GPSConnectTXTask_Flag;//
extern void GPSConnect_DMATX_IRQHandler(void);
extern void GPSConnect_DMARX_IRQHandler(void);
extern u16 mystrstr(u8 *s1,u8 *s2);
extern void StringToHex(u8 *Str,u8 *H,u8 Len);
extern u16 CRC_Check(u8 *puchMsg, u16 usDataLen) ;
extern u16 BigToLittle( u16 BigData);
extern void GPSConnect_Init(void);
extern void GPSConnect_USART_Configuration(u32 BaudRate);
extern void GPSConnectTast(void);
#endif //#ifndef
+201
View File
@@ -0,0 +1,201 @@
/*C*****************************************************************************
* NAME: DOBCNT1010.c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
* 双枪计数器应用程序
*******************************************************************************/
#include "config.h"
u8 DiskFileOpen_Flag = 0;
u64 File_Len=0;
void Log_Init(void)
{
u8 i= 0;
mInitCH376Host();
delay_ms(100);
}
/*
const char CMD_WifiWSSSID[]="AT+WSSSID=KFB-2.4G\r\n";
const char CMD_WifiWSKEY[]="AT+WSKEY=WPA2PSK,AES,KFB123456\r\n";
const char CMD_WifiNETP[]="AT+NETP=TCP,CLIENT,7011,test.joyfueling.com\r\n";
*/
u8 SysconfigFileName[20] = "\\SYSTEM.TXT";
u16 EndLen=0,StartLen=0;
u8 FindSysconfigFile(void)
{
u16 i=0;
u8 Next[] = {0x0D,0x0A};
u8 Buff[1000];
u16 pLocate = 0;
{
if(CH376DiskConnect() == USB_INT_SUCCESS)/* 检查U盘是否连接 */
{
DiskFileOpen_Flag = CH376FileOpen(SysconfigFileName);
if(DiskFileOpen_Flag == USB_INT_SUCCESS)
{
File_Len = CH376GetFileSize();
{
CH376ByteLocate(pLocate);
CH376ByteRead(Buff,500,&pLocate);
StartLen = mystrstr(Buff,"APN=");
if(StartLen)
{
for(i = 0;i < 40;i ++)
TXHData.POSData.WirelessData.APN[i] = 0;
EndLen = mystrstr(&Buff[StartLen],";");
for(i = 0;i < EndLen-4;i ++)
TXHData.POSData.WirelessData.APN[i] = Buff[StartLen + 3 + i];
}
StartLen = mystrstr(Buff,"WIFINAME=");
if(StartLen)
{
for(i = 0;i < 40;i ++)
TXHData.POSData.WirelessData.WiFIName[i] = 0;
EndLen = mystrstr(&Buff[StartLen],";");
for(i = 0;i < EndLen-9;i ++)
TXHData.POSData.WirelessData.WiFIName[i] = Buff[StartLen + 8 + i];
}
StartLen = mystrstr(Buff,"WIFIPASSWORD=");
if(StartLen)
{
for(i = 0;i < 20;i ++)
TXHData.POSData.WirelessData.WiFIPassWord[i] = 0;
EndLen = mystrstr(&Buff[StartLen],";");
for(i = 0;i < EndLen-13;i ++)
TXHData.POSData.WirelessData.WiFIPassWord[i] = Buff[StartLen + 12 + i];
}
StartLen = mystrstr(Buff,"SERVER=");
if(StartLen)
{
// if(TXHData.POS_Info.NetType == POS_Net_Typ_WiFi)
// {
for(i = 0;i < 50;i ++)
TXHData.POSData.WirelessData.CMD_SOCKA[i] = 0;
EndLen = mystrstr(&Buff[StartLen],";");
for(i = 0;i < EndLen-7;i ++)
TXHData.POSData.WirelessData.CMD_SOCKA[i] = Buff[StartLen + 6 + i];
// }
// else
// {
// for(i = 13;i < 50;i ++)
// TXHData.POSData.WirelessData.CMD_SOCKA[i] = 0;
// EndLen = mystrstr(&Buff[StartLen],";");
// for(i = 0;i < EndLen-7;i ++)
// TXHData.POSData.WirelessData.CMD_SOCKA[13+i] = Buff[StartLen + 6 + i];
// strcat(TXHData.POSData.WirelessData.CMD_SOCKA, "\r\n\0");
// }
}
FMItemWrite(CF_POSData,0);
}
CH376FileClose(TRUE);
return 1;
}
else
{
if(DiskFileOpen_Flag == ERR_MISS_FILE)
CH376FileCreate(SysconfigFileName);
else
{
CH376FileClose(TRUE);
DiskFileOpen_Flag = 0;
}
}
}
else
{
TXHData.UDisk_Flag = 0;
mInitCH376Host();
}
}
}
u8 LogName[5][25] = {
"\\M1_0000.TXT",
"\\M2_0000.TXT",
"\\M3_0000.TXT",
"\\M4_0000.TXT",
"\\POS0000.TXT",
};
void Log_Task(u8 *pBuff,u16 Len,u8 port,u8 Source)
{
u16 i=0,Temp16=0;
u8 Next[] = {0x0D,0x0A};
u8 Buff[2000];
u16 pLocate = 0;
if(port <= 4)
{
LogName[port][4] = ((TXHData.CTIME.Month >> 4) & 0x0f) + 0x30;
LogName[port][5] = (TXHData.CTIME.Month & 0x0f) + 0x30;
LogName[port][6] = ((TXHData.CTIME.Day >> 4) & 0x0f) + 0x30;
LogName[port][7] = (TXHData.CTIME.Day & 0x0f) + 0x30;
if(CH376DiskConnect() == USB_INT_SUCCESS)/* 检查U盘是否连接 */
{
if(DiskFileOpen_Flag != DEF_DISK_OPEN_FILE)
DiskFileOpen_Flag = CH376FileOpen(LogName[port]);
if(DiskFileOpen_Flag == DEF_DISK_OPEN_FILE)
{
if(Len > 1000)
Len = 1000;
File_Len = CH376GetFileSize();
CH376ByteLocate(File_Len);
Buff[0] = ((TXHData.CTIME.Day >> 4) & 0x0f) + 0x30;
Buff[1] = (TXHData.CTIME.Day & 0x0f) + 0x30;
Buff[2] = ((TXHData.CTIME.Hour >> 4) & 0x0f) + 0x30;
Buff[3] = (TXHData.CTIME.Hour & 0x0f) + 0x30;
Buff[4] = ((TXHData.CTIME.Min >> 4) & 0x0f) + 0x30;
Buff[5] = (TXHData.CTIME.Min & 0x0f) + 0x30;
Buff[6] = ((TXHData.CTIME.Sec >> 4) & 0x0f) + 0x30;
Buff[7] = (TXHData.CTIME.Sec & 0x0f) + 0x30;
if(Source == Info_String)
{
Buff[8] = ':';
for(i = 0;i < Len;i ++)
Buff[i+9] = *(pBuff + i);
CH376ByteWrite(Buff,Len + 9,&pLocate);
}
else
{
if(Source == Info_Issue)
Buff[8] = 'T';
else if(Source == Info_Receive)
Buff[8] = 'R';
Buff[9] = ':';
for(i = 0;i < Len * 2;i += 2)
{
Temp16 = *(pBuff + i / 2) >> 4;
Buff[i + 10] = Temp16 + 0x30 + (Temp16 / 10) * 7;
Temp16 = *(pBuff + i / 2) & 0x0f;
Buff[i+11] = Temp16 + 0x30 + (Temp16 / 10) * 7;
}
CH376ByteWrite(Buff,Len*2 + 10,&pLocate);
}
CH376ByteWrite(Next,2,&pLocate);
CH376FileClose(TRUE);
DiskFileOpen_Flag = 0;
}
else
{
if(DiskFileOpen_Flag == ERR_MISS_FILE)
CH376FileCreate(LogName[port]);
else
{
CH376FileClose(TRUE);
DiskFileOpen_Flag = 0;
}
}
}
else
{
TXHData.UDisk_Flag = 0;
mInitCH376Host();
}
}
}
+16
View File
@@ -0,0 +1,16 @@
#ifndef __Log_H__
#define __Log_H__
typedef enum
{
Info_Issue,
Info_Receive,
Info_String,
}Log_Info_Typ;
void Log_Init(void);
void Log_Task(u8 *pBuff,u16 Len,u8 port,u8 Source);
u8 FindSysconfigFile(void);
//------------------------------------------------------------------------------
#endif
File diff suppressed because it is too large Load Diff
+293
View File
@@ -0,0 +1,293 @@
#ifndef __MD_Connect_H_
#define __MD_Connect_H_
/*H******************************************************************************
* NAME: MD_Connect.h
*********************************************************************************/
typedef struct
{
u8 ADDRH;
u8 ADDRL;
u8 Communication;
u8 CRYPTH;
u8 CRYPTL;
} LORA_Set_Type;
//硬件定义
#define MD_ConnectUsart1 USART2
#define MD_Connect_DMA DMA1
#define MD_Connect_TX1_DMAAddrSet(x) (DMA1_Stream6->M0AR = x) //设置流量计接收缓存地址
#define MD_Connect_TX1_DMALenSet(x) (DMA1_Stream6->NDTR = x) //设置发送DMA长度
#define MD_Connect_TX1_DMAStart() DMA_Cmd(DMA1_Stream6,ENABLE) //开启发送DMA
#define MD_Connect_TX1_DMAStop() DMA_Cmd(DMA1_Stream6,DISABLE) //开启发送DMA
#define MD_Connect_RX1_DMALenSet(x) (DMA1_Stream5->NDTR = x) //设置DMA长度
#define MD_Connect_RX1_DMAStart() DMA_Cmd(DMA1_Stream5,ENABLE) //开启DMA
#define MD_Connect_RX1_DMAStop() DMA_Cmd(DMA1_Stream5,DISABLE) //开启DMA
#define MD_ConnectUsart2 USART4
#define MD_Connect_DMA DMA1
#define MD_Connect_TX2_DMAAddrSet(x) (DMA1_Stream4->M0AR = x) //设置流量计接收缓存地址
#define MD_Connect_TX2_DMALenSet(x) (DMA1_Stream4->NDTR = x) //设置发送DMA长度
#define MD_Connect_TX2_DMAStart() DMA_Cmd(DMA1_Stream4,ENABLE) //开启发送DMA
#define MD_Connect_TX2_DMAStop() DMA_Cmd(DMA1_Stream4,DISABLE) //开启发送DMA
#define MD_Connect_RX2_DMALenSet(x) (DMA1_Stream2->NDTR = x) //设置DMA长度
#define MD_Connect_RX2_DMAStart() DMA_Cmd(DMA1_Stream2,ENABLE) //开启DMA
#define MD_Connect_RX2_DMAStop() DMA_Cmd(DMA1_Stream2,DISABLE) //开启DMA
#define MD_ConnectUsart3 USART5
#define MD_Connect_DMA DMA1
#define MD_Connect_TX3_DMAAddrSet(x) (DMA1_Stream7->M0AR = x) //设置流量计接收缓存地址
#define MD_Connect_TX3_DMALenSet(x) (DMA1_Stream7->NDTR = x) //设置发送DMA长度
#define MD_Connect_TX3_DMAStart() DMA_Cmd(DMA1_Stream7,ENABLE) //开启发送DMA
#define MD_Connect_TX3_DMAStop() DMA_Cmd(DMA1_Stream7,DISABLE) //开启发送DMA
#define MD_Connect_RX3_DMALenSet(x) (DMA1_Stream0->NDTR = x) //设置DMA长度
#define MD_Connect_RX3_DMAStart() DMA_Cmd(DMA1_Stream0,ENABLE) //开启DMA
#define MD_Connect_RX3_DMAStop() DMA_Cmd(DMA1_Stream0,DISABLE) //开启DMA
#define MD_ConnectUsart4 USART3
#define MD_Connect_DMA DMA1
#define MD_Connect_TX4_DMAAddrSet(x) (DMA1_Stream3->M0AR = x) //设置流量计接收缓存地址
#define MD_Connect_TX4_DMALenSet(x) (DMA1_Stream3->NDTR = x) //设置发送DMA长度
#define MD_Connect_TX4_DMAStart() DMA_Cmd(DMA1_Stream3,ENABLE) //开启发送DMA
#define MD_Connect_TX4_DMAStop() DMA_Cmd(DMA1_Stream3,DISABLE) //开启发送DMA
#define MD_Connect_RX4_DMALenSet(x) (DMA1_Stream1->NDTR = x) //设置DMA长度
#define MD_Connect_RX4_DMAStart() DMA_Cmd(DMA1_Stream1,ENABLE) //开启DMA
#define MD_Connect_RX4_DMAStop() DMA_Cmd(DMA1_Stream1,DISABLE) //开启DMA
#define Check_NONE 0
#define Check_EVEN 1
#define Check_ODD 2
/*********************蓝天协议指令集************************/
#define BaudRateSync 115200
#define MDConnect_start 0xF5 //通信头
#define MDConnect_false 0x4E //失败
#define MDConnect_succeed 0x59 //成功
#define MDConnect_GetICCID 0x5A //
#define C_MDConnectCmdWriteDensity 0XA2 //写密度
#define C_MDConnectCmdReadDensity 0XA6 //读密度
#define C_MDConnectCmdWritePrice 0XB2 //写单价
#define C_MDConnectResumeFueling 0xB3 //继续
#define C_MDConnectCmdWritePrsetSale 0xB5 //写预置金额
#define C_MDConnectCmdReadPrice 0XB6 //读单价
#define C_MDConnectCmdWritePrsetVolume 0xB9 //写预置体积
#define C_MDConnectPauseFueling 0xBA //暂停
#define C_MDConnectCmdStart 0xC3 //开机
#define C_MDConnectCmdReadTotal 0xC5 //读总累
#define C_MDConnectCmdReadSquadTop 0XC7 //读班累
#define C_MDConnectCmdStop 0xCA //停机
#define C_MDConnectCmdWriteTotal 0xCE //写总累
#define C_MDConnectCmdWriteValveTurnOff 0xD2 //写提前关阀量PulseCoefficient
#define C_MDConnectCmdReadState 0xD5 //读取加油机状态
#define C_MDConnectCmdReadValveTurnOff 0xD6 //读提前关阀量
#define C_MDConnectAakIDCardNummber 0xD7 //要ID卡卡号
#define C_MDConnectCmdReadFuelState 0xD9 //读取加油机状态和流量信息
#define C_MDConnectCmdWritePulseCoefficient 0xE1 //写PulseCoefficient
#define C_MDConnectCmdReadPulseCoefficient 0xE2 //读
#define C_MDConnectASKControlPower 0xE5 //要控制权
#define C_MDConnectReturnControlPower 0xE7 //还控制权
#define C_MDConnectCmdClrSquadTop 0XEA //清班累
#define C_MDConnectChangePassWord 0xEB //改机械锁密码
#define C_MDConnectCmdReadVersion 0x11 //读版本号
#define C_MDConnectCmdSetBaudRate 0x12 //同步波特率
#define C_MDConnectCmdSendFrame 0x13 //传送帧
/*********************LY JP协议指令集************************/
#define LY_MDConnectCmdPoll 0XA1 //轮询
#define LY_MDConnectCmdReadState 0XA2 //读状态
#define LY_MDConnectCmdChoiceGun 0XA3 //选择枪
#define LY_MDConnectCmdAuthorize 0XA4 //授权
#define LY_MDConnectCmdWritePrice 0XA5 //写单价
#define LY_MDConnectCmdACK0 0XA6 //1030
#define LY_MDConnectCmdACK1 0XA7 //1031
#define LY_MDConnectCmdHandshake 0XA8 //握手
#define LY_MDConnectCmdReadTotal 0XA9 //读总累
#define LY_MDConnectCmdDisauthorize 0XAA //取消授权
/*********************Dart协议指令集************************/
#define DART_MDConnectCmdPoll 0XB1 //轮询
#define DART_MDConnectCmdReadState 0XB2 //读状态
#define DART_MDConnectCmdReStart 0XB3 //重连
#define DART_MDConnectCmdAuthorize 0XB4 //授权
#define DART_MDConnectCmdWritePrice 0XB5 //写单价
#define DART_MDConnectCmdACK 0XB6 //ACK
#define DART_MDConnectCmdNAK 0XB7 //NAK
#define DART_MDConnectCmdReadVTotal 0XB8 //读油量总累
#define DART_MDConnectCmdReadPTotal 0XB9 //读金额总累
#define DART_MDConnectCmdDisauthorize 0XBA //取消授权
/*********************液位仪协议指令集************************/
#define YWY_MDConnectCmdReadData 0X31 //读数据
#define YWY_MDConnectCmdWriteApacity 0X45 //下载罐容表
/*********************LORA协议指令集************************/
#define LORA_ParameterSet 0XFF //LORA设置
/*********************RFID协议指令集************************/
#define RFID_MDConnectCmdReadData 0XF1 //读单枪数据
#define RFID_MDConnectCmdWriteCardInfo 0XF2 //
#define RFID_MDConnectCmdWriteFullingInfo 0XF3 //
#define RFID_MDConnectCmdReadVersion 0XF4 //
#define RFID_MDConnectCmdWriteBindingInfo 0XF6 //发送绑定的枪号
#define RFID_MDConnectCmdLossACK 0XF7 //
#define RFID_MDConnectCmdFindACK 0XF8 //
#define RFID_MDConnectCmdROMownload 0X05 //
#define RFID_MDConnectCmdAllData 0X06 //读一个键盘所有枪的数据
/*********************英高协议指令集************************/
#define YG_MDConnectCmdWritePrset 0x01 //写预置
#define YG_MDConnectCmdWritePrice 0X02 //写单价
#define YG_MDConnectCmdStop 0x04 //停机
#define YG_MDConnectCmdStart 0x05 //授权
#define YG_MDConnectControlMode 0x06 //设置油机为联机或脱机模式,由命令参数决定
#define YG_MDConnectCmdReadTotal 0x07 //读总累
#define YG_MDConnectCmdRemovePrset 0x08 //取消预置
#define YG_MDConnectCmdSetTime 0x0C //同步时间
#define YG_MDConnectCmdInTestMode 0x0D //同步时间
#define YG_MDConnectCmdOutTestMode 0x0E //同步时间
#define YG_MDConnectCmdReadVersion 0X0F //读取油机的软件版本号
#define YG_MDConnectCmdUnLock 0X10 //解锁
#define YG_MDConnectCmdLock 0X11 //锁定
#define YG_MDConnectCmdReadFuelVolumeState 0x14 //读取加油机状态和流量信息
#define YG_MDConnectCmdReadFuelSaleState 0x15 //回复金额
#define YG_MDConnectCmdReadFuelRecord 0x16 //读取加油记录
#define YG_MDConnectCmdReadFuelRecordNull 0x18 //回复记录空
#define YG_MDConnectCmdReadFuelRecordConfirm 0x17 //加油记录确认
/*********************弘扬协议指令集************************/
#define HY_MDConnectCmdWritePrice 0X80 //写单价
#define HY_MDConnectCmdWritePrsetSale 0x89 //写预置金额
#define HY_MDConnectCmdReadPrice 0X8C //读单价
#define HY_MDConnectCmdWritePrsetVolume 0x8B //写预置体积
#define HY_MDConnectCmdStart 0x08 //开机
#define HY_MDConnectCmdReadTotal 0x8E //读总累
#define HY_MDConnectCmdStop 0x10 //停机
#define HY_MDConnectCmdReadFuelData 0x8F //读取流量信息
#define HY_MDConnectASKControlPower 0x15 //要控制权
#define HY_MDConnectReturnControlPower 0x14 //还控制权
/**********************蓝枫协议指令集******************************/
#define LF_MDConnectCmdWritePrice 0XA1 //写单价
#define LF_MDConnectCmdReadTotal 0xA3 //读总累
#define LF_MDConnectCmdReadState 0xB0 //读取加油机状态
#define LF_MDConnectCmdFuilingStateReply 0xB3 //加油中回复
#define LF_MDConnectCmdIdleStateReply 0xBA //空闲状态回复
#define LF_MDConnectCmdRecordConfirm 0xD2 //交易记录确认
#define LF_MDConnectCmdReadFuelRecord 0xE3 //读取加油记录
#define LF_MDConnectCmdWritePrset 0xE4 //写预置
#define LF_MDConnectASKControlPower 0xE5 //要控制权
#define LF_MDConnectReturnControlPower 0xE6 //还控制权
#define LF_MDConnectCmdStop 0xE7 //停机
/**********************蓝天Plus协议指令集******************************/
#define LTP_DriverCMD 0xA1 //机指令
#define LTP_GunCMD 0XA2 //枪
//机指令列表
#define LTP_DriverCMDReadPassword 0X01 //读密码
#define LTP_DriverCMDWritePassword 0X02 //写密码
#define LTP_DriverCMDReadVerAndMac 0X03 //读版本和唯一码
#define LTP_DriverCMDLock 0X04 //锁机
#define LTP_DriverCMDUnlock 0X05 //解锁
#define LTP_DriverCMDSendFrame 0X06 //在线升级传送帧
//枪参数列表
#define LTP_GunCMDReadState 0x01 //读取加油机状态
#define LTP_GunCMDReadStateAndData 0x02 //读取加油机状态和数据
#define LTP_GunCMDReadTotal 0x03 //读总累
#define LTP_GunCMDWritePrset 0x04 //写预置
#define LTP_GunCMDAuthorize 0x05 //授权
#define LTP_GunCMDStop 0x06 //停机
#define LTP_GunCMDReadEvent 0x07 //读事件
#define LTP_GunCMDReadError 0x08 //读错误
#define LTP_GunCMDReadParameter 0x09 //读参数
#define LTP_GunCMDWriteParameter 0x0A //写参数
#define LTP_GunCMDSuspend 0x0B //暂停
#define LTP_GunCMDContinue 0x0C //继续
//枪参数列表
#define LTP_GunParameterListPrice 0x01 //单价参数
#define LTP_GunParameterListPluse 0x02 //脉冲当量参数
#define LTP_GunParameterListTurnOff 0x03 //提前关阀量参数
#define LTP_GunParameterListMinDisp 0x04 //最小显示值参数
/*********************CNGPLC指令集************************/
#define PLC_MDConnectCmdReadData 0X01 //读数据
#define PLC_MDConnectCmdReadErro 0X02 //读错误
/*********************单价牌指令集************************/
#define Price_MDConnectCmdWriteParameter 0X00 //写参数
#define Price_MDConnectCmdWritePrice 0X01 //写单价
#define Price_MDConnectCmdReadParameter 0X02 //读参数
#define Price_MDConnectCmdReadPrice 0X03 //读单价
#define Price_MDConnectCmdWriteDecimal 0X04 //写单价
#define MD_Connect_RS485_Tx1EN GPIO_ResetBits(GPIOD,GPIO_Pin_7);
#define MD_Connect_RS485_Rx1EN GPIO_SetBits(GPIOD,GPIO_Pin_7);
#define MD_Connect_RS485_Tx2EN GPIO_ResetBits(GPIOD,GPIO_Pin_3);
#define MD_Connect_RS485_Rx2EN GPIO_SetBits(GPIOD,GPIO_Pin_3);
#define MD_Connect_RS485_Tx3EN GPIO_ResetBits(GPIOA,GPIO_Pin_8);
#define MD_Connect_RS485_Rx3EN GPIO_SetBits(GPIOA,GPIO_Pin_8);
#define MD_Connect_RS485_Tx4EN GPIO_ResetBits(GPIOD,GPIO_Pin_10);
#define MD_Connect_RS485_Rx4EN GPIO_SetBits(GPIOD,GPIO_Pin_10);
#define MD_Connect_LORA_SetMode1 GPIO_SetBits(GPIOG,GPIO_Pin_14);
#define MD_Connect_LORA_IdleMode1 GPIO_ResetBits(GPIOG,GPIO_Pin_14);
#define MD_Connect_LORA_SetMode2 GPIO_SetBits(GPIOG,GPIO_Pin_13);
#define MD_Connect_LORA_IdleMode2 GPIO_ResetBits(GPIOG,GPIO_Pin_13);
#define MD_Connect_LORA_SetMode3 GPIO_SetBits(GPIOG,GPIO_Pin_12);
#define MD_Connect_LORA_IdleMode3 GPIO_ResetBits(GPIOG,GPIO_Pin_12);
#define MD_Connect_LORA_SetMode4 GPIO_SetBits(GPIOG,GPIO_Pin_11);
#define MD_Connect_LORA_IdleMode4 GPIO_ResetBits(GPIOG,GPIO_Pin_11);
//******************************************************************************
//*-------------- 变量声名 -----------------------------------------------------
//******************************************************************************
typedef enum
{
LORA_Master,
LORA_Slave,
}LORA_MODE_Tyye;
extern volatile u8 MD_ConnectRX1Task_Flag; //MD_Connect卡通讯DMA接收完成标志标志
extern volatile u8 MD_ConnectRX2Task_Flag; //MD_Connect卡通讯DMA接收完成标志标志
extern volatile u8 MD_ConnectRX3Task_Flag; //MD_Connect卡通讯DMA接收完成标志标志
extern volatile u8 MD_ConnectRX4Task_Flag; //MD_Connect卡通讯DMA接收完成标志标志
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
extern void MD_Connect_USART_Configuration(u8 PortNum,u32 Baud,u16 USART_WordLength,u8 Check);
extern void MD_Connect_Init(void); //MD_Connect卡键盘任务初始化
extern void MD_Port_Init(u8 Port);
extern void MD_Connect_DMARX1_IRQHandler(void); //MD_Connect卡键盘接收中断服务函数
extern void MD_Connect_DMATX1_IRQHandler(void); //DMA发送中断服务函数
extern void MD_Connect_DMARX2_IRQHandler(void); //MD_Connect卡键盘接收中断服务函数
extern void MD_Connect_DMATX2_IRQHandler(void); //DMA发送中断服务函数
extern void MD_Connect_DMARX3_IRQHandler(void); //MD_Connect卡键盘接收中断服务函数
extern void MD_Connect_DMATX3_IRQHandler(void); //DMA发送中断服务函数
extern void MD_Connect_DMARX4_IRQHandler(void); //MD_Connect卡键盘接收中断服务函数
extern void MD_Connect_DMATX4_IRQHandler(void); //DMA发送中断服务函数
extern u64 MD_Connect_u64ToBCD(u64 Dat);
extern u64 MD_Connect_BCDTou64(u64 Dat);
extern void MD_ConnectRXTask(void);
extern void MD_ConnectTXTask(u8 Port,u8 GunNum,u8 MD_TX_CMD);
extern void MD_Port_LORASet(u8 Port,u8 Mode);
extern u8 BCC_CheckSum(u8 *buf, u8 len);//BCC校验函数;
extern float StrToFloat(u8 *str,u8 len);
#endif //#ifndef
+829
View File
@@ -0,0 +1,829 @@
#include "config.h"
volatile u8 Multiplex_Port_RX_Flag = 0;//Multiplex_Port接受任务标志位,1允许运行
volatile u8 Multiplex_Port_TX_Flag = 0;//
volatile u8 Multiplex_Port_RX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 Multiplex_Port_TX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 Multiplex_Port_DMA_RX_Len = 23;
/*_____ D E F I N I T I O N __________________________________________________*/
u16 BigToLittle( u16 BigData)
{
return (BigData << 8 | BigData >> 8);
}
//u32 BigToLittle( u32 BigData)
//{
// union
// {
// u32 Temp;
// u8 Buff[4];
// }Dat;
//
// if(sizeof(BigData) == 2)
// return (BigData << 8 | BigData >> 8);
// else if(sizeof(BigData) == 4)
// {
// Dat.Buff[0] = (BigData >> 24) & 0xff;
// Dat.Buff[1] = (BigData >> 16) & 0xff;
// Dat.Buff[2] = (BigData >> 8) & 0xff;
// Dat.Buff[3] = (BigData >> 0) & 0xff;
// return (Dat.Temp);
// }
//}
/****************************************************
函数名:Multiplex_Port_IO_Configuration
功能 Multiplex_Port卡通讯部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void Multiplex_Port_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GOIP配置结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
Multiplex_Port_RS485_RxEN1;
Multiplex_Port_RS485_RxEN2;
}
/****************************************************
函数名:Multiplex_Port_NVMultiplex_Port_Configuration
功能 Multiplex_Port卡通讯部分用到的中断向量配置
参数 :无
返回值:无
****************************************************/
void Multiplex_Port_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream6_IRQn; //USART6_TX_DMA
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //USART??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
NVIC_Init(&NVIC_InitStructure); //??NVIC_InitStruct???????????NVIC???USART1
}
/****************************************************
函数名:Multiplex_Port_NVMultiplex_Port_Configuration
功能 Multiplex_Port卡通讯部分用到的串口配置
参数 :无
返回值:无
****************************************************/
void Multiplex_Port_USART_Configuration(u32 Baud,u8 Check)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
USART_InitStructure.USART_BaudRate =Baud;// Baud;//?????
if(Check == Check_EVEN)
{
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;
}
else if(Check == Check_ODD)
{
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
}
else if(Check == Check_NONE)
{
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
}
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART6, &USART_InitStructure);
USART_Cmd(USART6, ENABLE);
USART_ITConfig(USART6, USART_IT_IDLE, ENABLE);
USART_ClearFlag(USART6, USART_FLAG_IDLE);
USART_DMACmd(USART6, USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
}
/*************************************************
函数名 DMA_Configuration()
功能 DMA初始化
传入参数:无
返回值 :无
**************************************************/
void Multiplex_Port_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/*******************发送TX1*********************/
DMA_DeInit(DMA2_Stream6);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
//DMA_InitStructure.DMA_BufferSize = UART_DMA_SEND_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Multiplex_Port_TX_Buff;
DMA_Init(DMA2_Stream6, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream6, DMA_IT_TC, ENABLE);
/*******************RX*********************/
DMA_DeInit(DMA2_Stream1);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 1000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Multiplex_Port_RX_Buff;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream1, ENABLE);
}
//F*****************************************************************************
//* NAME: Multiplex_Port_TXDataCheck
//* PURPOSE: Multiplex_Port卡键盘通信校验函数
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 Multiplex_Port_TXDataCheck(volatile u8* pData, u8 len)
{
u8 result;
if(len == 0) len = 16;
result = *pData++;
do
{
result ^= *pData++;
}while(--len);
return result & 0x7f;
}
void Multiplex_Port_DMATX_IRQHandler(void)
{
u16 i = 0;
DMA_ClearFlag(DMA2_Stream6, DMA_IT_TCIF6);
Multiplex_Port_TX_DMAStop(); //关闭DMA传输
while(! USART_GetFlagStatus(USART6, USART_FLAG_TC))NULL;
Multiplex_Port_RS485_RxEN1;
Multiplex_Port_RS485_RxEN2;
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
Multiplex_Port_RX_DMAStart(); //打开DMA传输(Gas就收)长度在选择发送队列时设置
Multiplex_Port_TX_Flag = 1;
}
//F*****************************************************************************
//* NAME: Multiplex_Port_DMARX_IRQHandler
//* PURPOSE: DMA传输完成中断,Gas ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void Multiplex_Port_DMARX_IRQHandler(void)
{
u8 i = 0;
u16 CRC_Temp = 0;
if(USART_GetITStatus(USART6, USART_IT_IDLE) != RESET)//?????????
{
USART_ClearFlag(USART6, USART_IT_IDLE);
i = USART6->SR;
i = USART6->DR;
TXHData.MD_MultiplexRXIDLETimer.ON_OFF = 1;
TXHData.MD_Multiplex_Rec_NummberB = 1000 - DMA2_Stream1->NDTR;
}
}
//F*****************************************************************************
//* NAME: Price_DataCheck
//* PURMDE: 单价牌检验算法
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 Price_DataCheck(volatile u8* pData, u16 len)
{
u8 result = 0;
do
{
result += *pData++;
}while(--len);
return result;
}
void StringToHex(u8 *Str,u8 *H,u8 Len)
{
u8 i = 0;
for(i = 0;i < Len;i += 2)
{
if(*(Str + i) > 0x39)
*(H + (i / 2)) = (*(Str + i) - 0x37) << 4;
else
*(H + (i / 2)) = (*(Str + i) - 0x30) << 4;
if(*(Str + i + 1) > 0x39)
*(H + (i / 2)) |= (*(Str + i + 1) - 0x37) & 0x0f;
else
*(H + (i / 2)) |= (*(Str + i + 1) - 0x30) & 0x0f;
}
}
u16 mystrstr(u8 *s1,u8 *s2)
{
int len2;
u16 i= 0;
if(!(len2=strlen(s2)))//此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
return 1;
for(;*s1;++s1)
{
i ++;
if(*s1==*s2 && strncmp(s1,s2,len2)==0)
return i;
}
return NULL;
}
void Multiplex_Port_Choose(u8 Port)
{
switch(Port)
{
case 0:
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//B
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//A
}break;
case 1:
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//B
GPIO_SetBits(GPIOC,GPIO_Pin_8);//A
}break;
case 2:
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);//B
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//A
}break;
case 3:
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);//B
GPIO_SetBits(GPIOC,GPIO_Pin_8);//A
}break;
}
}
//F*****************************************************************************
//* NAME: Multiplex_Port_Init
//* PURPOSE: Multiplex_Port通讯初始化
//* PARAMS: 无
//* return: 无
//******************************************************************************
void Multiplex_Port_Init(void)
{
u8 i = 0;
Multiplex_Port_IO_Configuration(); //流量计相关IO初始化
Multiplex_Port_USART_Configuration(115200,Check_NONE); //相关串口初始化
Multiplex_Port_DMA_Configuration(); //流量计相关DMA初始化
Multiplex_Port_NVIC_Configuration(); //流量计相关中断初始化
TXHData.MD_MultiplexRXIDLETimer.Init = 0; //清除初始化标志
TXHData.MD_MultiplexRXIDLETimer.Flag = 0; //清除到时标志
TXHData.MD_MultiplexRXIDLETimer.ON_OFF = 0; //打开
TXHData.MD_MultiplexRXIDLETimer.Cycle = 0; //设置为循环模式,发送时启动
TXHData.MD_MultiplexRXIDLETimer.TimerCountMax = 5;//周期10001s
TXHData.MD_MultiplexTimer.Init = 0; //清除初始化标志
TXHData.MD_MultiplexTimer.Flag = 0; //清除到时标志
TXHData.MD_MultiplexTimer.ON_OFF = 1; //打开
TXHData.MD_MultiplexTimer.Cycle = 1; //设置为循环模式,发送时启动
TXHData.MD_MultiplexTimer.TimerCountMax = 1000;//周期10001s
//TXHData.MD_Multiplex_Port_Data.PortData[0].POSType = 1;
// TXHData.MD_Multiplex_Port_Data.DeviceNumber =1;
if(TXHData.MD_Multiplex_Port_Data.DeviceNumber == 0)
{
if(TXHData.HardwareVersion >= 26)//版本26之后增加GPS模块
{
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[0].Init = 0; //清除初始化标志
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[0].Flag = 0; //清除到时标志
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[0].ON_OFF = 1; //打开
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[0].Cycle = 1; //设置为循环模式,发送时启动
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[0].TimerCountMax = 10*1000;//周期10001s
TXHData.MD_Multiplex_Port_Data.PortData[0].MBCountTime = 10*100;
TXHData.MD_Multiplex_Port_Data.PortData[0].POSType = Multiplex_GPS;
TXHData.MD_Multiplex_Port_Data.PortData[0].BaudRate = 9600;
TXHData.MD_Multiplex_Port_Data.PortData[0].StopBits = 1;
TXHData.MD_Multiplex_Port_Data.DeviceNumber += 1;//GPS模块放在随后的一个位置
}
}
else
{
for(i = 0;i < TXHData.MD_Multiplex_Port_Data.DeviceNumber;i ++)
{
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].Init = 0; //清除初始化标志
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].Flag = 0; //清除到时标志
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].ON_OFF = 1; //打开
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].Cycle = 1; //设置为循环模式,发送时启动
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].TimerCountMax = TXHData.MD_Multiplex_Port_Data.PortData[i].MBCountTime * 10;//周期10001s
switch(TXHData.MD_Multiplex_Port_Data.PortData[i].POSType)
{
case Multiplex_Print:TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[i] = PT_Null;break;
case Multiplex_YWY :
TXHData.MD_MultiplexRXIDLETimer.TimerCountMax = 50;//周期10001s
TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[i] = YWY_MDConnectCmdReadData;
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].TimerCountMax = TXHData.MD_Multiplex_Port_Data.PortData[i].MBCountTime * 100;break;
case Multiplex_Price:TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[i] = Price_MDConnectCmdReadParameter;
TXHData.MD_Multiplex_Port_Info.Handshake_Top[i] = 2;
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i].TimerCountMax = TXHData.MD_Multiplex_Port_Data.PortData[i].MBCountTime * 100;break;
}
}
}
}
void Multiplex_PortTXTask(u8 PosTypeTemp,u8 MD_TX_CMD)
{
u16 i = 0,j = 0,k = 0,MD_Port_Num = 0,DeviceNumber = 0,MD_ConnectTX_Len = 0;
u8 GunNum = 0,GunAddr = 0,SunNum = 0;
u64 TempBCD = 0,Tempu64 = 0;
u8 Data_201[7] = "i20100";
u8 Data_20E[7] = "i20E00";
Multiplex_Port_TX_Flag = 0;
if(TXHData.MD_Multiplex_Port_Info.MBCountCutNum[PosTypeTemp] >= 4)
{
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[PosTypeTemp] = 5;
TXHData.MD_Multiplex_Port_Info.Handshake[PosTypeTemp] = 0;
TXHData.MD_Multiplex_Port_Data.State[PosTypeTemp].Flag.Online = 0;
switch(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].POSType)
{
case Multiplex_Print:TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[PosTypeTemp] = PT_Null;break;
case Multiplex_YWY :TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[PosTypeTemp] = YWY_MDConnectCmdReadData;break;
case Multiplex_Price:TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[PosTypeTemp] = Price_MDConnectCmdReadParameter;TXHData.MD_Multiplex_Port_Info.Handshake[PosTypeTemp] = 0;break;
}
}
switch(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].POSType)
{
case Multiplex_Print:
{
if(TXHData.MD_Multiplex_Port_Info.PrintType != PT_Null)
{
Multiplex_Port_Choose(0);
Multiplex_Port_USART_Configuration(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].BaudRate,TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].Parity_Even);
switch(TXHData.MD_Multiplex_Port_Info.PrintType)
{
case PT_LastRecord:
{
DeviceNumber = TXHData.MD_Multiplex_Port_Info.PrintPlaceNumber;
GunNum = TXHData.PrintLastRecord[DeviceNumber].GunNumber;
TXHData.PrintRecord.FData = TXHData.PrintLastRecord[DeviceNumber].FData;
TXHData.PrintRecord.Price = TXHData.PrintLastRecord[DeviceNumber].Price;
TXHData.PrintRecord.RTIME = TXHData.PrintLastRecord[DeviceNumber].RTIME;
MD_Port_Num = DeviceNumber / 16;
}break;
case PT_Record:
{
GunNum = TXHData.PrintRecord.GunNumber;
for(MD_Port_Num = 0;MD_Port_Num < TXHData.MD_Port_Num_Top;MD_Port_Num ++)
{
for(DeviceNumber = 0;DeviceNumber < TXHData.MD_Port_Data[MD_Port_Num].PortData.DeviceNumber;DeviceNumber ++)
{
if(TXHData.MD_Port_Data[MD_Port_Num].GunData[DeviceNumber].GunNummber == GunNum)
break;
}
if(DeviceNumber < TXHData.MD_Port_Data[MD_Port_Num].PortData.DeviceNumber)
break;
}
}break;
}
Print_Num(0,6,MD_Connect_u64ToBCD(GunNum),0);
Print_Num(0,7,TXHData.PrintRecord.FData.MoneyCNT,TXHData.MD_Port_Data[MD_Port_Num].PortData.GunDec.Dec.MoneyCNT);
Print_Num(0,8,TXHData.PrintRecord.FData.OilCNT,TXHData.MD_Port_Data[MD_Port_Num].PortData.GunDec.Dec.OilCNT);
Print_Num(0,9,TXHData.PrintRecord.Price,TXHData.MD_Port_Data[MD_Port_Num].PortData.GunDec.Dec.Price);
TXHData.PrintInfo.PrintBuff[11][30-18] = '2';TXHData.PrintInfo.PrintBuff[11][30-17] = '0';
TXHData.PrintInfo.PrintBuff[11][30-16] = ((TXHData.PrintRecord.RTIME.Year>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30-15] = ((TXHData.PrintRecord.RTIME.Year)&0x0f)+'0';
TXHData.PrintInfo.PrintBuff[11][30-14] = '-';
TXHData.PrintInfo.PrintBuff[11][30-13] = ((TXHData.PrintRecord.RTIME.Month>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30-12] = ((TXHData.PrintRecord.RTIME.Month)&0x0f)+'0';
TXHData.PrintInfo.PrintBuff[11][30-11] = '-';
TXHData.PrintInfo.PrintBuff[11][30-10] = ((TXHData.PrintRecord.RTIME.Day>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30-9] = ((TXHData.PrintRecord.RTIME.Day)&0x0f)+'0';
TXHData.PrintInfo.PrintBuff[11][30-7] = ((TXHData.PrintRecord.RTIME.Hour>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30-6] = ((TXHData.PrintRecord.RTIME.Hour)&0x0f)+'0';
TXHData.PrintInfo.PrintBuff[11][30-5] = ':';
TXHData.PrintInfo.PrintBuff[11][30-4] = ((TXHData.PrintRecord.RTIME.Min>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30-3] = ((TXHData.PrintRecord.RTIME.Min)&0x0f)+'0';
TXHData.PrintInfo.PrintBuff[11][30-2] = ':';
TXHData.PrintInfo.PrintBuff[11][30-1] = ((TXHData.PrintRecord.RTIME.Sec>>4)&0x0f)+'0';TXHData.PrintInfo.PrintBuff[11][30] = (TXHData.PrintRecord.RTIME.Sec & 0x0f)+'0';
Print_Num(0,12,MD_Connect_u64ToBCD(TXHData.PrintRecord.OrderNumber),0);
for(i = 0;i < 650;i++)
Multiplex_Port_TX_Buff[i] = 0x20;
Multiplex_Port_TX_Buff[0] = LF;
Multiplex_Port_TX_Buff[1] = LF;
for(i = 0;i< 20;i++)
{
for(j = 0;j< 32;j++)
if(TXHData.PrintInfo.PrintBuff[i][j] != 0x20)
break;
if(j < 31)
{
for(j = 0;j< 32;j++)
Multiplex_Port_TX_Buff[k*32+j] = TXHData.PrintInfo.PrintBuff[i][j];
k ++;
}
}
Multiplex_Port_TX_Buff[k*32+32+0] = LF;
Multiplex_Port_TX_Buff[k*32+32+1] = LF;
Multiplex_Port_TX_Buff[k*32+32+2] = LF;
Multiplex_Port_TX_Buff[k*32+32+3] = LF;
Multiplex_Port_TX_Buff[k*32+32+4] = LF;
Multiplex_Port_TX_Buff[k*32+32+5] = LF;
MD_ConnectTX_Len = k*32+32+5;
TXHData.MD_Multiplex_Port_Info.PrintType = PT_Null;
}
}break;
case Multiplex_YWY:
{
Multiplex_Port_Choose(1);
Multiplex_Port_RS485_TxEN1;
Multiplex_Port_USART_Configuration(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].BaudRate,TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].Parity_Even);
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[GunNum] ++;
//switch(TXHData.MD_Port_Data[PosTypeTemp].PortData.Device_Type)
{
//case YWY_Bluesky:
{
switch (MD_TX_CMD)
{
case YWY_MDConnectCmdReadData://读数据
{
for(i = 0;i < 7;i ++)
Multiplex_Port_TX_Buff[i] = Data_201[i];
MD_ConnectTX_Len = 7;
}
break;
case YWY_MDConnectCmdWriteApacity://下载罐容表
{
for(i = 0;i < 7;i ++)
Multiplex_Port_TX_Buff[i] = Data_20E[i];
MD_ConnectTX_Len = 7;
}
break;
}
}//break;
}
}break;
case Multiplex_Price:
{
Multiplex_Port_Choose(2);
Multiplex_Port_RS485_TxEN2;
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[PosTypeTemp] ++;
Multiplex_Port_USART_Configuration(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].BaudRate,TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].Parity_Even);
switch (MD_TX_CMD)
{
case Price_MDConnectCmdWriteParameter://写参数
{
Multiplex_Port_TX_Buff[0] = 0xFE;
Multiplex_Port_TX_Buff[1] = 0xFF;
Multiplex_Port_TX_Buff[2] = 0x04;
Multiplex_Port_TX_Buff[3] = 0x01;
Multiplex_Port_TX_Buff[4] = 0x03;
Tempu64 = Price_DataCheck(&Multiplex_Port_TX_Buff[2],Multiplex_Port_TX_Buff[2]-1);
Multiplex_Port_TX_Buff[5] = Tempu64;
Multiplex_Port_TX_Buff[6] = 0xEF;
MD_ConnectTX_Len = 7;
}
break;
case Price_MDConnectCmdReadParameter://读参数
{
Multiplex_Port_TX_Buff[0] = 0xFE;
Multiplex_Port_TX_Buff[1] = 0xFF;
Multiplex_Port_TX_Buff[2] = 0x04;
Multiplex_Port_TX_Buff[3] = 0x01;
Multiplex_Port_TX_Buff[4] = 0x02;
Tempu64 = Price_DataCheck(&Multiplex_Port_TX_Buff[2],Multiplex_Port_TX_Buff[2]-1);
Multiplex_Port_TX_Buff[5] = Tempu64;
Multiplex_Port_TX_Buff[6] = 0xEF;
MD_ConnectTX_Len = 7;
}
break;
case Price_MDConnectCmdWriteDecimal://写小数位
{
Multiplex_Port_TX_Buff[0] = 0xFE;
Multiplex_Port_TX_Buff[1] = 0xFF;
Multiplex_Port_TX_Buff[2] = 16;
Multiplex_Port_TX_Buff[3] = 0x01;
Multiplex_Port_TX_Buff[4] = 0x04;
for(j = 0;j < TXHData.MD_Multiplex_Port_Info.PriceTagData.PriceNumber;j ++)
{
Multiplex_Port_TX_Buff[5 + j] = TXHData.MD_Multiplex_Port_Info.PriceTagData.Length - TXHData.MD_Multiplex_Port_Info.PriceTagData.Decimal[j];
}
for(j = TXHData.MD_Multiplex_Port_Info.PriceTagData.PriceNumber;j < 17;j ++)
Multiplex_Port_TX_Buff[5 + j] = 0;
Tempu64 = Price_DataCheck(&Multiplex_Port_TX_Buff[2],Multiplex_Port_TX_Buff[2]-1);
Multiplex_Port_TX_Buff[17] = Tempu64;
Multiplex_Port_TX_Buff[18] = 0xEF;
MD_ConnectTX_Len = 19;
}
break;
case Price_MDConnectCmdWritePrice://写单价
{
Multiplex_Port_TX_Buff[0] = 0xFE;
Multiplex_Port_TX_Buff[1] = 0xFF;
Multiplex_Port_TX_Buff[2] = 40;
Multiplex_Port_TX_Buff[3] = 0x01;
Multiplex_Port_TX_Buff[4] = 0x01;
for(i = 5;i < 40; i++)
Multiplex_Port_TX_Buff[i] = 0;
for(i = 0;i < TXHData.MD_Multiplex_Port_Info.PriceTagData.PriceNumber; i++)
{
for(j = 0;j < 3;j ++)
{
if(TXHData.MD_Multiplex_Port_Info.PriceTagData.Length/2 > j)
Multiplex_Port_TX_Buff[5+ j + (i * 3)] = TXHData.MD_Multiplex_Port_Info.PriceTagData.Price[i] >> ((TXHData.MD_Multiplex_Port_Info.PriceTagData.Length/2-1-j)*8);
else
Multiplex_Port_TX_Buff[5+ j + (i * 3)] = 0;
}
}
Tempu64 = Price_DataCheck(&Multiplex_Port_TX_Buff[2],Multiplex_Port_TX_Buff[2]-1);
Multiplex_Port_TX_Buff[41] = Tempu64;
Multiplex_Port_TX_Buff[42] = 0xEF;
MD_ConnectTX_Len = 43;
}
break;
case Price_MDConnectCmdReadPrice://读单价
{
Multiplex_Port_TX_Buff[0] = 0xFE;
Multiplex_Port_TX_Buff[1] = 0xFF;
Multiplex_Port_TX_Buff[2] = 0x04;
Multiplex_Port_TX_Buff[3] = 0x01;
Multiplex_Port_TX_Buff[4] = 0x03;
Tempu64 = Price_DataCheck(&Multiplex_Port_TX_Buff[2],Multiplex_Port_TX_Buff[2]-1);
Multiplex_Port_TX_Buff[5] = Tempu64;
Multiplex_Port_TX_Buff[6] = 0xEF;
MD_ConnectTX_Len = 7;
}
break;
}
}break;
case Multiplex_GPS:
{
Multiplex_Port_Choose(3);
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[GunNum] ++;
Multiplex_Port_USART_Configuration(TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].BaudRate,TXHData.MD_Multiplex_Port_Data.PortData[PosTypeTemp].Parity_Even);
}break;
}
if(MD_ConnectTX_Len)
{
Multiplex_Port_TX_DMALenSet(MD_ConnectTX_Len);
Multiplex_Port_TX_DMAStart();
}
}
void Multiplex_PortRXTask(void)
{
volatile u16 i = 0,j = 0,Temp = 0,DeviceNumber = 0;
volatile u64 TempBCD = 0,Tempu64 = 0;
volatile u8 MD_ConnectRX_Port = 0;
volatile u8 MD_ConnectRX_Len = 0; //长度
volatile u8 MD_ConnectRX_pGun = 0; //地址枪号
volatile u8 MD_ConnectRX_pGun_Sun = 0; //dart协议子枪号
volatile u16 MD_ConnectRX_CMD = 0; //命令
u8 MD_ConnectRX_Check = 0; //校验变量
u8 Buff[50];
u8 POSType_Temp = 0;
volatile u32 CRC_temp = 0;
volatile float TempF = 0;
volatile u8 Tank_Num;
u8 Data_201[7] = "i20100";
u8 Data_20E[7] = "i20E00";
if(TXHData.MD_MultiplexRXIDLETimer.Flag)
{
TXHData.MD_MultiplexRXIDLETimer.Flag = 0;
if(TXHData.MD_Multiplex_Rec_NummberB == 1000 - DMA2_Stream1->NDTR)
{
TXHData.MD_Multiplex_Rec_Nummber = 1000 - DMA2_Stream1->NDTR;
Multiplex_Port_RX_DMAStop(); //关闭DMA接收
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
Multiplex_Port_RX_Flag = 1; //使能Gas接收任务
Multiplex_Port_RX_DMALenSet(1000);//重置接受长度
Multiplex_Port_RX_DMAStart(); //打开DMA接收
}
}
if(Multiplex_Port_RX_Flag == 1)
{
Multiplex_Port_RX_Flag = 0;
POSType_Temp = TXHData.MD_Multiplex_Port_Data.PortData[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].POSType;
switch(POSType_Temp)
{
case Multiplex_Print:
{
TXHData.MD_MultiplexTimer.Flag = 1;
TXHData.MD_MultiplexTimer.TimerCount = 0;
}break;
case Multiplex_YWY:
{
//switch(TXHData.MD_Multiplex_Port_Data.PortData[POSType_Temp].Device_Type)
{
//case YWY_Bluesky:
{
TempBCD = CheckSum(&Multiplex_Port_RX_Buff[1],TXHData.MD_Multiplex_Rec_Nummber - 6);
Tempu64 = StrToInt(&Multiplex_Port_RX_Buff[TXHData.MD_Multiplex_Rec_Nummber - 5],4);
if(Tempu64 == TempBCD)
{
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = 0;
MD_ConnectRX_CMD = Multiplex_Port_RX_Buff[4];
switch(MD_ConnectRX_CMD)
{
case YWY_MDConnectCmdReadData:
{
TXHData.TankNumTop = Tempu64 = (TXHData.MD_Multiplex_Rec_Nummber - 24) / 65;
for(i = 0;i < Tempu64;i ++)
{
if(Multiplex_Port_RX_Buff[23 + i * 65] == 0)
TXHData.TankState[4][i].State = Multiplex_Port_RX_Buff[20 + i * 65];
TempF = StrToFloat(&Multiplex_Port_RX_Buff[26 + i * 65], 8);
if(Multiplex_Port_RX_Buff[26 + i * 65] != 0x3F)
TXHData.TankData[4][i].Data.OV = TempF;
else
TXHData.TankData[4][i].Data.OV = 0;
TempF = StrToFloat(&Multiplex_Port_RX_Buff[50 + i * 65], 8);
if(Multiplex_Port_RX_Buff[50 + i * 65] != 0x3F)
TXHData.TankData[4][i].Data.OH = TempF;
else
TXHData.TankData[4][i].Data.OH = 0;
TempF = StrToFloat(&Multiplex_Port_RX_Buff[58 + i * 65], 8);
if(Multiplex_Port_RX_Buff[58 + i * 65] != 0x3F)
TXHData.TankData[4][i].Data.WH = TempF;
else
TXHData.TankData[4][i].Data.WH = 0;
TempF = StrToFloat(&Multiplex_Port_RX_Buff[66 + i * 65], 8);
if(Multiplex_Port_RX_Buff[66 + i * 65] != 0x3F)
TXHData.TankData[4][i].Data.TH = TempF;
else
TXHData.TankData[4][i].Data.TH = 0;
TXHData.MD_Multiplex_Port_Data.State[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].Flag.Online = 1;
//TXHData.MD_Multiplex_Port_Info[MD_ConnectRX_Port].GunInfo[MD_ConnectRX_pGun].RSSI = Multiplex_Port_RX_Buff[TXHData.MD_Multiplex_Rec_Nummber - 1];
}
}break;
case YWY_MDConnectCmdWriteApacity:
{
}break;
}
}
}//break;
}
TXHData.MD_MultiplexTimer.Flag = 1;
TXHData.MD_MultiplexTimer.TimerCount = 0;
}break;
case Multiplex_Price:
{
MD_ConnectRX_Len = Multiplex_Port_RX_Buff[2];
TempBCD = Price_DataCheck(&Multiplex_Port_RX_Buff[2],MD_ConnectRX_Len - 1);
Tempu64 = Multiplex_Port_RX_Buff[MD_ConnectRX_Len+1];
if(Tempu64 == TempBCD)
{
TXHData.MD_Multiplex_Port_Info.MBCountCutNum[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = 0;
TXHData.MD_MultiplexTimer.Flag = 1;
TXHData.MD_MultiplexTimer.TimerCount = 0;
MD_ConnectRX_CMD = Multiplex_Port_RX_Buff[4];
switch (MD_ConnectRX_CMD)
{
case Price_MDConnectCmdWriteParameter://写参数
{
TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = Price_MDConnectCmdReadPrice;
}
break;
case Price_MDConnectCmdReadParameter://读参数
{
TXHData.MD_Multiplex_Port_Info.Handshake[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = 1;
TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = Price_MDConnectCmdReadPrice;
TXHData.MD_Multiplex_Port_Info.PriceTagData.State.Flag.Online = 1;
TXHData.MD_Multiplex_Port_Info.PriceTagData.SingleOrDouble = Multiplex_Port_RX_Buff[7];
TXHData.MD_Multiplex_Port_Info.PriceTagData.PriceNumber = Multiplex_Port_RX_Buff[8];
TXHData.MD_Multiplex_Port_Info.PriceTagData.Length = Multiplex_Port_RX_Buff[9];
TXHData.MD_Multiplex_Port_Info.PriceTagData.Brightness = Multiplex_Port_RX_Buff[11];
}
break;
case Price_MDConnectCmdWritePrice://写单价
{
TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = Price_MDConnectCmdReadPrice;
}
break;
case Price_MDConnectCmdReadPrice://读单价
{
if(TXHData.MD_Multiplex_Port_Info.Handshake[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] < TXHData.MD_Multiplex_Port_Info.Handshake_Top[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] )
{
TXHData.MD_Multiplex_Port_Data.State[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].Flag.UpdateDisplay = 1;
TXHData.MD_Multiplex_Port_Info.Handshake[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = TXHData.MD_Multiplex_Port_Info.Handshake_Top[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow];
}
TXHData.MD_Multiplex_Port_Data.State[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].Flag.Online = 1;
for(i = 0;i < TXHData.MD_Multiplex_Port_Info.PriceTagData.PriceNumber; i++)
{
TXHData.MD_Multiplex_Port_Info.PriceTagData.Price[i] = 0;
for(j = 0;j < TXHData.MD_Multiplex_Port_Info.PriceTagData.Length/2;j ++)
{
TXHData.MD_Multiplex_Port_Info.PriceTagData.Price[i] |= Multiplex_Port_RX_Buff[5 + j + i*TXHData.MD_Multiplex_Port_Info.PriceTagData.Length/2] << (8*(TXHData.MD_Multiplex_Port_Info.PriceTagData.Length/2 - 1 -j));
}
}
}
break;
case Price_MDConnectCmdWriteDecimal://写小数位
{
TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow] = Price_MDConnectCmdWritePrice;
}
break;
}
}
}break;
case Multiplex_GPS:
{
TXHData.MD_MultiplexTimer.Flag = 1;
TXHData.MD_MultiplexTimer.TimerCount = 0;
Temp = mystrstr(Multiplex_Port_RX_Buff,"RMC");
if(Temp && Temp < 800)
{
for(i = 0;i < 30;i ++)
Multiplex_Port_RX_Buff[i] = Multiplex_Port_RX_Buff[Temp + 14 + i];
TXHData.USART6_Drive = GPS;
if(Multiplex_Port_RX_Buff[0] == 'A')//则提取经度和纬度信息
{
for(i = 0;i < 11;i ++)// 提取经度类型信息,保存到TXHData结构体中
{
if(Multiplex_Port_RX_Buff[2+i] == ',')
break;
Buff[i] = Multiplex_Port_RX_Buff[2 + i];
}
TempF = (float)atof(Buff) / 100;
Tempu64 = TempF;
TempF -= Tempu64;
TXHData.GPSData.GPS.Longitude = Tempu64 + TempF * 100 / 60;
TXHData.GPSData.GPS.LongitudeType = Multiplex_Port_RX_Buff[3 + i];
Temp = 5 + i;
for(i = 0;i < 11;i ++)// 提取维度类型信息,保存到TXHData结构体中
{
if(Multiplex_Port_RX_Buff[Temp + i] == ',')
break;
Buff[i] = Multiplex_Port_RX_Buff[Temp + i];
}
TempF = (float)atof(Buff) / 100;
Tempu64 = TempF;
TempF -= Tempu64;
TXHData.GPSData.GPS.Latitude = Tempu64 + TempF * 100 / 60;
TXHData.GPSData.GPS.LatitudeType = Multiplex_Port_RX_Buff[Temp + i + 1];
}
else //则经纬度信息无效,置为0
{
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
}
}
else //则经纬度信息无效,置为0
{
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
}
}break;
}
for(i = 0;i < 20;i ++)
Multiplex_Port_RX_Buff[i] = 0;
}
}
+47
View File
@@ -0,0 +1,47 @@
#ifndef __Multiplex_Port_H_
#define __Multiplex_Port_H_
/*H******************************************************************************
* NAME: Multiplex_Port.h
*********************************************************************************/
//******************************************************************************
//硬件定义
typedef enum
{
Multiplex_Normal,
Multiplex_GPS=1,
Multiplex_Print=4,
Multiplex_Price=5,
Multiplex_YWY=6,
}MultiplexItem;
#define Multiplex_Port_RS485_RxEN1 GPIO_ResetBits(GPIOC,GPIO_Pin_9);
#define Multiplex_Port_RS485_TxEN1 GPIO_SetBits(GPIOC,GPIO_Pin_9);
#define Multiplex_Port_RS485_RxEN2 GPIO_ResetBits(GPIOC,GPIO_Pin_14);
#define Multiplex_Port_RS485_TxEN2 GPIO_SetBits(GPIOC,GPIO_Pin_14);
#define Multiplex_Port_TX_DMAAddrSet(x) (DMA2_Stream6->M0AR = x) //设置流量计发送缓存地址
#define Multiplex_Port_TX_DMALenSet(x) (DMA2_Stream6->NDTR = x) //设置流量计DMA发送长度
#define Multiplex_Port_TX_DMAStart() DMA_Cmd(DMA2_Stream6,ENABLE) ;Multiplex_Port_TX_Flag = 0; //开启流量计DMA发送
#define Multiplex_Port_TX_DMAStop() DMA_Cmd(DMA2_Stream6,DISABLE) //关闭流量计DMA发送
#define Multiplex_Port_RX_DMAAddrSet(x) (DMA2_Stream1->M0AR = x) //设置流量计接收缓存地址
#define Multiplex_Port_RX_DMALenSet(x) (DMA2_Stream1->NDTR = x) //设置流量计DMA接收
#define Multiplex_Port_RX_DMAStart() DMA_Cmd(DMA2_Stream1,ENABLE) //开启流量计DMA接收
#define Multiplex_Port_RX_DMAStop() DMA_Cmd(DMA2_Stream1,DISABLE) //关闭流量计DMA接收
extern volatile u8 Multiplex_Port_TX_Flag;//
extern volatile u8 Multiplex_Port_RX_Flag;//
extern void Multiplex_Port_DMATX_IRQHandler(void);
extern void Multiplex_Port_DMARX_IRQHandler(void);
extern u16 mystrstr(u8 *s1,u8 *s2);
extern void StringToHex(u8 *Str,u8 *H,u8 Len);
extern u16 CRC_Check(u8 *puchMsg, u16 usDataLen) ;
extern u16 BigToLittle( u16 BigData);
extern void Multiplex_Port_Init(void);
extern void Multiplex_Port_USART_Configuration(u32 Baud,u8 Check);
extern void Multiplex_PortTXTask(u8 PosTypeTemp,u8 MD_TX_CMD);
extern void Multiplex_PortRXTask(void);
extern u8 Price_DataCheck(volatile u8* pData, u16 len);
#endif //#ifndef
+43
View File
@@ -0,0 +1,43 @@
#ifndef __BMP_H
#define __BMP_H
const unsigned char BMP_Bluesky_Con_48[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xF8,0xF8,0xF8,0xF8,0x00,0x80,0x80,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0xD8,0xFC,0xFC,0xFF,0xFF,
0xFF,0xFF,0x7F,0x1F,0x07,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x0F,0x0F,0x06,0x00,0x20,0x40,0x80,0x00,0x00,
0x00,0x80,0xE0,0xF8,0x3C,0x0F,0x07,0x01,0xC0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x8F,0x81,0xC0,0xC0,0xE0,0xF8,0x7C,0x7E,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x87,0xFC,0x00,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x07,0x07,0x03,0x03,
0x03,0x03,0x01,0x01,0x00,0x00,0x00,0xE0,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0x30,0x1C,0x07,0x00,0x00,
0x07,0x1F,0x3F,0xFC,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0x03,0x00,0x80,0x80,
0xC0,0xC0,0x60,0x70,0x70,0x38,0x0C,0x06,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x07,0x0E,0x0E,0x0E,0x1C,0x1C,0x1C,0x1C,
0x1C,0x1C,0x1C,0x1C,0x1C,0x1D,0x1D,0x1F,0x0F,0x0F,0x0E,0x07,0x07,0x03,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*"G:\蓝天图标.bmp",0*/
};
const unsigned char BMP_Bluesky_Con_24[] =
{
0x00,0x00,0x00,0x80,0xC0,0x60,0xF0,0xF8,0xFE,0xFE,0x3E,0x18,0x08,0x08,0x08,0x08,0x08,0x00,0x30,0x30,0x00,0x40,0x80,0x00,0xF8,0xFE,0x07,0x01,0x1C,0x3F,0x3F,0x1F,
0x1B,0x18,0x0E,0xCF,0xFF,0xFF,0xFF,0x7F,0x0F,0x0F,0x0F,0x07,0x80,0xC0,0x7B,0x0E,0x07,0x0F,0x1C,0x38,0x30,0x30,0x60,0x60,0x60,0x60,0x7E,0x7F,0x3F,0x3F,0x31,0x18,
0x18,0x0C,0x0E,0x03,0x03,0x00,0x00,0x00};/*"G:\蓝天图标24.bmp",0*/;
const unsigned char BMP_Bluesky_Empty_8[] =
{0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF};/*"空心",0*/
const unsigned char BMP_Bluetooth_9[] =
{0x00,0x01,0x82,0x44,0xFF,0x11,0xAA,0x44,0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00};/*"蓝牙",0*/
const unsigned char BMP_GPS_9[] =
{0x10,0x38,0x54,0x82,0xD7,0x82,0x54,0x38,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00};/*"定位",0*/
const unsigned char BMP_GPS_None_9[] =
{0x10,0x38,0x54,0x82,0xC7,0x82,0x54,0x38,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00};/*"定位",0*/
const unsigned char BMP_WIFI0_14x8[] =
{0x00,0x00,0x00,0x82,0x44,0x28,0x10,0x28,0x44,0x82,0x00,0x00,0x00,0x00};/*"F:\BlueSky\网络通讯盒\WIFI-3.bmp",0*/
const unsigned char BMP_WIFI1_14x8[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00};/*"F:\BlueSky\网络通讯盒\WIFI-3.bmp",0*/
const unsigned char BMP_WIFI2_14x8[] =
{0x00,0x00,0x00,0x00,0x20,0x10,0xD0,0xD0,0x10,0x20,0x00,0x00,0x00,0x00};/*"F:\BlueSky\网络通讯盒\WIFI-3.bmp",0*/
const unsigned char BMP_WIFI3_14x8[] =
{0x00,0x00,0x10,0x08,0x24,0x14,0xD4,0xD4,0x14,0x24,0x08,0x10,0x00,0x00};/*"F:\BlueSky\网络通讯盒\WIFI-3.bmp",0*/
const unsigned char BMP_WIFI4_14x8[] =
{0x08,0x04,0x12,0x09,0x25,0x15,0xD5,0xD5,0x15,0x25,0x09,0x12,0x04,0x08};/*"F:\BlueSky\网络通讯盒\WIFI-3.bmp",0*/
#endif
+449
View File
@@ -0,0 +1,449 @@
#include "config.h"
#include "oledfont.h"
u8 OLED_GRAM[144][8];
//反显函数
void OLED_ColorTurn(u8 i)
{
if(i==0)
{
OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
}
if(i==1)
{
OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
}
}
//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{
if(i==0)
{
OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
OLED_WR_Byte(0xA1,OLED_CMD);
}
if(i==1)
{
OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
OLED_WR_Byte(0xA0,OLED_CMD);
}
}
/****************************************************
函数名:OLED_SPI2_SendByte
功能 :FM存储部分用到的SPI发送函数
参数 dt 要发送的数据
返回值:无
****************************************************/
u8 OLED_SPI2_SendByte(u8 dt)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, dt);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
void OLED_WR_Byte(u8 dat,u8 cmd)
{
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
OLED_CS_Clr();
OLED_SPI2_SendByte(dat);
OLED_CS_Set();
OLED_DC_Set();
}
//开启OLED显示
void OLED_DisPlay_On(void)
{
OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵
OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕
}
//关闭OLED显示
void OLED_DisPlay_Off(void)
{
OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵
OLED_WR_Byte(0xAE,OLED_CMD);//关闭屏幕
}
//更新显存到OLED 1.8ms
void OLED_Refresh(void)
{
u8 i=0,n=0;
OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址
OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址
for(i=0;i<8;i++)
{
for(n=0;n<128;n++)
OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
}
}
//清屏函数
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)
{
for(n=0;n<128;n++)
{
OLED_GRAM[n][i]=0;//清除所有数据
}
}
//OLED_Refresh();//更新显示
}
//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
u8 i,m,n;
i=y/8;
m=y%8;
n=1<<m;
if(t){OLED_GRAM[x][i]|=n;}
else
{
OLED_GRAM[x][i]=~OLED_GRAM[x][i];
OLED_GRAM[x][i]|=n;
OLED_GRAM[x][i]=~OLED_GRAM[x][i];
}
}
//画线
//x1,y1:起点坐标
//x2,y2:结束坐标
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;//画线起点坐标
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if (delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if (delta_y==0)incy=0;//水平线
else {incy=-1;delta_y=-delta_x;}
if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<distance+1;t++)
{
OLED_DrawPoint(uRow,uCol,mode);//画点
xerr+=delta_x;
yerr+=delta_y;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x,u8 y,u8 r)
{
int a, b,num;
a = 0;
b = r;
while(2 * b * b >= r * r)
{
OLED_DrawPoint(x + a, y - b,1);
OLED_DrawPoint(x - a, y - b,1);
OLED_DrawPoint(x - a, y + b,1);
OLED_DrawPoint(x + a, y + b,1);
OLED_DrawPoint(x + b, y + a,1);
OLED_DrawPoint(x + b, y - a,1);
OLED_DrawPoint(x - b, y - a,1);
OLED_DrawPoint(x - b, y + a,1);
a++;
num = (a * a + b * b) - r*r;//计算画的点离圆心的距离
if(num > 0)
{
b--;
a--;
}
}
}
void OLED_DrawArc(int rx,int ry,int r, int j)
{
float x, y,i = 0;
float angleInRadians = j * (3.1415926 / 180.0); // 将角度转换为弧度
float startAngle = -angleInRadians / 2.0; // 计算起始角度(弧度)
float endAngle = angleInRadians / 2.0; // 计算结束角度(弧度)
float increment = (endAngle - startAngle) / 20.0;
for (i = startAngle; i <= angleInRadians; i += increment) {
x = rx + (r * sin(i));
y = ry - (r * cos(i)); // 注意Y轴的方向可能需要根据你的显示设备调整
OLED_DrawPoint(x, y, 1); // 绘制点,假设WHITE是你要使用的颜色
}
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
u8 i,m,temp,size2,chr1;
u8 x0=x,y0=y;
if(size1==8)size2=6;
else size2=(size1/8+((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数
chr1=chr-' '; //计算偏移后的值
for(i=0;i<size2;i++)
{
if(size1==8)
{temp=asc2_0806[chr1][i];} //调用0806字体
else if(size1==12)
{temp=asc2_1206[chr1][i];} //调用1206字体
else if(size1==16)
{temp=asc2_1608[chr1][i];} //调用1608字体
else if(size1==24)
{temp=asc2_2412[chr1][i];} //调用2412字体
else return;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((size1!=8)&&((x-x0)==size1/2))
{x=x0;y0=y0+8;}
y=y0;
}
}
//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Maxlen,u8 size1,u8 mode)
{
while(Maxlen && (*chr>=' ') && (*chr<='~'))//判断是不是非法字符!
{
OLED_ShowChar(x,y,*chr,size1,mode);
if(size1==8)x+=6;
else x+=size1/2;
chr++;
Maxlen --;
}
}
//显示进度条
//x,y:起点坐标
//sizex:长
//sizex:宽
//Num进度
//mode:0,反色显示;1,正常显示
void OLED_ProgressBar(u8 x,u8 y,u8 sizex,u8 sizey,u8 num,u8 mode)
{
u8 Setp = sizex * num / 100;
u8 i = 0;
OLED_DrawLine(x,y,x+sizex,y,1);
OLED_DrawLine(x,y+sizey,x+sizex,y+sizey,1);
OLED_DrawLine(x,y,x,y+sizey,1);
OLED_DrawLine(x+sizex,y,x+sizex,y+sizey,1);
for(i = 0;i < sizey;i ++)
{
OLED_DrawLine(x,y+i,x+Setp,y+i,1);
}
}
//m^n
u32 OLED_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)
{
result*=m;
}
return result;
}
//显示数字
//x,y :起点坐标
//num :要显示的数字
//len :数字的位数,0表示自适应
//size:字体大小
//mode:0,反色显示;1,正常显示
//u8 OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
//{
// u8 t,temp,m=0;
// if(len == 0)
// len = (int)(log10(num) + 1);
// if(size1==8)m=2;
// for(t=0;t<len;t++)
// {
// temp=(num/OLED_Pow(10,len-t-1))%10;
// if(temp==0)
// {
// OLED_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode);
// }
// else
// {
// OLED_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode);
// }
// }
// return len;
//}
u8 OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 Dec, u8 size1, u8 mode)
{
u8 t, temp, m = 0,d = 0;
if(len == 0)
len = (int)(log10(num) + 1);
//if(Dec)len++;
if (size1 == 8)
m = 2;
if(len <= Dec && Dec > 0)
{
OLED_ShowChar(x, y, '0', size1, mode);
x += (size1 / 2 + m);
}
for(t = 0; t < len+d; t++)
{
if(t == len - Dec)
{ // 判断是否到了小数点位置
OLED_ShowChar(x + (size1 / 2 + m) * t, y, '.', size1, mode); // 显示小数点
d = 1;
continue;
}
// if(t >= len - Dec)
// d = 1;
// else
// d = 0;
temp = (num / OLED_Pow(10, len+d - t - 1)) % 10;
if(temp == 0)
{
OLED_ShowChar(d + x + (size1 / 2 + m) * t, y, '0', size1, mode);
}
else
{
OLED_ShowChar(d + x + (size1 / 2 + m) * t, y, temp + '0', size1, mode);
}
}
return len;
}
//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)
{
u16 j=0;
u8 i,n,temp,m;
u8 x0=x,y0=y;
sizey=sizey/8+((sizey%8)?1:0);
for(n=0;n<sizey;n++)
{
for(i=0;i<sizex;i++)
{
temp=BMP[j];
j++;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((x-x0)==sizex)
{
x=x0;
y0=y0+8;
}
y=y0;
}
}
}
//OLED的初始化
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOB,ENABLE);//使能PORTA~E,PORTG时钟
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
delay_ms(200);
OLED_RES_Clr();
delay_ms(200);
OLED_RES_Set();
delay_ms(200);
OLED_WR_Byte(0xFD,OLED_CMD);
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0xA0,OLED_CMD);
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
if(TXHData.HardwareVersion > 31)//24-31是大板,32-38是小板
{
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
}
else
{
OLED_WR_Byte(0xA0,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC0,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
}
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0x7F,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0x82,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x34,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0x20,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD);
//OLED_ShowPicture(0,0,128,64,BMP1,1);
OLED_Refresh();
}
+42
View File
@@ -0,0 +1,42 @@
#ifndef __OLED_H
#define __OLED_H
//-----------------OLED¶Ë¿Ú¶¨Òå----------------
#define OLED_RES_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_10)//RES
#define OLED_RES_Set() GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_11)//DC
#define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_11)
#define OLED_CS_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_12);GPIO_SetBits(GPIOB,GPIO_Pin_12);
#define OLED_CS_Set() GPIO_SetBits(GPIOD,GPIO_Pin_12)
#define OLED_CMD 0 //дÃüÁî
#define OLED_DATA 1 //дÊý¾Ý
void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
void OLED_WR_Byte(u8 dat,u8 mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_DrawArc(int rx,int ry,int r, int j) ;
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Maxlen,u8 size1,u8 mode);
u8 OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 Dec, u8 size1, u8 mode);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
void OLED_ProgressBar(u8 x,u8 y,u8 sizex,u8 sizey,u8 num,u8 mode);
void OLED_Init(void);
#endif
+426
View File
@@ -0,0 +1,426 @@
#ifndef __OLEDFONT_H
#define __OLEDFONT_H
const unsigned char asc2_0806[][6] =
{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp
{0x00, 0x00, 0x00, 0x2f, 0x00, 0x00},// !
{0x00, 0x00, 0x07, 0x00, 0x07, 0x00},// "
{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14},// #
{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12},// $
{0x00, 0x62, 0x64, 0x08, 0x13, 0x23},// %
{0x00, 0x36, 0x49, 0x55, 0x22, 0x50},// &
{0x00, 0x00, 0x05, 0x03, 0x00, 0x00},// '
{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00},// (
{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00},// )
{0x00, 0x14, 0x08, 0x3E, 0x08, 0x14},// *
{0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},// +
{0x00, 0x00, 0x00, 0xA0, 0x60, 0x00},// ,
{0x00, 0x08, 0x08, 0x08, 0x08, 0x08},// -
{0x00, 0x00, 0x60, 0x60, 0x00, 0x00},// .
{0x00, 0x20, 0x10, 0x08, 0x04, 0x02},// /
{0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
{0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},// 1
{0x00, 0x42, 0x61, 0x51, 0x49, 0x46},// 2
{0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},// 3
{0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},// 4
{0x00, 0x27, 0x45, 0x45, 0x45, 0x39},// 5
{0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
{0x00, 0x01, 0x71, 0x09, 0x05, 0x03},// 7
{0x00, 0x36, 0x49, 0x49, 0x49, 0x36},// 8
{0x00, 0x06, 0x49, 0x49, 0x29, 0x1E},// 9
{0x00, 0x00, 0x36, 0x36, 0x00, 0x00},// :
{0x00, 0x00, 0x56, 0x36, 0x00, 0x00},// ;
{0x00, 0x08, 0x14, 0x22, 0x41, 0x00},// <
{0x00, 0x14, 0x14, 0x14, 0x14, 0x14},// =
{0x00, 0x00, 0x41, 0x22, 0x14, 0x08},// >
{0x00, 0x02, 0x01, 0x51, 0x09, 0x06},// ?
{0x00, 0x32, 0x49, 0x59, 0x51, 0x3E},// @
{0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C},// A
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},// B
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},// C
{0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},// D
{0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},// E
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},// F
{0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},// G
{0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},// H
{0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},// I
{0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},// J
{0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},// K
{0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},// L
{0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},// M
{0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},// N
{0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},// O
{0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},// P
{0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
{0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},// R
{0x00, 0x46, 0x49, 0x49, 0x49, 0x31},// S
{0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},// T
{0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},// U
{0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},// V
{0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},// W
{0x00, 0x63, 0x14, 0x08, 0x14, 0x63},// X
{0x00, 0x07, 0x08, 0x70, 0x08, 0x07},// Y
{0x00, 0x61, 0x51, 0x49, 0x45, 0x43},// Z
{0x00, 0x00, 0x7F, 0x41, 0x41, 0x00},// [
{0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55},// 55
{0x00, 0x00, 0x41, 0x41, 0x7F, 0x00},// ]
{0x00, 0x04, 0x02, 0x01, 0x02, 0x04},// ^
{0x00, 0x40, 0x40, 0x40, 0x40, 0x40},// _
{0x00, 0x00, 0x01, 0x02, 0x04, 0x00},// '
{0x00, 0x20, 0x54, 0x54, 0x54, 0x78},// a
{0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},// b
{0x00, 0x38, 0x44, 0x44, 0x44, 0x20},// c
{0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},// d
{0x00, 0x38, 0x54, 0x54, 0x54, 0x18},// e
{0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},// f
{0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},// g
{0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},// h
{0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},// i
{0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},// j
{0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},// k
{0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},// l
{0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},// m
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},// n
{0x00, 0x38, 0x44, 0x44, 0x44, 0x38},// o
{0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},// p
{0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},// q
{0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},// r
{0x00, 0x48, 0x54, 0x54, 0x54, 0x20},// s
{0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},// t
{0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},// u
{0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},// v
{0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},// w
{0x00, 0x44, 0x28, 0x10, 0x28, 0x44},// x
{0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},// y
{0x00, 0x44, 0x64, 0x54, 0x4C, 0x44},// z
{0x14, 0x14, 0x14, 0x14, 0x14, 0x14},// horiz lines
};
//12*12 ASCII字符集点阵
const unsigned char asc2_1206[95][12]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"!",1*/
{0x00,0x0C,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x90,0xD0,0xBC,0xD0,0xBC,0x90,0x00,0x03,0x00,0x03,0x00,0x00},/*"#",3*/
{0x18,0x24,0xFE,0x44,0x8C,0x00,0x03,0x02,0x07,0x02,0x01,0x00},/*"$",4*/
{0x18,0x24,0xD8,0xB0,0x4C,0x80,0x00,0x03,0x00,0x01,0x02,0x01},/*"%",5*/
{0xC0,0x38,0xE4,0x38,0xE0,0x00,0x01,0x02,0x02,0x01,0x02,0x02},/*"&",6*/
{0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0xF8,0x04,0x02,0x00,0x00,0x00,0x01,0x02,0x04},/*"(",8*/
{0x00,0x02,0x04,0xF8,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00},/*")",9*/
{0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"*",10*/
{0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00},/*",",12*/
{0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x80,0x60,0x1C,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00},/*"/",15*/
{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"0",16*/
{0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"1",17*/
{0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00},/*"2",18*/
{0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"3",19*/
{0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00},/*"4",20*/
{0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"5",21*/
{0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"6",22*/
{0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00},/*"7",23*/
{0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"8",24*/
{0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"9",25*/
{0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00},/*";",27*/
{0x00,0x20,0x50,0x88,0x04,0x02,0x00,0x00,0x00,0x00,0x01,0x02},/*"<",28*/
{0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x02,0x04,0x88,0x50,0x20,0x00,0x02,0x01,0x00,0x00,0x00},/*">",30*/
{0x18,0x04,0xC4,0x24,0x18,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"?",31*/
{0xF8,0x04,0xE4,0x94,0xF8,0x00,0x01,0x02,0x02,0x02,0x02,0x00},/*"@",32*/
{0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02},/*"A",33*/
{0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"B",34*/
{0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"C",35*/
{0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"D",36*/
{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"E",37*/
{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"F",38*/
{0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00},/*"G",39*/
{0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02},/*"H",40*/
{0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"I",41*/
{0x00,0x04,0x04,0xFC,0x04,0x04,0x06,0x04,0x04,0x03,0x00,0x00},/*"J",42*/
{0x04,0xFC,0x24,0xD0,0x0C,0x04,0x02,0x03,0x02,0x00,0x03,0x02},/*"K",43*/
{0x04,0xFC,0x04,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x02,0x03},/*"L",44*/
{0xFC,0x3C,0xC0,0x3C,0xFC,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"M",45*/
{0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00},/*"N",46*/
{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"O",47*/
{0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"P",48*/
{0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00},/*"Q",49*/
{0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"R",50*/
{0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00},/*"S",51*/
{0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"T",52*/
{0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00},/*"U",53*/
{0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00},/*"V",54*/
{0x1C,0xE0,0x3C,0xE0,0x1C,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"W",55*/
{0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"X",56*/
{0x04,0x1C,0xE0,0x1C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"Y",57*/
{0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"Z",58*/
{0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x00},/*"[",59*/
{0x00,0x0E,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00},/*"\",60*/
{0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x04,0x07,0x00,0x00},/*"]",61*/
{0x00,0x04,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08},/*"_",63*/
{0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"a",65*/
{0x04,0xFC,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"b",66*/
{0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"c",67*/
{0x00,0xC0,0x20,0x24,0xFC,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"d",68*/
{0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"e",69*/
{0x00,0x20,0xF8,0x24,0x24,0x04,0x00,0x02,0x03,0x02,0x02,0x00},/*"f",70*/
{0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x07,0x0A,0x0A,0x0A,0x04},/*"g",71*/
{0x04,0xFC,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"h",72*/
{0x00,0x20,0xE4,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"i",73*/
{0x00,0x00,0x20,0xE4,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00},/*"j",74*/
{0x04,0xFC,0x80,0xE0,0x20,0x20,0x02,0x03,0x02,0x00,0x03,0x02},/*"k",75*/
{0x04,0x04,0xFC,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"l",76*/
{0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"m",77*/
{0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"n",78*/
{0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00},/*"o",79*/
{0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00},/*"p",80*/
{0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08},/*"q",81*/
{0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"r",82*/
{0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00},/*"s",83*/
{0x00,0x20,0xF8,0x20,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x00},/*"t",84*/
{0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"u",85*/
{0x20,0xE0,0x20,0x80,0x60,0x20,0x00,0x00,0x03,0x01,0x00,0x00},/*"v",86*/
{0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"w",87*/
{0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"x",88*/
{0x20,0xE0,0x20,0x80,0x60,0x20,0x08,0x08,0x07,0x01,0x00,0x00},/*"y",89*/
{0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00},/*"z",90*/
{0x00,0x00,0x20,0xDE,0x02,0x00,0x00,0x00,0x00,0x07,0x04,0x00},/*"{",91*/
{0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00},/*"|",92*/
{0x00,0x02,0xDE,0x20,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00},/*"}",93*/
{0x02,0x01,0x02,0x04,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
//16*16 ASCII字符集点阵
const unsigned char asc2_1608[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},/*"!",1*/
{0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},/*"#",3*/
{0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},/*"$",4*/
{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},/*"%",5*/
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},/*"&",6*/
{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",8*/
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",9*/
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",10*/
{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},/*"/",15*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",16*/
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"1",17*/
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",18*/
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},/*"3",19*/
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},/*"4",20*/
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},/*"5",21*/
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"6",22*/
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",24*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},/*"9",25*/
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},/*"<",28*/
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"=",29*/
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},/*">",30*/
{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00},/*"?",31*/
{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00},/*"@",32*/
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",33*/
{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},/*"B",34*/
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},/*"C",35*/
{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},/*"D",36*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},/*"E",37*/
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},/*"F",38*/
{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},/*"G",39*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},/*"H",40*/
{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"I",41*/
{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},/*"J",42*/
{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},/*"K",43*/
{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},/*"L",44*/
{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},/*"M",45*/
{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},/*"N",46*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},/*"O",47*/
{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},/*"P",48*/
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00},/*"Q",49*/
{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},/*"R",50*/
{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},/*"S",51*/
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"T",52*/
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"U",53*/
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},/*"V",54*/
{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00},/*"W",55*/
{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},/*"X",56*/
{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"Y",57*/
{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},/*"Z",58*/
{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},/*"[",59*/
{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},/*"\",60*/
{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},/*"a",65*/
{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},/*"b",66*/
{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},/*"c",67*/
{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20},/*"d",68*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},/*"e",69*/
{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"f",70*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},/*"g",71*/
{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"h",72*/
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},/*"j",74*/
{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00},/*"k",75*/
{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"l",76*/
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},/*"m",77*/
{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},/*"n",78*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},/*"o",79*/
{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00},/*"p",80*/
{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80},/*"q",81*/
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",82*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",83*/
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00},/*"t",84*/
{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},/*"u",85*/
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00},/*"v",86*/
{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},/*"w",87*/
{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00},/*"x",88*/
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00},/*"y",89*/
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40},/*"{",91*/
{0x08,0x04,0xFE,0x04,0x08,0xC0,0x00,0x00,0x00,0x00,0x03,0x10,0x20,0x7F,0x20,0x10},/*"|",92*/
{0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
//24*24 ASICII字符集点阵
const unsigned char asc2_2412[][36]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x80,0x60,0x30,0x1C,0x8C,0x60,0x30,0x1C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x86,0xE6,0x9F,0x86,0x86,0x86,0x86,0xE6,0x9F,0x86,0x00,0x00,0x01,0x1F,0x01,0x01,0x01,0x01,0x01,0x1F,0x01,0x01,0x00},/*"#",3*/
{0x00,0x00,0x80,0xC0,0x60,0x20,0xF8,0x20,0xE0,0xC0,0x00,0x00,0x00,0x00,0x03,0x07,0x0C,0x18,0xFF,0x70,0xE1,0x81,0x00,0x00,0x00,0x00,0x07,0x0F,0x10,0x10,0x7F,0x10,0x0F,0x07,0x00,0x00},/*"$",4*/
{0x80,0x60,0x20,0x60,0x80,0x00,0x00,0x00,0xE0,0x20,0x00,0x00,0x0F,0x30,0x20,0x30,0x9F,0x70,0xDC,0x37,0x10,0x30,0xC0,0x00,0x00,0x00,0x10,0x0E,0x03,0x00,0x07,0x18,0x10,0x18,0x07,0x00},/*"%",5*/
{0x00,0x00,0xC0,0x20,0x20,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x1F,0x38,0xE8,0x87,0x03,0xC4,0x3C,0x04,0x00,0x00,0x07,0x0F,0x18,0x10,0x10,0x0B,0x07,0x0D,0x10,0x10,0x08,0x00},/*"&",6*/
{0x00,0x80,0x8C,0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x30,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x18,0x20,0x40,0x00},/*"(",8*/
{0x00,0x04,0x08,0x30,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x66,0x66,0x3C,0x18,0xFF,0x18,0x3C,0x66,0x66,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8C,0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x38,0x0C,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0x1C,0x03,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x0E,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x18,0x0E,0x07,0x01,0x00},/*"0",16*/
{0x00,0x00,0x80,0x80,0x80,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"1",17*/
{0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0x03,0x03,0x00,0x80,0x40,0x20,0x38,0x1F,0x07,0x00,0x00,0x00,0x1C,0x1A,0x19,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00},/*"2",18*/
{0x00,0x80,0xC0,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x10,0x10,0x18,0x2F,0xE7,0x80,0x00,0x00,0x00,0x07,0x0F,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0x00,0x00,0x00,0x00,0xC0,0xB0,0x88,0x86,0x81,0x80,0xFF,0xFF,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00},/*"4",20*/
{0x00,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x3F,0x10,0x08,0x08,0x08,0x18,0xF0,0xE0,0x00,0x00,0x00,0x07,0x0B,0x10,0x10,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00},/*"5",21*/
{0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0xE0,0xC0,0x00,0x00,0x00,0xFC,0xFF,0x21,0x10,0x08,0x08,0x08,0x18,0xF0,0xE0,0x00,0x00,0x01,0x07,0x0C,0x18,0x10,0x10,0x10,0x08,0x0F,0x03,0x00},/*"6",22*/
{0x00,0x00,0xC0,0xE0,0x60,0x60,0x60,0x60,0x60,0xE0,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xE0,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x87,0xEF,0x2C,0x18,0x18,0x30,0x30,0x68,0xCF,0x83,0x00,0x00,0x07,0x0F,0x08,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"8",24*/
{0x00,0x00,0xC0,0xC0,0x20,0x20,0x20,0x20,0xC0,0x80,0x00,0x00,0x00,0x1F,0x3F,0x60,0x40,0x40,0x40,0x20,0x10,0xFF,0xFE,0x00,0x00,0x00,0x0C,0x1C,0x10,0x10,0x10,0x08,0x0F,0x03,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x10,0x28,0x44,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00},/*">",30*/
{0x00,0xC0,0x20,0x20,0x10,0x10,0x10,0x10,0x30,0xE0,0xC0,0x00,0x00,0x03,0x03,0x00,0x00,0xF0,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0xC0,0x40,0x60,0x20,0x20,0x20,0x40,0xC0,0x00,0x00,0xFC,0xFF,0x01,0xF0,0x0E,0x03,0xC1,0xFE,0x03,0x80,0x7F,0x00,0x01,0x07,0x0E,0x08,0x11,0x11,0x10,0x11,0x09,0x04,0x02},/*"@",32*/
{0x00,0x00,0x00,0x00,0x80,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7C,0x43,0x40,0x47,0x7F,0xF8,0x80,0x00,0x00,0x10,0x18,0x1F,0x10,0x00,0x00,0x00,0x00,0x13,0x1F,0x1C,0x10},/*"A",33*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x18,0x2F,0xE7,0x80,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"B",34*/
{0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x20,0x60,0xE0,0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x10,0x08,0x04,0x03,0x00},/*"C",35*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x18,0x08,0x0E,0x07,0x01,0x00},/*"D",36*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"E",37*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0x60,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x01,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/
{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x40,0xE0,0x00,0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x40,0x40,0xC0,0xC1,0x40,0x40,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x10,0x0F,0x0F,0x00,0x00},/*"G",39*/
{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x20,0xE0,0xE0,0x20,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0xFF,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10},/*"H",40*/
{0x00,0x00,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x00,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x60,0xE0,0x80,0x80,0x80,0xC0,0x7F,0x3F,0x00,0x00,0x00},/*"J",42*/
{0x20,0xE0,0xE0,0x20,0x00,0x00,0x20,0xA0,0x60,0x20,0x20,0x00,0x00,0xFF,0xFF,0x30,0x18,0x7C,0xE3,0xC0,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x01,0x13,0x1F,0x1C,0x18,0x10},/*"K",43*/
{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"L",44*/
{0x20,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0xE0,0xE0,0xE0,0x20,0x00,0xFF,0x01,0x3F,0xFE,0xC0,0xE0,0x1E,0x01,0xFF,0xFF,0x00,0x10,0x1F,0x10,0x00,0x03,0x1F,0x03,0x00,0x10,0x1F,0x1F,0x10},/*"M",45*/
{0x20,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x20,0x00,0xFF,0x00,0x03,0x07,0x1C,0x78,0xE0,0x80,0x00,0xFF,0x00,0x10,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0x00},/*"N",46*/
{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x18,0x0C,0x07,0x01,0x00},/*"O",47*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0xFF,0xFF,0x20,0x20,0x20,0x20,0x20,0x30,0x1F,0x0F,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/
{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x11,0x11,0x13,0x3C,0x7C,0x67,0x21,0x00},/*"Q",49*/
{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x30,0xF0,0xD0,0x08,0x0F,0x07,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x03,0x0F,0x1C,0x10,0x10},/*"R",50*/
{0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x40,0x40,0xE0,0x00,0x00,0x07,0x0F,0x0C,0x18,0x18,0x30,0x30,0x60,0xE0,0x81,0x00,0x00,0x1F,0x0C,0x08,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"S",51*/
{0x80,0x60,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00},/*"T",52*/
{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x20,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x10,0x10,0x08,0x07,0x00},/*"U",53*/
{0x20,0x60,0xE0,0xE0,0x20,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x07,0x7F,0xF8,0x80,0x00,0x80,0x7C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x1C,0x07,0x00,0x00,0x00,0x00},/*"V",54*/
{0x20,0xE0,0xE0,0x20,0x00,0xE0,0xE0,0x20,0x00,0x20,0xE0,0x20,0x00,0x07,0xFF,0xF8,0xE0,0x1F,0xFF,0xFC,0xE0,0x1F,0x00,0x00,0x00,0x00,0x03,0x1F,0x03,0x00,0x01,0x1F,0x03,0x00,0x00,0x00},/*"W",55*/
{0x00,0x20,0x60,0xE0,0xA0,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x03,0x8F,0x7C,0xF8,0xC6,0x01,0x00,0x00,0x00,0x00,0x10,0x18,0x1E,0x13,0x00,0x01,0x17,0x1F,0x18,0x10,0x00},/*"X",56*/
{0x20,0x60,0xE0,0xE0,0x20,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x01,0x07,0x3E,0xF8,0xE0,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00},/*"Y",57*/
{0x00,0x80,0x60,0x20,0x20,0x20,0x20,0xA0,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0x3E,0x0F,0x03,0x00,0x00,0x00,0x00,0x10,0x1C,0x1F,0x17,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x40,0x40,0x00},/*"[",59*/
{0x00,0x00,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x1C,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x70,0x80,0x00},/*"\",60*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x10,0x08,0x0C,0x04,0x0C,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
{0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0xD8,0x44,0x64,0x24,0x24,0xFC,0xF8,0x00,0x00,0x00,0x0F,0x1F,0x18,0x10,0x10,0x10,0x08,0x1F,0x1F,0x10,0x18},/*"a",65*/
{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x18,0x08,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x00,0x1F,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x03,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x18,0x04,0x04,0x04,0x3C,0x38,0x00,0x00,0x00,0x00,0x03,0x0F,0x0C,0x10,0x10,0x10,0x10,0x08,0x06,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x04,0x04,0x08,0xFF,0xFF,0x00,0x00,0x00,0x03,0x0F,0x18,0x10,0x10,0x10,0x08,0x1F,0x0F,0x08,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x48,0x44,0x44,0x44,0x4C,0x78,0x70,0x00,0x00,0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x04,0x00},/*"e",69*/
{0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0xE0,0xC0,0x00,0x00,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0x8C,0x04,0x04,0x8C,0xF8,0x74,0x04,0x0C,0x00,0x70,0x76,0xCF,0x8D,0x8D,0x8D,0x89,0xC8,0x78,0x70,0x00},/*"g",71*/
{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x08,0x04,0x04,0x04,0xFC,0xF8,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00},/*"h",72*/
{0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x80,0xC0,0x7F,0x3F,0x00,0x00,0x00},/*"j",74*/
{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0xC0,0xF4,0x1C,0x04,0x04,0x00,0x00,0x00,0x10,0x1F,0x1F,0x11,0x00,0x03,0x1F,0x1C,0x10,0x10,0x00},/*"k",75*/
{0x00,0x00,0x20,0x20,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x04,0xFC,0xFC,0x08,0x04,0xFC,0xFC,0x00,0x10,0x1F,0x1F,0x10,0x00,0x1F,0x1F,0x10,0x00,0x1F,0x1F,0x10},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x08,0x04,0x04,0xFC,0xF8,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0x18,0x0C,0x04,0x04,0x0C,0x18,0xF0,0xE0,0x00,0x00,0x03,0x0F,0x0C,0x10,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x04,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x80,0xFF,0xFF,0x88,0x90,0x10,0x10,0x1C,0x0F,0x03,0x00},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x04,0x04,0x08,0xF8,0xFC,0x00,0x00,0x00,0x03,0x0F,0x18,0x10,0x10,0x90,0x88,0xFF,0xFF,0x80,0x00},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x10,0x08,0x04,0x04,0x0C,0x0C,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xCC,0xC4,0x84,0x84,0x84,0x0C,0x1C,0x00,0x00,0x00,0x1E,0x18,0x10,0x10,0x10,0x11,0x19,0x0F,0x06,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x10,0x10,0x10,0x0C,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFE,0x00,0x00,0x00,0x04,0xFC,0xFE,0x00,0x00,0x00,0x00,0x0F,0x1F,0x18,0x10,0x10,0x08,0x1F,0x0F,0x08,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x3C,0xFC,0xC4,0x00,0x00,0xC4,0x3C,0x0C,0x04,0x00,0x00,0x00,0x00,0x01,0x0F,0x1E,0x0E,0x01,0x00,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x3C,0xFC,0xC4,0x00,0xE4,0x7C,0xFC,0x84,0x80,0x7C,0x04,0x00,0x00,0x07,0x1F,0x07,0x00,0x00,0x07,0x1F,0x07,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x1C,0x7C,0xE4,0xC0,0x34,0x1C,0x04,0x04,0x00,0x00,0x10,0x10,0x1C,0x16,0x01,0x13,0x1F,0x1C,0x18,0x10,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x3C,0xFC,0xC4,0x00,0xC4,0x3C,0x04,0x04,0x00,0x00,0x00,0xC0,0x80,0xC1,0x37,0x0E,0x01,0x00,0x00,0x00,0x00},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x04,0x04,0xC4,0xF4,0x7C,0x1C,0x04,0x00,0x00,0x00,0x00,0x10,0x1C,0x1F,0x17,0x11,0x10,0x10,0x18,0x0E,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x28,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x60,0x40,0x00,0x00},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x04,0x0C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x28,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x18,0x06,0x02,0x02,0x04,0x08,0x10,0x20,0x20,0x30,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
const unsigned char Hzk1[][32]={
{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},/*"中",0*/
{0x40,0x40,0x40,0x5F,0x55,0x55,0x55,0x75,0x55,0x55,0x55,0x5F,0x40,0x40,0x40,0x00,0x00,0x40,0x20,0x0F,0x09,0x49,0x89,0x79,0x09,0x09,0x09,0x0F,0x20,0x40,0x00,0x00},/*"景",1*/
{0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},/*"园",2*/
{0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00},/*"电",3*/
{0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"子",4*/
{0x10,0x10,0x10,0xFF,0x10,0x90,0x08,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x08,0x00,0x04,0x44,0x82,0x7F,0x01,0x80,0x80,0x40,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00},/*"技",5*/
{0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x12,0x1C,0x10,0x10,0x00,0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xFF,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"术",6*/
{0x04,0x04,0x04,0x84,0xE4,0x3C,0x27,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,0x04,0x02,0x01,0x00,0xFF,0x09,0x09,0x09,0x09,0x49,0x89,0x7F,0x00,0x00,0x00,0x00},/*"有",7*/
{0x00,0xFE,0x22,0x5A,0x86,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,0xFF,0x04,0x08,0x07,0x00,0xFF,0x40,0x20,0x03,0x0C,0x14,0x22,0x41,0x40,0x00},/*"限",8*/
{0x00,0x80,0x40,0x20,0x18,0x06,0x80,0x00,0x07,0x18,0x20,0x40,0x80,0x00,0x00,0x00,0x01,0x00,0x20,0x70,0x28,0x26,0x21,0x20,0x20,0x24,0x38,0x60,0x00,0x01,0x01,0x00},/*"公",9*/
{0x00,0x10,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x12,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x3F,0x00,0x40,0x80,0x7F,0x00,0x00,0x00},/*"司",10*/
};
const unsigned char Hzk2[][72]={
{0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFC,0x84,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"中",0*/
};
const unsigned char Hzk3[][128]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"中",0*/
};
const unsigned char Hzk4[][512]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF0,0xF0,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFF,0xFF,0xFF,0xFF,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFF,0xFF,0xFF,0xFF,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"中",0*/
};
#endif
File diff suppressed because it is too large Load Diff
+137
View File
@@ -0,0 +1,137 @@
#ifndef __POS_Connect_H_
#define __POS_Connect_H_
/*H******************************************************************************
* NAME: POS_Connect.h
*********************************************************************************/
#define POSConnect_Cloud GPIO_ResetBits(GPIOB,GPIO_Pin_5);
#define POSConnect_Station GPIO_SetBits(GPIOB,GPIO_Pin_5);
#define POS_NET GPIOAin(0)
#define POS_LinkB GPIOAin(1)
#define POS_LinkA GPIOAin(2)
/*********************蓝天协议指令集************************/
#define POSConnect_Authorize 0xA1 //
#define POSConnect_ChangePrice 0xA2 //
#define POSConnect_Config 0xA3 //
#define POSConnect_DisAuthorize 0xA4 //
#define POSConnect_Preset 0xA5 //
#define POSConnect_Heartbeat 0x0A //
#define POSConnect_SynchronizationTime 0x0B //
#define POSConnect_TankAPCDownload 0x0C //
#define POSConnect_BoxROMownload 0x0D //
#define POSConnect_BoxVersion 0x0E //
#define POSConnect_PREXDATAUp 0x1F //
#define POSConnect_FuelData 0x10 //
#define POSConnect_DeviceVersion 0x11 //
#define POSConnect_DeviceROMownload 0x12 //
#define POSConnect_PrintfInfo 0x14 //
#define POSConnect_Print 0x15 //
#define POSConnect_WhiteList 0x16 //
#define POSConnect_WritePriceTag 0x18 //
//硬件定义
#define POS_ConnectUsart USART1
#define POS_Connect_DMA DMA1
#define POS_Connect_TX_DMALenSet(x) (DMA2_Stream7->NDTR = x) //设置发送DMA长度
#define POS_Connect_TX_DMAStart() DMA_Cmd(DMA2_Stream7,ENABLE) //开启发送DMA
#define POS_Connect_TX_DMAStop() DMA_Cmd(DMA2_Stream7,DISABLE) //开启发送DMA
#define POS_Connect_RX_DMALenSet(x) (DMA2_Stream5->NDTR = x) //设置DMA长度
#define POS_Connect_RX_DMAStart() DMA_Cmd(DMA2_Stream5,ENABLE) //开启DMA
#define POS_Connect_RX_DMAStop() DMA_Cmd(DMA2_Stream5,DISABLE) //开启DMA
//缓冲数定义
#define C_POS_Connect_TX_Buff 100 //发送缓存大小
#define C_POS_Connect_RX_Buff 100 //接收缓存大小
typedef enum
{
USRK3_ENTM,
USRK3_Model_Set_1,
USRK3_Model_Set_2,
USRK3_Rec,
USRK3_DHCP,
USRK3_GetIP,
USRK3_SOCKET,
USRK3_GetLinkState,
USRK3_RST,
}USRK3_Item;
typedef enum
{
WIFI_ATRec,
WIFI_WifiWSSSID,
WIFI_WifiRSSI,
WIFI_WifiSOCKET,
WIFI_WifiRST,
WIFI_WMODE,
}WIFICMD_Item;
typedef enum
{
GM5_ENTM,
GM5_Model_Set_1,
GM5_Model_Set_2,
GM5_Rec,
GM5_HEARTEN,
GM5_UARTFL,
GM5_APN,
GM5_LinkMode,
GM5_GetIMEI,
GM5_GetICCID,
GM5_SOCKET,
GM5_CSQ,
GM5_Save,
GM5_RESET,
}GM5_Item;
typedef enum
{
L510_ATRec,
L510_IMEI,
L510_SetGPSMode,
L510_ICPIN,
L510_ICCID,
L510_RSSI,
L510_Model_NET,
L510_APN,
L510_NETOPEN,
L510_SOCKET,
L510_GetLinkState,
L510_AT,
L510_RESET,
L510_GetGPS,
}L510CMD_Item;
//******************************************************************************
//*-------------- 变量声名 -----------------------------------------------------
//******************************************************************************
extern volatile u8 POS_Connect_TX_Flag; //接收任务可以运行标志
extern const char TsatURL[];
extern volatile u8 MD_Set_Flag_pGun;
extern volatile u8 MD_POS_Flag_pGun;
extern volatile u8 POS2MD_Buff[2000];//pos的回复转接到wifi从机
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
extern void POS_Connect_Init(void); //POS_Connect卡键盘任务初始化
extern void POS_Network_Init(void);
extern void POS_Connect_DMARX_IRQHandler(void); //POS_Connect卡键盘接收中断服务函数
extern void POS_Connect_DMATX_IRQHandler(void); //DMA发送中断服务函数
extern u64 POS_Connect_u64ToBCD(u64 Dat); //整型转换成BCD码
extern u64 POS_Connect_BCDTou64(u64 Dat); //BCD码转换成整型
extern void POS_ConnectRXTask(void); //数据接收任务
extern u16 POS_ConnectTXTask(u8 POS_Connect_Typ,u8 GunNum,u8 POS_Connect_Com);//数据发送任务
extern u8 Encrypt_Data(u8 Data,u8 Type,u8 Bit);
extern u8 Decode_Data(u8 Data,u8 Type,u8 Bit);
extern u16 DartCRC16(u8 *puchMsg, u16 usDataLen) ;
extern u8 SUMCRC(u8 *puchMsg, u16 usDataLen) ;
extern void InitQueue(MessageQueue_Type *Queue) ;
extern void EnQueue(MessageQueue_Type *Queue, u8 Content,u8 Priority);
extern Message_Type *DeQueue(MessageQueue_Type *Queue) ;
//查询队列中是不是包含特定消息
extern u8 FindMessage(MessageQueue_Type *Queue,u8 Content);
extern u16 CRC_Check(u8 *puchMsg, u16 usDataLen) ;
void POS_Network_APN_Set(void);
#endif //#ifndef
+176
View File
@@ -0,0 +1,176 @@
#include "config.h" //全局声明
/*_____ D E C L A R A T I O N ________________________________________________*/
void Print_Num(u8 GunNum,u8 Lin,u64 Num,u8 Dec)
{
volatile u8 i,j,D;
for(i = 22;i < 32;i ++)
TXHData.PrintInfo.PrintBuff[Lin][i] = 0x20;
for(i = 0;i< 16;i++)
{
if((Num>>(i*4)) == 0)
break;
}
if(i <= Dec && Dec > 0)
{
if(i == 0 )
i+=Dec;
i ++;
TXHData.PrintInfo.PrintBuff[Lin][30-i] = '0';
}
if(Dec)
{
D = 1;
TXHData.PrintInfo.PrintBuff[Lin][30- Dec] = '.';
}
for(j = 0;j < Dec; j++)
TXHData.PrintInfo.PrintBuff[Lin][30- j] = 0x30 + (((Num>>j*4)) & 0x00000000000f);
for(j = Dec+D;j < i + D; j++)
TXHData.PrintInfo.PrintBuff[Lin][30- (j+1-D)] = 0x30 + (((Num>>(j-D)*4)) & 0x00000000000f);
}
//********************************************************************************************************
//** 函数名称:print_init()
//** 函数功能:硬件初始化。
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t print_init(uint8_t *pData)
{
*pData++ = ESC;
*pData = 0x40;
return 2;
}
//********************************************************************************************************
//** 函数名称:printSetChinese()
//** 函数功能:设置中文打印
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printChinese(uint8_t *pData)
{
*pData++ = 0X1C;
*pData++ = '&';
return 2;
}
//********************************************************************************************************
//** 函数名称:printCR()
//** 函数功能:打印当前所有,并走一行
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printCR(uint8_t *pData)
{
*pData = PCR;
return 1;
}
//********************************************************************************************************
//** 函数名称:printLF()
//** 函数功能:走纸。
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printLF(uint8_t *pData)
{
*pData = LF;
return 1;
}
//********************************************************************************************************
//** 函数名称:LFnRow()
//** 函数功能:执行N点行走纸。
//** 入口参数:行数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t LFnRow(uint8_t *pData,uint8_t row)
{
*pData++ = ESC;
*pData++ = J;
*pData = row;
return 3;
}
//********************************************************************************************************
//** 函数名称:setPageLen()
//** 函数功能:设置页长。
//** 入口参数:页长 (0表示256页)
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setPageLen(uint8_t *pData,uint8_t pageLen)
{
*pData++ = ESC;
*pData++ = 0x43;
*pData = pageLen;
return 3;
}
//********************************************************************************************************
//** 函数名称:setLeftSpace(uint8 spaceNumber)
//** 函数功能:设置左间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setLeftSpace(uint8_t *pData,uint8_t spaceNumber)
{
*pData++ = ESC;
*pData++ = 0x6c;
*pData = spaceNumber;
return 3;
}
//********************************************************************************************************
//** 函数名称:setRightSpace(uint8 spaceNumber)
//** 函数功能:设置右间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setRightSpace(uint8_t *pData,uint8_t spaceNumber)
{
*pData++ = ESC;
*pData++ = 0x51;
*pData = spaceNumber;
return 3;
}
//********************************************************************************************************
//** 函数名称:setWordSpace(uint8 wordSpace)
//** 函数功能:设置字间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setWordSpace(uint8_t *pData, uint8_t wordSpace)
{
*pData++ = ESC;
*pData++ = 0x70;
*pData = wordSpace;
return 3;
}
//********************************************************************************************************
//** 函数名称:setRowSpace(uint8 rowSpace)
//** 函数功能:设置字间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setRowSpace(uint8_t *pData, uint8_t rowSpace)
{
*pData++ = ESC;
*pData++ = 0x31;
*pData = rowSpace;
return 3;
}
//F*****************************************************************************
//* NAME:
//* PURPOSE:
//* PARAMS:
//* return:
//******************************************************************************
+75
View File
@@ -0,0 +1,75 @@
#ifndef __Printf_H_
#define __Printf_H_
//硬件定义
#define PrintfUsart USART3
#define Printf_DMA DMA1
#define Printf_TX_DMAAddrSet(x) (DMA1_Channel2->CMAR = x) //设置发送缓存地址
#define Printf_TX_DMALenSet(x) (DMA1_Channel2->CNDTR = x) //设置发送DMA长度
#define Printf_TX_DMAStart() DMA_Cmd(DMA1_Channel2,ENABLE) //开启发送DMA
#define Printf_TX_DMAStop() DMA_Cmd(DMA1_Channel2,DISABLE) //开启发送DMA
#define Printf_TX_DMAy_Channelx DMA1_Channel2 //Printf发送使用的DMA通道
#define USART3_Print GPIO_ResetBits(GPIOA,GPIO_Pin_4);//485接收使能
//=============================================================================
//字符定义
#define LF 0x0a //打印换行命令
#define ESC 0X1B
#define J 0x4A
#define DLE 0X10
#define EOT 0X04
#define PCR 0X0D
#define C_PrintPageLen 10 //定义页长
#define C_multiple 2 //放大倍数
#define C_leftSpace 1 //右限
#define C_rightSpace 0 //右限
#define C_wordSpace 1 //字间距
#define C_rowSpace 4 //行间距
typedef enum
{
noSend,
sending,
}printProStae_TypeDef;
//******************************************************************************
//*-------------- 变量声名 -----------------------------------------------------
//******************************************************************************
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
extern void printUsartIsr(void);
extern void printTxDmaInt(void);
extern void printSend(u8 *pData, u8 len);
extern void Print_Num(u8 GunNum,u8 Lin,u64 Num,u8 Dec);
extern uint8_t print_init(uint8_t *pdata);
extern uint8_t printChinese(uint8_t *pData);
extern uint8_t printLF(uint8_t *pdata);
extern uint8_t printCR(uint8_t *pData);
extern uint8_t LFnRow(uint8_t *pData,uint8_t row);
extern uint8_t setPageLen(uint8_t *pData,uint8_t pageLen);
extern uint8_t setLeftSpace(uint8_t *pData,uint8_t spaceNumber);
extern uint8_t setRightSpace(uint8_t *pData,uint8_t spaceNumber);
extern uint8_t setWordSpace(uint8_t *pData, uint8_t wordSpace);
extern uint8_t setRowSpace(uint8_t *pData, uint8_t rowSpace);
typedef enum
{
PT_Null,
PT_LastRecord,
PT_Record,
}PrintItem;
extern void Printf_DMATX_IRQHandler(void);
extern void Printf_Init(void);
extern void PrintfTask(void);
void Printf_UpData(u8 GunNum, PrintItem Type);
#endif //#ifndef
+219
View File
@@ -0,0 +1,219 @@
/*C*****************************************************************************
* NAME: print.c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
*
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
#include "main_def.h" //全局声明
uint8_t printBuf[gunNumber][C_printBuf];
uint32_t printQueue[gunNumber][C_printQueue];
volatile printProStae_TypeDef printState = noSend;
//******************************************************************************
// printUsartIsr(void) 打印串口中断
//******************************************************************************
void printUsartIsr(void)
{
//TC中断
if((printUsart->SR & USART_FLAG_TC) != 0)
{
// printUsart->CR1 &= ~USART_Mode_Tx;
printUsart->CR1 &= ~USART_FLAG_TC; //禁止TC中断
printUsart->SR &= ~USART_FLAG_TC; //清除TC中断标志
printState = noSend;
}
//RX中断
else if((printUsart->SR & USART_FLAG_RXNE) != 0)
{
printUsart->CR1 &= ~USART_FLAG_RXNE; ///禁止接收中断
printUsart->SR &= ~USART_FLAG_RXNE; ///清接收中断
}
}
//******************************************************************************
// printTxDmaInt 打印DMA串口中断
//******************************************************************************
void printTxDmaInt(void)
{
printT_DMAy_Channelx->CCR &= ~0x01; //使用能DMA
printT_DMAy_Channelx->CCR &= ~DMA_IT_TC; //禁止DMA中断
print_DMA->IFCR |= 0X01 << ((printTxDmaChNb - 1)<< 2); ///清DMA中断
printUsart->CR1 |= USART_FLAG_TC; //使能TC中断
printUsart->CR3 &= ~(0X01 << 7); //禁用口发送触发
}
//******************************************************************************
//printSend
//******************************************************************************
void printSend(uint8_t *pData, uint8_t len)
{
printState = sending;
printUsart->CR1 &= ~USART_Mode_Rx;
printUsart->CR1 |= USART_Mode_Tx;
///初始化默认值
//启动DMA数据发送
printT_DMAy_Channelx->CMAR = (u32)pData; ///初始化源寄存器地址
printT_DMAy_Channelx->CPAR = (u32)(&(printUsart->DR)); ///初始化目的寄存器地址
printT_DMAy_Channelx->CNDTR = len; ///初始化数据个数
//使能串口DMA
print_DMA->IFCR |= 0X01 << ((printTxDmaChNb - 1) << 2);
printT_DMAy_Channelx->CCR |= DMA_IT_TC; ///使能DMATC中断
printT_DMAy_Channelx->CCR |= 0x01; ///使用能DMA
printUsart->SR &= ~USART_FLAG_TC ; ///清除TC中断标志
printUsart->CR1 &= ~USART_FLAG_TC ; ///禁止TC中断
printUsart->CR3 &= ~(0x01 << 6);
printUsart->CR3 |= 0X01 << 7; //启用串口触发DMA
}
//********************************************************************************************************
//** 函数名称:print_init()
//** 函数功能:硬件初始化。
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t print_init(uint8_t *pData)
{
*pData++ = ESC;
*pData = 0x40;
return 2;
}
//********************************************************************************************************
//** 函数名称:printSetChinese()
//** 函数功能:设置中文打印
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printChinese(uint8_t *pData)
{
*pData++ = 0X1C;
*pData++ = '&';
return 2;
}
//********************************************************************************************************
//** 函数名称:printCR()
//** 函数功能:打印当前所有,并走一行
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printCR(uint8_t *pData)
{
*pData = PCR;
return 1;
}
//********************************************************************************************************
//** 函数名称:printLF()
//** 函数功能:走纸。
//** 入口参数:
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t printLF(uint8_t *pData)
{
*pData = LF;
return 1;
}
//********************************************************************************************************
//** 函数名称:LFnRow()
//** 函数功能:执行N点行走纸。
//** 入口参数:行数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t LFnRow(uint8_t *pData,uint8_t row)
{
*pData++ = ESC;
*pData++ = J;
*pData = row;
return 3;
}
//********************************************************************************************************
//** 函数名称:setPageLen()
//** 函数功能:设置页长。
//** 入口参数:页长 (0表示256页)
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setPageLen(uint8_t *pData,uint8_t pageLen)
{
*pData++ = ESC;
*pData++ = 0x43;
*pData = pageLen;
return 3;
}
//********************************************************************************************************
//** 函数名称:setLeftSpace(uint8 spaceNumber)
//** 函数功能:设置左间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setLeftSpace(uint8_t *pData,uint8_t spaceNumber)
{
*pData++ = ESC;
*pData++ = 0x6c;
*pData = spaceNumber;
return 3;
}
//********************************************************************************************************
//** 函数名称:setRightSpace(uint8 spaceNumber)
//** 函数功能:设置右间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setRightSpace(uint8_t *pData,uint8_t spaceNumber)
{
*pData++ = ESC;
*pData++ = 0x51;
*pData = spaceNumber;
return 3;
}
//********************************************************************************************************
//** 函数名称:setWordSpace(uint8 wordSpace)
//** 函数功能:设置字间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setWordSpace(uint8_t *pData, uint8_t wordSpace)
{
*pData++ = ESC;
*pData++ = 0x70;
*pData = wordSpace;
return 3;
}
//********************************************************************************************************
//** 函数名称:setRowSpace(uint8 rowSpace)
//** 函数功能:设置字间距。
//** 入口参数:间距数
//** 出口参数:字节数量
//*********************************************************************************************************/
uint8_t setRowSpace(uint8_t *pData, uint8_t rowSpace)
{
*pData++ = ESC;
*pData++ = 0x31;
*pData = rowSpace;
return 3;
}
//F*****************************************************************************
//* NAME:
//* PURPOSE:
//* PARAMS:
//* return:
//******************************************************************************
+71
View File
@@ -0,0 +1,71 @@
#ifndef __PRINT_H_
#define __PRINT_H_
/*H******************************************************************************
* NAME: time_count.h
*********************************************************************************/
//硬件定义
#define printUsart USART3
#define print_DMA DMA1
#define printR_DMAy_Channelx DMA1_Channel3
#define printT_DMAy_Channelx DMA1_Channel2
#define printRxDmaChNb 3
#define printTxDmaChNb 2
//缓冲数定义
#define C_printBuf 100
#define C_printQueue 80 //打印机消息队列
//=============================================================================
//字符定义
#define LF 0x0a //打印换行命令
#define ESC 0X1B
#define J 0x4A
#define DLE 0X10
#define EOT 0X04
#define PCR 0X0D
typedef enum
{
noSend,
sending,
}printProStae_TypeDef;
//******************************************************************************
//*-------------- 变量声名 -----------------------------------------------------
//******************************************************************************
extern uint8_t printBuf[gunNumber][C_printBuf];
extern uint32_t printQueue[gunNumber][C_printQueue];
extern volatile printProStae_TypeDef printState;
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
extern void printUsartIsr(void);
extern void printTxDmaInt(void);
extern void printSend(u8 *pData, u8 len);
extern uint8_t print_init(uint8_t *pdata);
extern uint8_t printChinese(uint8_t *pData);
extern uint8_t printLF(uint8_t *pdata);
extern uint8_t printCR(uint8_t *pData);
extern uint8_t LFnRow(uint8_t *pData,uint8_t row);
extern uint8_t setPageLen(uint8_t *pData,uint8_t pageLen);
extern uint8_t setLeftSpace(uint8_t *pData,uint8_t spaceNumber);
extern uint8_t setRightSpace(uint8_t *pData,uint8_t spaceNumber);
extern uint8_t setWordSpace(uint8_t *pData, uint8_t wordSpace);
extern uint8_t setRowSpace(uint8_t *pData, uint8_t rowSpace);
#endif //#ifndef
+160
View File
@@ -0,0 +1,160 @@
#include "config.h"
/****************************************************
函数名:Pluse_InPut_IO_Configuration
功能 Pluse_InPut部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void Pluse_InPut_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GOIP配置结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD| RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
GPIO_SetBits(GPIOD,GPIO_Pin_14 | GPIO_Pin_15);
GPIO_SetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13);
GPIO_ResetBits(GPIOE,GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_SetBits(GPIOG,GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_SetBits(GPIOA,GPIO_Pin_10);
if(Key1 == 1)
{
TXHData.BoardType = 1; //新主板,带屏幕的
}
else
TXHData.BoardType = 0;
}
/****************************************************
函数名:Pluse_InPut_EXTI_Configuration
功能 :中断配置(掉电检测)
参数 :无
返回值:无
****************************************************/
void Pluse_InPut_EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure; //定义中断配置结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource1);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource8);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource9);
/* 配置 EXTI_Line0 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能 LINE10
EXTI_Init(&EXTI_InitStructure);//
/* 配置 EXTI_Line1 */
EXTI_InitStructure.EXTI_Line = EXTI_Line1;//LINE1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能 LINE10
EXTI_Init(&EXTI_InitStructure);//
}
void Pluse_InPut_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中断 11
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级 0
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//响应优先级 2
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
// NVIC_Init(&NVIC_InitStructure);//配置 NVIC
/***************************断电检测****************************/
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断 0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//响应优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//外部中断 1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//响应优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置 NVIC
}
void Pluse_InPut_Init(void)
{
Pluse_InPut_IO_Configuration();
delay_ms(100);
Pluse_InPut_EXTI_Configuration();
Pluse_InPut_NVIC_Configuration();
if(POS_Wireless == SWF_ON)
{
if(POS_URL == SWF_ON)
TXHData.POS_Info.ConnectType = POS_Connect_Typ_Cloud_Tast;
else
TXHData.POS_Info.ConnectType = POS_Connect_Typ_Cloud;
TXHData.POS_Info.NetType = ~((POS_NetTypeH << 1) | POS_NetTypeL);
TXHData.POS_Info.NetType &= 0x03;
}
else
{
TXHData.POS_Info.ConnectType = POS_Connect_Typ_Station;
}
if(POS_Monitor == SWF_ON)
TXHData.POS_MonitorModel = 1;
else
TXHData.POS_MonitorModel = 0;
TXHData.HardwareVersion = ((HV4 << 4) | (HV3 << 3) | (HV2 << 2) | (HV1 << 1) | HV0) + 24;//最高位1表示小板。0表示标准版
}
void Pluse_InPut_IRQHandler(void)
{
u8 i = 0;
/****************拉断开关1***************/
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line8);
}
/****************拉断开关2***************/
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line9);
}
/****************掉电检测***************/
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
TXHData.PowerDown.Flag.Power10V = 1 - PowerLow10V;
EXTI_ClearITPendingBit(EXTI_Line10);
}
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
TXHData.PowerDown.Flag.Power7V = 1 - PowerLow7V;
EXTI_ClearITPendingBit(EXTI_Line10);
}
}
+52
View File
@@ -0,0 +1,52 @@
#ifndef __PLUSE_INPUT_H__
#define __PLUSE_INPUT_H__
#define SWF1 GPIODin(14)
#define SWF2 GPIODin(15)
#define SWF3 GPIOGin(2)
#define SWF4 GPIOGin(3)
#define SWF5 GPIOGin(4)
#define SWF6 GPIOGin(5)
#define SWF7 GPIOGin(6)
#define SWF8 GPIOGin(7)
#define URGENCY1 GPIOEin(8)
#define URGENCY2 GPIOEin(9)
#define Key1 GPIOEin(10)
#define Key2 GPIOEin(11)
#define Key3 GPIOEin(12)
#define Key4 GPIOEin(13)
#define HV0 GPIOEin(3)
#define HV1 GPIOEin(4)
#define HV2 GPIOEin(5)
#define HV3 GPIOEin(6)
#define HV4 GPIOEin(7)
#define POS_4G_NET GPIOAin(0)
#define POS_4G_LinkB GPIOAin(1)
#define POS_4G_LinkA GPIOAin(2)
#define PowerLow10V GPIOEin(0)
#define PowerLow7V GPIOEin(1)
#define SWF_OFF 1
#define SWF_ON 0
#define POS_Wireless SWF2//
#define POS_NetTypeL SWF3//
#define POS_NetTypeH SWF4//
#define POS_Monitor SWF6//ON¼à¿ØÄ£Ê½
#define POS_URL SWF7//ON²âÊÔ·þÎñÆ÷
extern void Pluse_InPut_Init(void);
extern void Pluse_InPut_IRQHandler(void);
//------------------------------------------------------------------------------
#endif
+43
View File
@@ -0,0 +1,43 @@
#include "config.h"
/****************************************************
函数名:Pluse_Putout_IO_Configuration
功能 Pluse_Putout部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void Pluse_Putout_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GOIP配置结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_ResetBits(GPIOE,GPIO_Pin_2);
if(TXHData.POS_Info.NetType == POS_Net_Typ_WAN || TXHData.POS_Info.NetType == POS_Net_Typ_4G_L510)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
Valve1 = SWF_OFF;
Valve2 = SWF_OFF;
}
void Pluse_Putout_Init(void)
{
Pluse_Putout_IO_Configuration();
}
void Pluse_PutoutTast(void)
{
u8 Buff[20];
}
+18
View File
@@ -0,0 +1,18 @@
#ifndef __PLUSE_PUTOUT_H__
#define __PLUSE_PUTOUT_H__
#define POS_LinkA_Out GPIOAout(2)
#define Valve1 GPIOEout(14)
#define Valve2 GPIOEout(15)
#define BEEP GPIOEout(2)
#define BEEP_ON BEEP = 1
#define BEEP_OFF BEEP = 0
extern void Pluse_Putout_Init(void);
extern void Pluse_PutoutTast(void);
//------------------------------------------------------------------------------
#endif
+295
View File
@@ -0,0 +1,295 @@
#include "config.h"
volatile u8 SensorCount2TXTask_Flag = 1;//SensorCount接受任务标志位,1允许运行
volatile u8 SensorCount_DMA_RX_Len = 23;
/*_____ D E F I N I T I O N __________________________________________________*/
/****************************************************
函数名:SensorCount_IO_Configuration
功能 SensorCount ModBus通讯部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void SensorCount_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_UART5);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_UART5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
Sensor2_RS485_RxEN;
}
/****************************************************
函数名:SensorCount_NVIC_Configuration
功能 SensorCount ModBus通讯Usart1和发送DMA中断配置
参数 :无
返回值:无
****************************************************/
void SensorCount_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
//USART5_DMA
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************
函数名 SensorCount_USART_Configuration()
功能 : 串口初始化
传入参数:无
返回值 :无
**************************************************/
void SensorCount_USART_Configuration(u32 Baud,u8 Check)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
USART_InitStructure.USART_BaudRate =Baud;// Baud;//?????
if(Check == Even)
{
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;
}
else if(Check == None)
{
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
}
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(UART5, &USART_InitStructure);
USART_Cmd(UART5, ENABLE);
USART_DMACmd(UART5, USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
}
/*************************************************
函数名 DMA_Configuration()
功能 DMA初始化
传入参数:无
返回值 :无
**************************************************/
void SensorCount_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
/*******************发送TX*********************/
DMA_DeInit(DMA1_Stream7);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
//DMA_InitStructure.DMA_BufferSize = UART_DMA_SEND_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_Init(DMA1_Stream7, &DMA_InitStructure);
DMA_ITConfig(DMA1_Stream7, DMA_IT_TC, ENABLE);
//DMA_Cmd(DMA1_Stream3, ENABLE);
/*******************RX*********************/
DMA_DeInit(DMA1_Stream0);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 23;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)YWYData.SensorMail.Buff;
DMA_Init(DMA1_Stream0, &DMA_InitStructure);
DMA_ITConfig(DMA1_Stream0, DMA_IT_TC, ENABLE);
DMA_ClearFlag(DMA1_Stream0, DMA_IT_TCIF0);
DMA_Cmd(DMA1_Stream0, ENABLE);
}
//F*****************************************************************************
//* NAME: SensorCount2_DMATX_IRQHandler
//* PURPOSE: DMA传输完成中断,SensorCount ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount2_DMATX_IRQHandler(void)
{
SensorCount2_TX_DMAStop(); //关闭DMA传输 (SensorCount发送)
/**********************DR寄存器里面有数据开启DMA时会自动放入一个数据,长度减一。应对方法:接收中断重设长度,打开DMA,发送中断关闭DMA,重设长度,打开DMA********************/
SensorCount2_RX_DMAStop();
SensorCount2_RX_DMALenSet(SensorCount_DMA_RX_Len);//重置接受长度
DMA_ClearFlag(DMA1_Stream7, DMA_IT_TCIF7);
while(! USART_GetFlagStatus(UART5, USART_FLAG_TC))NULL;
Sensor2_RS485_RxEN;
SensorCount2TXTask_Flag = 1;
SensorCount2_RX_DMAStart();
}
//F*****************************************************************************
//* NAME: SensorCount_DMARX_IRQHandler
//* PURPOSE: DMA传输完成中断,SensorCount ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount2_DMARX_IRQHandler(void)
{
u16 CRC_Temp;
SensorCount2_RX_DMAStop(); //DMA接收
DMA_ClearFlag(DMA1_Stream0, DMA_IT_TCIF0);
SensorCount2_RX_DMAAddrSet((u32)YWYData.SensorMail.Buff);
SensorCount2_RX_DMALenSet(SensorCount_DMA_RX_Len);//重置接受长度
SensorCount2_RX_DMAStart();
CRC_Temp = CRC_Check(YWYData.SensorMail.Buff,YWYData.SensorMail.Register.Len + 3);
if(CRC_Temp == YWYData.SensorMail.Register.Crc)
{
YWYData.SensorMail_Flag = 1; //使能LcdCount接收任务
}
//使能LcdCount接收任务
}
//F*****************************************************************************
//* NAME: SensorCount_Init
//* PURPOSE: SensorCount通讯初始化
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount_Init(void)
{
u8 i = 0;
SensorCount_IO_Configuration();
SensorCount_USART_Configuration(9600,None);
SensorCount_DMA_Configuration();
SensorCount_NVIC_Configuration();
YWYData.Sensor_Ask_Timer.Init = 0; //清除初始化标志
YWYData.Sensor_Ask_Timer.Flag = 1; //清除到时标志
YWYData.Sensor_Ask_Timer.ON_OFF = 1; //打开轮训开关
YWYData.Sensor_Ask_Timer.Cycle = 1; //设置为循环模式
YWYData.Sensor_Ask_Timer.TimerCountMax = 100; //周期1001SSensor_ERR_Timer
YWYData.Sensor_ERR_Timer[0].Init = 0; //清除初始化标志
YWYData.Sensor_ERR_Timer[0].Flag = 0; //清除到时标志
YWYData.Sensor_ERR_Timer[0].ON_OFF = 1; //打开轮训开关
YWYData.Sensor_ERR_Timer[0].Cycle = 1; //设置为循环模式
YWYData.Sensor_ERR_Timer[0].TimerCountMax = 200; //周期1001SSensor_ERR_Timer
YWYData.Sensor_ERR_Timer[1].Init = 0; //清除初始化标志
YWYData.Sensor_ERR_Timer[1].Flag = 0; //清除到时标志
YWYData.Sensor_ERR_Timer[1].ON_OFF = 1; //打开轮训开关
YWYData.Sensor_ERR_Timer[1].Cycle = 1; //设置为循环模式
YWYData.Sensor_ERR_Timer[1].TimerCountMax = 200; //周期1001S
YWYData.PowerOffDelay_Timer.Init = 0; //清除初始化标志
YWYData.PowerOffDelay_Timer.Flag = 0; //清除到时标志
YWYData.PowerOffDelay_Timer.ON_OFF = 0; //打开轮训开关
YWYData.PowerOffDelay_Timer.Cycle = 0; //设置为循环模式
YWYData.PowerOffDelay_Timer.TimerCountMax = 6000; //周期600060S
}
/***********RS485/探针命令发送************
*****************************************
*****************************************/
u8 Sensor_TX_Buff[10] = {0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x00};
u8 Sensor_Ask_Data(u8 ID)//
{
u16 i = 10;
u16 CRC_Temp = 0;
Sensor2_RS485_TxEN;
SensorCount2TXTask_Flag = 0;
Sensor_TX_Buff[0] = ID + 1;
CRC_Temp = CRC_Check(Sensor_TX_Buff,6);
Sensor_TX_Buff[7] = CRC_Temp >> 8;
Sensor_TX_Buff[6] = CRC_Temp;
SensorCount2_TX_DMAAddrSet((u32)Sensor_TX_Buff);
SensorCount2_TX_DMALenSet(8);
SensorCount2_TX_DMAStart();
SensorCount_DMA_RX_Len = 7;
}
u8 Sensor_Ask_NumNow = 0;
void Sensor_Tast(void)
{
if(YWYData.Sensor_Ask_Timer.Flag == 1)
{
YWYData.Sensor_Ask_Timer.Flag = 0;
Sensor_Ask_Data(Sensor_Ask_NumNow);
Sensor_Ask_NumNow ++;
if(Sensor_Ask_NumNow > 1)
Sensor_Ask_NumNow = 0;
}
if(YWYData.SensorMail_Flag == 1)
{
YWYData.SensorMail_Flag = 0;
if(YWYData.SensorMail.Register.SensorNum < 3)
{
if(YWYData.SensorMail.Register.Dat != 0x0200)
YWYData.ErrState[YWYData.SensorMail.Register.SensorNum - 1].Flag.GasLeakage = 0;
else
YWYData.ErrState[YWYData.SensorMail.Register.SensorNum - 1].Flag.GasLeakage = 1;
}
}
}
+50
View File
@@ -0,0 +1,50 @@
#ifndef __SensorCount_H_
#define __SensorCount_H_
/*H******************************************************************************
* NAME: SensorCount.h
*********************************************************************************/
typedef union
{
u8 Buff[50]; //ModBus寄存器组
__packed struct
{
u8 SensorNum : 8;
u8 Cmd : 8;
u8 Len : 8;
u16 Dat : 16;
u16 Crc : 16;
}Register;
}Sensor_RX_Buff_Type;
//******************************************************************************
//*-------------- 函数声名 -----------------------------------------------------
//******************************************************************************
#define SensorCount2_TX_DMAAddrSet(x) (DMA1_Stream7->M0AR = x) //设置流量计发送缓存地址
#define SensorCount2_TX_DMALenSet(x) (DMA1_Stream7->NDTR = x) //设置流量计DMA发送长度
#define SensorCount2_TX_DMAStart() DMA_Cmd(DMA1_Stream7,ENABLE) //开启流量计DMA发送
#define SensorCount2_TX_DMAStop() DMA_Cmd(DMA1_Stream7,DISABLE) //关闭流量计DMA发送
#define SensorCount2_RX_DMAAddrSet(x) (DMA1_Stream0->M0AR = x) //设置流量计接收缓存地址
#define SensorCount2_RX_DMALenSet(x) (DMA1_Stream0->NDTR = x) //设置流量计DMA接收
#define SensorCount2_RX_DMAStart() DMA_Cmd(DMA1_Stream0,ENABLE) //开启流量计DMA接收
#define SensorCount2_RX_DMAStop() DMA_Cmd(DMA1_Stream0,DISABLE) //关闭流量计DMA接收
#define Sensor2_RS485_TxEN GPIO_ResetBits(GPIOD,GPIO_Pin_3);
#define Sensor2_RS485_RxEN GPIO_SetBits(GPIOD,GPIO_Pin_3);
#define Even 0
#define None 1
extern void SensorCount2_DMATX_IRQHandler(void);
extern void SensorCount2_DMARX_IRQHandler(void);
extern u16 CRC_Check(u8 *puchMsg, u16 usDataLen) ;
extern u16 BigToLittle( u16 BigData);
extern void SensorCount_Init(void);
extern void SensorCount_USART_Configuration(u32 Baud,u8 Check);
extern u8 Sensor_Ask_Data(u8 ID);
extern void Sensor_Tast(void);
#endif //#ifndef
File diff suppressed because it is too large Load Diff
+56
View File
@@ -0,0 +1,56 @@
#ifndef __Surface_H__
#define __Surface_H__
typedef enum
{
Surface_FirmwareUpdate,
Surface_OfflineRecordUpload,
Surface_Wait ,
Surface_PrintInfo ,
Surface_QueryMenu ,
Surface_Q_NetworkInfo ,
Surface_Q_MDPortInfo,
Surface_Q_LORARSSI,
Surface_Q_VeresionCheck,
Surface_Q_Test_Info,
Surface_SetMenu,
Surface_S_MDConnectSet,
Surface_S_LORASlaveSet,
Surface_S_PortLogOutput,
Surface_S_ConnectMode,
Surface_S_NetworkSet,
Surface_S_DataInit,
Surface_ItemEnd ,
}SurfaceMenuItem;
typedef enum
{
Q_NetworkInfo ,
Q_MDPortInfo ,
Q_LORARSSI ,
Q_VeresionCheck,
Q_Test_Info,
Q_ItemEnd ,
}QueryMenuItem;
typedef enum
{
S_MDConnectSet ,
S_LORASlaveSet ,
S_PortLogOutput ,
S_ConnectMode ,
S_NetworkSet ,
S_DataInit ,
S_ItemEnd
}SetMenuItem;
void Surface_Init(void);
void SurfaceTast(void);
//------------------------------------------------------------------------------
#endif
BIN
View File
Binary file not shown.
+259
View File
@@ -0,0 +1,259 @@
/*C*****************************************************************************
* NAME: DOBCNT1010.c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
* 双枪计数器应用程序
*******************************************************************************/
#include "config.h"
volatile TXHData_type TXHData;//定义指针数据
const u8 BoxVersion[11]="TXH_V1.4.7";
cup_t STM32CPU;
void TXH_Init(void)
{
u8 i= 0;
Pluse_InPut_Init();
Timer_Init();
FM_Init();
TXHData.ROM_UpData.ROM_UpData_State.Flag.Update_Flag = 0;
TXHData.ROM_UpData.ROM_UpData_State.Flag.DisableUpdate = 0;
TXHData.ROM_UpData.ROM_UpData_State.Flag.RightRun_Flag = 3;
FMItemWrite(CF_ROM_UpData,0);
//GPSConnect_Init();
AT45DB_Init();
DS1307_Init();
Log_Init();
OLED_Init();
Surface_Init();
FindSysconfigFile();
MD_Connect_Init();
Multiplex_Port_Init();
POS_Connect_Init();
Pluse_Putout_Init();
TXHData.ROM_UpData.ROM_UpData_State.Flag.Update_Flag = 0;
TXHData.ROM_UpData.ROM_UpData_State.Flag.DisableUpdate = 0;
TXHData.ROM_UpData.ROM_UpData_State.Flag.RightRun_Flag = 3;
//TXHData.ROM_UpData.FrameTop = 0;
FMItemWrite(CF_ROM_UpData,0);
TXHData.OfflineAuthorizeNumberMax = 10000;//允许离线授权次数
TXHData.OfflineAuthorize = 1;//允许离线授权
// TXHData.PREXDATA_WaitUpNummber = 0;
// TXHData.CTIME.Year = 0x22;//年
// TXHData.CTIME.Month = 0x01;//月
// TXHData.CTIME.Day = 0x11;//日
// //TXHData.CTIME.Week = 0x02;//周
// TXHData.CTIME.Hour = 0x14;//时
// TXHData.CTIME.Min = 0x20;//分
// TXHData.CTIME.Sec = 0x00;//秒
// DS1307_Write();
//PCBEncryption();
PCBEncryption_Check();
}
void TXH_Task(void)
{
u8 Port = 0,DeviceNumber = 0;
//GPSConnectTast();
if(TXHData.CTIMEReadTimer.Flag == 1)
{
TXHData.CTIMEReadTimer.Flag = 0;
DS1307_Read();
if(TXHData.SurfaceNow <= Surface_Wait)
TXHData.DisplayOn = 1;
}
if(TXHData.ErrState.Flag.e_errPCBCheck == 0)//PCB验证通过
{
for(Port = 0;Port < TXHData.MD_Port_Num_Top;Port ++)
{
if(TXHData.MDRestartTimer[Port].Flag == 1)
{
TXHData.MDRestartTimer[Port].Flag = 0;
}
if(TXHData.MDRestartTimer[Port].ON_OFF == 0)
{
if(TXHData.MBCountTimer[Port].Flag == 1 && TXHData.MD_Port_Data[Port].PortData.POSType)
{
TXHData.MBCountTimer[Port].Flag = 0;
{
switch(TXHData.MD_Port_Data[Port].PortData.POSType)
{
case PosBlueSky:
case PosHongYang:
case PosYGao:
case PosLY:
case PosJP:
case PosYWY:
case PosRFID:
case PosPrice1_4:
case PosPLC:
{
if(TXHData.MD_Port_Info[Port].LoopGunNextFlag == 1 || (TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].pGunNow].Handshake == 0x0))
{
TXHData.MD_Port_Info[Port].pGunNow ++;
if(TXHData.MD_Port_Info[Port].pGunReturn)
{
TXHData.MD_Port_Info[Port].pGunNow = TXHData.MD_Port_Info[Port].pGunReturn;
TXHData.MD_Port_Info[Port].pGunReturn = 0;
}
if(TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].pGunNow].Handshake != TXHData.MD_Port_Info[Port].Handshake_Top)
{
TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].pGunNow].Handshake = 0x0;
}
}
if(TXHData.MD_Port_Info[Port].pGunNow >= TXHData.MD_Port_Data[Port].PortData.DeviceNumber)
TXHData.MD_Port_Info[Port].pGunNow = 0;
MD_ConnectTXTask(Port,TXHData.MD_Port_Info[Port].pGunNow,TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].pGunNow].MB_CMD_Next);
}
break;
case PosDart:
{
if(TXHData.MD_Port_Info[Port].LoopGunNextFlag == 1 || (TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake == 0x0))
{
TXHData.MD_Port_Info[Port].PumpNow ++;
if(TXHData.MD_Port_Info[Port].pGunReturn)
{
TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].pGunReturn;
TXHData.MD_Port_Info[Port].pGunReturn = 0;
}
if(TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake != TXHData.MD_Port_Info[Port].Handshake_Top)
{
TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake = 0x0;
}
}
if(TXHData.MD_Port_Info[Port].PumpNow >= TXHData.MD_Port_Info[Port].FatherDeviceTop)
TXHData.MD_Port_Info[Port].PumpNow = 0;
if(TXHData.MD_Port_Info[Port].pGunCapture)
{
TXHData.MD_Port_Info[Port].pGunReturn = TXHData.MD_Port_Info[Port].PumpNow;
TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].pGunCapture - 1;
TXHData.MD_Port_Info[Port].pGunCapture = 0;
}
MD_ConnectTXTask(Port,TXHData.MD_Port_Info[Port].PumpNow,TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].MB_CMD_Next);
}
break;
case PosSSLan:
{
if(TXHData.MD_Port_Info[Port].LoopGunNextFlag == 1 || (TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].Handshake == 0x0))
{
TXHData.MD_Port_Info[Port].PumpNow ++;
if(TXHData.MD_Port_Info[Port].pGunReturn)
{
TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].pGunReturn;
TXHData.MD_Port_Info[Port].pGunReturn = 0;
}
if(TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].Handshake != TXHData.MD_Port_Info[Port].Handshake_Top)
{
TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].Handshake = 0x0;
}
}
if(TXHData.MD_Port_Info[Port].PumpNow >= TXHData.MD_Port_Info[Port].FatherDeviceTop)
TXHData.MD_Port_Info[Port].PumpNow = 0;
if(TXHData.MD_Port_Info[Port].pGunCapture)
{
TXHData.MD_Port_Info[Port].pGunReturn = TXHData.MD_Port_Info[Port].PumpNow;
TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].pGunCapture - 1;
TXHData.MD_Port_Info[Port].pGunCapture = 0;
}
MD_ConnectTXTask(Port,TXHData.MD_Port_Info[Port].PumpNow,TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].MB_CMD_Next);
}
break;
case PosBlueSkyPlus:
{
if(TXHData.MD_Port_Info[Port].LoopGunNextFlag == 1 || (TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake == 0x0))
{
TXHData.MD_Port_Info[Port].PumpNow ++;
if(TXHData.MD_Port_Info[Port].pGunReturn)
{
TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].pGunReturn;
TXHData.MD_Port_Info[Port].pGunReturn = 0;
}
if(TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake != TXHData.MD_Port_Info[Port].Handshake_Top)
{
TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].PumpNow].Handshake = 0x0;
}
}
if(TXHData.MD_Port_Info[Port].PumpNow >= TXHData.MD_Port_Info[Port].FatherDeviceTop)
TXHData.MD_Port_Info[Port].PumpNow = 0;
// if(TXHData.MD_Port_Info[Port].pGunCapture)
// {
// TXHData.MD_Port_Info[Port].pGunReturn = TXHData.MD_Port_Info[Port].PumpNow;
// TXHData.MD_Port_Info[Port].PumpNow = TXHData.MD_Port_Info[Port].GunInfo[TXHData.MD_Port_Info[Port].pGunCapture].FatherNum;
// TXHData.MD_Port_Info[Port].pGunCapture = 0;
// }
MD_ConnectTXTask(Port,TXHData.MD_Port_Info[Port].PumpNow,TXHData.MD_Port_Info[Port].FatherDevice[TXHData.MD_Port_Info[Port].PumpNow].MB_CMD_Next);
}
break;
}
}
}
}
}
if(TXHData.MD_MultiplexTimer.Flag == 1 && TXHData.MD_Multiplex_Port_Data.PortData[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].POSType)
{
TXHData.MD_MultiplexTimer.Flag = 0;
if(TXHData.MD_Multiplex_Port_Info.DevicerTypeNow < TXHData.MD_Multiplex_Port_Data.DeviceNumber - 1)
TXHData.MD_Multiplex_Port_Info.DevicerTypeNow ++;
else
TXHData.MD_Multiplex_Port_Info.DevicerTypeNow = 0;
if(TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].Flag)
{
TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].Flag = 0;
switch(TXHData.MD_Multiplex_Port_Data.PortData[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].POSType)
{
case Multiplex_Print:
{
TXHData.MD_MultiplexTimer.TimerCountMax =(115200/TXHData.MD_Multiplex_Port_Data.PortData[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow].BaudRate) * 66;//根据不同波特率计算等待时间
}
break;
case Multiplex_YWY:
{
TXHData.MD_MultiplexTimer.TimerCountMax = 1000;
}
break;
case Multiplex_Price:
{
TXHData.MD_MultiplexTimer.TimerCountMax = 100;
}
break;
case Multiplex_GPS:
{
TXHData.MD_MultiplexTimer.TimerCountMax = 1000;
}
break;
}
Multiplex_PortTXTask(TXHData.MD_Multiplex_Port_Info.DevicerTypeNow,TXHData.MD_Multiplex_Port_Info.MB_CMD_Next[TXHData.MD_Multiplex_Port_Info.DevicerTypeNow]);
}
}
}
if(TXHData.POS_Info.ConnectType == POS_Connect_Typ_Station)
{
if(TXHData.POS_RS232Timer.Flag == 1)
{
TXHData.POS_RS232Timer.Flag = 0;
POS_ConnectTXTask(TXHData.POS_Info.ConnectType,TXHData.POS_Info.Link_Flag,TXHData.POS_Info.POS_CMD_Next);
}
}
else if(TXHData.HeartbeatTimer.Flag == 1)
{
TXHData.HeartbeatTimer.Flag = 0;
POS_ConnectTXTask(TXHData.POS_Info.ConnectType,TXHData.POS_Info.Link_Flag,TXHData.POS_Info.POS_CMD_Next);
}
if(TXHData.PowerDown.State == 0)//断电就不处理数据了,防止在断电期间操作存储数据
{
MD_ConnectRXTask();
Multiplex_PortRXTask();
if(TXHData.POS_Info.POS_ConnectRXTask_Flag)
{
TXHData.POS_Info.POS_ConnectRXTask_Flag = 0;
POS_ConnectRXTask();
}
}
SurfaceTast();
}
+729
View File
@@ -0,0 +1,729 @@
#ifndef __TXH_H__
#define __TXH_H__
#define QUEUE_SIZE 10
typedef struct spu_info
{
union
{
u8 byte[12];
u32 id[3];
}v;
}cup_t;
typedef union
{
u16 State;
struct
{
u8 e_errFlashParameter : 1; //FLASH断线
u8 e_errFramParameter : 1; //铁电参数错误
u8 e_errPCBCheck : 1; //电路板验证
u8 e_errMessageEnd : 1;
}Flag;
}ErrState_TypeDef;
__packed typedef struct
{
u8 Sec;
u8 Min;
u8 Hour;
u8 Day;
u8 Month;
u8 Year;
}CTIME_type;
typedef enum
{
Message_Priority_1 = 1,
Message_Priority_2,
Message_Priority_3 ,
}Message_PriorityItem;
typedef struct Message {
u8 Priority; // 消息优先级,1-3之间的整数
u8 Content; // 消息内容
}Message_Type;
typedef struct MessageQueue {
u8 Front; // 队头指针
u8 Rear; // 队尾指针
Message_Type Messages[QUEUE_SIZE]; // 消息队列数组
}MessageQueue_Type;
__packed typedef union
{
u8 Buff[16];
__packed struct
{
float OH;
float OV;
float WH;
float TH;
}Data;
}TankData_Type;
__packed typedef union
{
u8 State;
__packed struct
{
u8 TankLeaked : 1;
u8 GasLeakage : 1;
u8 THOutOfLimits : 1;
u8 TLOutOfLimits : 1;
u8 PHHOutOfLimits : 1;
u8 PLLOutOfLimits : 1;
u8 Electrostatic : 1;
u8 beiyong : 1;
}Flag;
}TankState_Type;
__packed typedef struct
{
u32 OilCNT ; //实时油量
u32 MoneyCNT ; //实时金额
}FData_Type;//8byte
__packed typedef struct
{
u64 TotalLit; //油量总累
u64 TotalMoney; //金额总累
}CTOTAL_Type;//16byte
__packed typedef struct
{
u8 GunNumber; //枪号
FData_Type FData; //加油数据
u32 Price; //单价
CTOTAL_Type CTOTAL; //累计
CTIME_type RTIME; //完成时间
u32 OrderNumber; //订单号,离线授权的话为0
u8 CardNum[6]; //卡号 6BYTE BCD
u8 Standby[51]; //预留
}PREXDATA_Type;//
typedef struct
{
u8 PrintBuff[20][32];
}PrintInfo_Type;
typedef union
{
u8 State;
struct
{
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 TitleFlag : 1; //受控标志1受控0自控
u8 : 1; //
u8 StartFlag : 1; //开机标志1开机0停机
u8 Pause : 1; //暂停
u8 GunUp : 1; //提枪
}Flag;
}fuelState_TypeDef;
typedef union
{
u8 Buff[10];
__packed struct
{
float Longitude; //经度
u8 LongitudeType; //经度类型
float Latitude ; //纬度
u8 LatitudeType ; //纬度类型
}GPS;
}GPS_Type;
typedef enum
{
Display_664,
Display_886,
}Display_Typ;
typedef enum
{
YWY_Bluesky,
YWY_Probe_KY,
YWY_Pressure,
}YWY_Typ;
typedef enum
{
Preset_Sale,
Preset_Volume,
}Preset_Typ;
typedef enum
{
POS_Connect_Typ_Station,
POS_Connect_Typ_Cloud,
POS_Connect_Typ_Cloud_Tast,
//POS_Connect_Typ_WifiStation,
POS_Connect_Typ_End,
}POS_Connect_Typ;
typedef enum
{
POS_Net_Typ_4G_GM5,
POS_Net_Typ_4G_L510,
POS_Net_Typ_WiFi,
POS_Net_Typ_WAN,
POS_Net_Typ_End,
}POS_Net_Typ;
typedef enum
{
PosNormal,
PosBlueSky,
PosLY,
PosJP,
PosDart,
PosYWY,
PosRFID,
PosYGao,
PosHongYang,
PosSSLan,
PosBlueSkyPlus,
PosPLC,
PosPrice1_4,
PosLanFeng,
}PosItem;
typedef enum
{
At45DB041,
At45DB321,
At45DB641,
}At45DBTypeItem;
typedef union
{
u8 State;
struct
{
u8 State : 2;
u8 PresetType : 2; //
u8 PresetMode : 1; //
u8 UpdateRecords: 1; //有信息标志1
u8 Unit : 1; //
u8 GunUp : 1; //提枪标志1提枪0挂枪
}Flag;
}YGGunState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 GunNum : 3;//抢号
u8 State : 1; //状态0挂枪1提枪
u8 Null : 4; //
}Flag;
}DartGunState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 : 1;
u8 ErroFlag : 1; //有错误标志
u8 : 1; //1有未上传记录0没有
u8 TitleFlag : 1; //受控标志1受控0自控
u8 BatteryFlag : 1; //电池电量标志1有电0没电
u8 StartFlag : 1; //开机标志1开机0停机
u8 EventFlag : 1; //有事件标志
u8 GunUp : 1; //提枪标志1提枪0挂枪
}Flag;
}LTGunState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 PriceChange : 1; //单价变更
u8 ShiftChange : 1; //班累变更
u8 TotalChange : 1; //总累变更
u8 StartFlag : 1; //加油中
u8 TitleFlag : 1; //受控状态
u8 GunUp : 1; //提枪状态
u8 : 1;
u8 : 1; //
}Flag;
}HYState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 GunUp : 1; //提枪状态
u8 : 1; //
u8 : 1;
u8 : 1; //
}Flag;
}HYSelfTestState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 GunUP_Flag : 1; //提枪状态
u8 Start_Flag : 1; //启动状态
u8 UpdateDisplay : 1; //需更新数据
u8 UpdateRecords : 1; //需入库 //慎重,非油机设备不要用这个标志
u8 : 1; //
u8 AuthorizeState: 1; //授权状态
u8 LockState : 1; //枪锁定状态
u8 Online : 1; //在线
}Flag;
}GunState_TypeDef;
typedef struct
{
u8 VersionFindFlag;
u8 Version[10];
}GunVersion_Type;
typedef union
{
u8 State;
struct
{
u8 Update_Flag : 1; //升级标志
u8 RightRun_Flag : 2; //待运行标志
u8 BaudRateSync_Flag : 1; //波特率同步标志
u8 HaveBackups : 1; //有备份过
u8 : 1; //
u8 : 1; //
u8 DisableUpdate : 1; //不允许更新
}Flag;
}ROM_UpData_State_Type;
typedef struct
{
u8 Number;//关联设备的设备号
u8 Port;//端口
u8 location;//内存位置
}AssociatedDevices_Type;
typedef struct
{
u8 Handshake; //握手步骤进度
u8 DartSeq; //dart协议通讯序号
u8 LYGunNeedCMD; //下下个需要的命令
u8 LYGunState; //龙野协议枪状态
u8 LYHandshakeCRC; //龙野握手校验
u8 MB_CMD_Next; //下个命令
u8 MB_CMD_Next_End;//指令不自动转换,主要是在停止生成记录和启动的过程。用在改单价之火读取单价和单独预置指令
u8 PresteType; //
u32 PresetValue; //
timer_TypeDef LTDelayTimer; //蓝天协议下加油结束等待生成总累
GunState_TypeDef fuelState_B; //上次枪状态
u8 SlaveNeedReply; //回复wifi从机的状态,转接中心过来的枪状态的回复信息给从机
FData_Type FData; //实时数据
CTOTAL_Type CTOTAL; //累计
u32 Price; //单价
u8 PriceStete; //单价0=不生效;1=一次性生效;2=永久生效
u32 PulseCoefficient;//脉冲当量
u16 ValveValue; //提前关阀量
u16 MinDisplay; //最小显示值
u8 RSSI; //LORA信号强度
u8 Call; //请求授权
u8 WaitPREXDATA_flag;//等待记录形成,完成之前不能再次启动,防止形成记录之前再次授权
u8 CardNumber[10];
u8 RFIDUserName[15];
u8 CardPSWD[3];
u8 CarLicensePlate[15];
u32 Mileage;
u8 BalanceDecimal;
u8 Balance[5];
u8 RFIDState;
AssociatedDevices_Type AssociatedDevices;//没有对应RFID为0(关联设备信息)
GunVersion_Type GunVersion;
u16 FrameNow;
ROM_UpData_State_Type ROM_UpData_State;
u8 FatherNum;//父设备号
u8 SonNum;//子设备在父设备中的位置
u8 ParameterNumber;
YGGunState_TypeDef YGGunState; //龙野协议枪状态
}GunInfo_Type;
typedef struct
{
ROM_UpData_State_Type ROM_UpData_State;
u16 FrameTop;
}ROM_UpData_Type;
typedef enum
{
Control_POSAuto,
Control_POSManual,
Control_BoxAuto,
Control_NoGun,
}GunControlState_Item;
typedef enum
{
NowAuthorizeType_Online,
NowAuthorizeType_Offline_NoCard,
NowAuthorizeType_Offline_Card,
}NowAuthorizeType_Type;
typedef struct
{
u8 GunNummber;
u8 GunAddr;
GunState_TypeDef GunState;
u32 OrderNumber;
u8 RFIDBinding;//绑定的RFID编号
ROM_UpData_State_Type ROM_UpData_State;
u8 GunControlState;//授权模式
u8 NowAuthorizeType;//当前加油的授权方式0;在线;1离线非卡;2离线白名单
u8 Standby[3];
}GunData_Type;
typedef enum
{
MD_RS485,
MD_LORA,
}MDConnectType;
typedef union
{
u8 State;
struct
{
u8 OilCNT : 2;
u8 MoneyCNT : 2;
u8 Price : 2;
}Dec;
}GunDec_TypeDef;
typedef struct
{
u8 Number;
u8 Type[7];
}PaymentType_Type;
typedef struct
{
u32 BaudRate;
u8 StopBits;
u8 Parity_Even;
u8 POSType; //协议类型
u8 DeviceNumber; //设备数量
u32 MBCountTime; //轮询时间ms
u8 Device_Type; //设备类型
u8 MDConnectType;//连接形式 485/LORA
u8 ROM_UpData_Version[10];
ROM_UpData_Type ROM_UpData;
GunDec_TypeDef GunDec;
PaymentType_Type PaymentType;
u8 Standby[10];
}PortData_Type;
typedef struct
{
PortData_Type PortData;
GunData_Type GunData[16];
}MD_Port_Data_Type;
typedef struct
{
u8 SonNumber;//子设备数量
u8 Address;//统一指令
u8 SonStart;//第一个子设备的内存位置
u8 SonNow;//当前要操作的枪
u8 Handshake;//握手序号
u8 MB_CMD_Next;
u8 MB_CMD_Need; //下下个需要的命令
u8 Handshake_Top;//握手序号最大值
u8 Password_Lever;
u32 Password;
u8 LockType;
u8 LockTime[3];//年月日
u16 lockNummber;
u8 LockValue[6];
GunVersion_Type Version;
u16 FrameNow;
u8 Mac[12];
timer_TypeDef LTDelayTimer; //蓝天协议下加油结束等待生成总累,其他协议也可以用来判断是否行程记录的时间
}FatherDevice_Type;
typedef struct
{
GunState_TypeDef State;
u8 SingleOrDouble;//单双面0单1双
u8 PriceNumber;//面板数量
u8 Length;//单价长度2-6
u8 Brightness;//亮度0-8
u32 Price[12];//
u8 Decimal[12];//小数位
}PriceTagData_Type;
typedef struct
{
u8 pGunReturn;//插队之后返回
u8 pGunCapture;//插队的枪号
u8 pGunNow;//当前发送枪号
u8 PumpNow;//当前发送泵号
u8 LoopGunNextFlag;//允许继续发送下一枪
u8 Handshake_Top;//握手序号最大值
u8 FatherDeviceTop;//几个泵
FatherDevice_Type FatherDevice[16];//每个泵的信息
GunInfo_Type GunInfo[16];
PriceTagData_Type PriceTagData;
}MD_Port_Info_Type;
typedef struct
{
u8 DeviceNumber;
PortData_Type PortData[5];
GunState_TypeDef State[5];
u8 Standby[20];
}MD_Multiplex_Port_Data_Type;
typedef struct
{
u8 DevicerReturn;//插队之后返回
u8 DevicerCapture;//插队的枪号
u8 DevicerTypeNow;//当前发送的设备类型
u8 PrintPlaceNumber;//当前打印位置
u8 PrintType;//当前打印类型
u8 LoopDevicerNextFlag;//允许继续发送下一枪
u8 Handshake[5];//握手序号最大值
u8 MB_CMD_Next[5];
u8 Handshake_Top[5];//握手序号最大值
timer_TypeDef MultiplexDevicerTimer[5];
u8 MBCountCutNum[5];
GunState_TypeDef State[5];
PriceTagData_Type PriceTagData;
}MD_Multiplex_Port_Info_Type;
typedef struct
{
char CMD_SOCKA[50];
char IMEI[20];
char APN[40];
char WiFIName[40];
char WiFIPassWord[20];
}WirelessData_Type;
typedef struct
{
WirelessData_Type WirelessData;
union
{
u16 State;
struct
{
u8 ConnectMode : 4;
u8 NetworkSet : 4;//如果是wifi从机模式,参数当WiFiHostSet用
}Flag;
}POSConnectTyye;
u8 Address;//从机自身的地址,目的是分时发送数据
u8 WhiteListVersion;
u8 Standby[19];
}POSData_Type;
typedef struct
{
u8 Link_Flag;
u8 ConnectType;
u8 NetType;
u8 POS_ConnectRXTask_Flag;
u8 POS_CMD_Next;
u8 WiFiSetState;
u8 WiFiRSSI;
u8 WiFiChannel;
u8 AskCongfig_Num;//上电申请配置下发,1-2端口
u8 HostHandshake;
u8 IP[50];
}POS_Info_Type;
typedef union
{
u16 State;
struct
{
u8 POSNetSetErrNummber : 3; //网络模块配置失败次数
u8 POSNetCMDNext : 4; //指令模式下待发送指令
u8 WorkMode : 1; //工作模式Bit6 0:指令 1:透传
}Flag;
}POSNetSetState_TypeDef;
typedef union
{
u16 State;
struct
{
u8 ConnectSetErrNummber : 3; //网络模块配置失败次数
u8 SetModeCMDNext : 4; //指令模式下待发送指令
u8 WorkMode : 1; //工作模式Bit6 0:指令 1:透传
}Flag;
}MDConnectState_TypeDef;
typedef union
{
u8 State;
struct
{
u8 APN : 1; //配置文件包含APN
}Flag;
}Sysconfig_Flag_TypeDef;
typedef struct
{
u16 WhiteListTop;
u8 CardNum[200][6];
}WhiteList_Type;
typedef struct
{
u32 PREXDATA_NowWaitUpNummber;//这次上传时记录数量备份
u16 PREXDATA_NowFrame; //这次上传的帧
u8 PREXDATA_NowFrameLen;//这次上传的帧包含的条数
}PREXDATA_Upload_Type;
typedef union
{
u8 State;
struct
{
u8 Power10V : 1;
u8 Power7V : 1;
}Flag;
}PowerDown_TypeDef;
typedef union
{
u8 State;
struct
{
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 : 1; //
u8 Online : 1; //在线
}Flag;
}CNGPLCState_TypeDef;
typedef union
{
u8 Buff[80]; //ModBus寄存器组
__packed struct
{
float PistonAValue;//A活塞当前值`
float PistonBValue;//B活塞当前值
float IntakePressure; //进气压力
float LowPressure; //低压压力
float InstrumentAirPressure;//仪表风压力
float MediumPressure; //中压压力
float GasConcentration1;//橇内燃气浓度1
float HydraulicOilTemperature;//液压油温
float HighPressure; //高压压力
float ProtectPressure; //保护压力
float WaterTemperature; //水流温度
float GasConcentration2; //燃气浓度2
float GasConcentration3; //燃气浓度3
u16 MW28Alarm; //MW28报警
u16 MB5Alarm; //MB5报警
u16 MB10Alarm; //MB10报警
}REG;
}CNGPLCData_Type;
typedef struct
{
u16 Encryption[4];
ErrState_TypeDef ErrState;
u8 BoardType;//靠按键状态识别是不是新版本的主板
u8 HardwareVersion;//硬件版本 ////24-31是大板,32-38是小板,小板没有第五端口
u8 WiFiSlaveMode;
Sysconfig_Flag_TypeDef Sysconfig_Flag;
PowerDown_TypeDef PowerDown;
u8 SystemErr;
u16 POS2MD_Buff_Len;
u8 USART6_Drive;
u8 SurfaceNow;
u8 SurfaceNowLine;
u8 SurfaceNowItem;
u8 SurfaceSelected_Flag;
u8 DisplayOn;
u8 KeyNum;
timer_TypeDef KeyFindTimer;
u8 POS_MonitorModel;//监控模式
u8 OfflineAuthorize;
u16 OfflineAuthorizeNumberMax;
PREXDATA_Type PREXDATA[5];
u32 PREXDATA_WaitUpNummber;//待上传数量
PREXDATA_Upload_Type PREXDATA_Upload;
u32 PREXDATA_TTC;
PREXDATA_Type PrintLastRecord[64];//越南打印每把枪最后一笔数据
PREXDATA_Type PrintRecord;//历史记录打印,后台下发数据
PrintInfo_Type PrintInfo;
ROM_UpData_Type ROM_UpData;
u8 ROM_UpData_ProgressBar;
u8 ROM_UpData_Port;
LTGunState_TypeDef LTGunState; //蓝天协议枪状态
//YGGunState_TypeDef YGGunState; //龙野协议枪状态
DartGunState_TypeDef DartGunState;//Dart协议枪状态
HYState_TypeDef HYState; //弘扬协议状态
HYSelfTestState_TypeDef HYSelfTestState;//弘扬协议状态
u8 FRam_Flag;
u8 ATDB45_Flag;
u8 ATDB45Type;
u8 Frame[513];
u8 UDisk_Flag;
CTIME_type CTIME;
CTIME_type PosCTIME;
u32 RNGData;
float Apacity[100];
u8 TankNumTop;
TankState_Type TankState[5][12];
TankData_Type TankData[5][12];
CNGPLCData_Type CNGPLCData;
CNGPLCState_TypeDef CNGPLCState;
WhiteList_Type WhiteList;//白名单列表
//MessageQueue_Type POS_TX_MessageQueue;
u8 POS_TX_CMDNow;
u8 PCCountMail_Flag;
u16 PCMail_RX_Len;
u8 PosYWY_Pressure_Nummber;
timer_TypeDef CTIMEReadTimer;
timer_TypeDef HeartbeatTimer;
timer_TypeDef POS_RS232Timer;
timer_TypeDef ReSendDataTimer;
//PCCount_RX_Buff_TypeDef PCCountMail;
u8 ConnectType;
timer_TypeDef DelayDetectionTimer; //网络延迟检测定时器
u32 DelayDetection;//网络延迟数据,0表示收不到信息
timer_TypeDef POSCutTimer;
timer_TypeDef MDRestartTimer[4]; //
u8 POSLOCK_Impower;
POSNetSetState_TypeDef POSNetSetState;
u8 ICCID[21];
POSData_Type POSData;
POS_Info_Type POS_Info;
timer_TypeDef GPSDataTimer;
GPS_Type GPSData;
u8 Timer_Num_Top;
volatile timer_TypeDef *Timer_Buff[200];
timer_TypeDef AnalogTimer;
MDConnectState_TypeDef MDConnectState[5];
u8 MD_Port_Num_Top;
u8 MD_Gun_Num_Top;
timer_TypeDef MBCountRXIDLETimer[4];
timer_TypeDef MBCountTimer[4];
u8 MBCountCutNum[4][16]; //断线定时器
MD_Multiplex_Port_Data_Type MD_Multiplex_Port_Data;//端口5,多路复用口
MD_Multiplex_Port_Info_Type MD_Multiplex_Port_Info;
timer_TypeDef MD_MultiplexRXIDLETimer;
timer_TypeDef MD_MultiplexTimer;
u16 MD_Multiplex_Rec_Nummber;
u16 MD_Multiplex_Rec_NummberB;//临时判断接受长度
MD_Port_Data_Type MD_Port_Data[4];
MD_Port_Info_Type MD_Port_Info[4];
u16 MD_Rec_Nummber[4];
u16 MD_Rec_NummberB[4];//临时判断接受长度
timer_TypeDef MD_FramContinuityTimer[4];
timer_TypeDef POSReLinkTimer;
timer_TypeDef MD_LORA_SlaveTimer;
u8 MD_LORA_Slave_Flag;
u8 MD_LORA_Set_Flag;
}TXHData_type;
//******************************************************************************
extern volatile TXHData_type TXHData;//定义指针数据
extern const u8 BoxVersion[11];
extern cup_t STM32CPU;
void TXH_Init(void);
void TXH_Task(void);
//------------------------------------------------------------------------------
#endif
+154
View File
@@ -0,0 +1,154 @@
/*C*****************************************************************************
* NAME: time_count.c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
#include "config.h" //全局声明
void delay(unsigned int Counter)
{
unsigned int i;
for (; Counter != 0; Counter--)
{
i = 55; // 经示波器测试,精度1%
while (i--)
;
}
}
/*_____ M A C R O S __________________________________________________________*/
/****************************************************
函数名:TimerTask
功能 :定时器初始化(主定时器,timer2)1ms
参数 :无
返回值:无
****************************************************/
void Timer_Init(void)
{
u8 i = 0, j = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开TIM2时钟
/*TIM2*/
TIM_TimeBaseStructure.TIM_Prescaler = 168 - 1; // 分频系数1000k
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 计数上限 10ms 100hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟选裕:系统时钟
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // TIM2时基初始化
/***********************/
TXHData.Timer_Num_Top = 0; // 初始化定时器数目
/***************初始化定时器组*******************/
for (i = 0; i < 4; i++)
{
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MDRestartTimer[i];
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MBCountTimer[i];
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MBCountRXIDLETimer[i];
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_FramContinuityTimer[i];
TXHData.Timer_Num_Top++;
for (j = 0; j < 16; j++)
{
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Port_Info[i].GunInfo[j].LTDelayTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Port_Info[i].FatherDevice[j].LTDelayTimer;
TXHData.Timer_Num_Top++;
}
}
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POSCutTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.HeartbeatTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POS_RS232Timer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.ReSendDataTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.GPSDataTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.AnalogTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.CTIMEReadTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_LORA_SlaveTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.KeyFindTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POSReLinkTimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_MultiplexRXIDLETimer;
TXHData.Timer_Num_Top++;
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_MultiplexTimer;
TXHData.Timer_Num_Top++;
for (i = 0; i < 5; i++)
{
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i];
TXHData.Timer_Num_Top++;
}
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.DelayDetectionTimer;
TXHData.Timer_Num_Top++;
TIM_Cmd(TIM2, ENABLE); // 打开TIM2
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //
Timer_NVIC_Configuration();
}
/****************************************************
函数名:Timer_NVIC_Configuration
功能 :定时器中断配置timer2
参数 :无
返回值:无
****************************************************/
void Timer_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; // 定义中断配置结构体
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/****************************************************
函数名:SYSTimer_IRQHandler
功能 :系统定时器中断(主定时器,timer2)10ms
参数 :无
返回值:无
****************************************************/
void SYSTimer_IRQHandler(void)
{
u8 pTimer = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
for (pTimer = 0; pTimer < TXHData.Timer_Num_Top; pTimer++) // 轮训定时器队列
{
if (TXHData.Timer_Buff[pTimer]->Init == 1) // 定时器初始化标志
{
TXHData.Timer_Buff[pTimer]->Init = 0;
TXHData.Timer_Buff[pTimer]->ON_OFF = 0;
TXHData.Timer_Buff[pTimer]->Flag = 0;
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
}
else if (TXHData.Timer_Buff[pTimer]->ON_OFF == 1 && TXHData.Timer_Buff[pTimer]->Flag == 0) // 定时器开启状态,未到时
{
TXHData.Timer_Buff[pTimer]->TimerCount += 1; // 如果定时器开启,计数值累加
if (TXHData.Timer_Buff[pTimer]->TimerCount >= TXHData.Timer_Buff[pTimer]->TimerCountMax) // 判断定时器是否到时
{
TXHData.Timer_Buff[pTimer]->Flag = 1; // 置位定时器到时标志
if (TXHData.Timer_Buff[pTimer]->Cycle == 1) // 定时器循环,清除定时器计数值
{
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
}
else // 到时不循环,初始化定时器
{
TXHData.Timer_Buff[pTimer]->ON_OFF = 0;
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
TXHData.Timer_Buff[pTimer]->Cycle = 0;
}
}
}
}
}
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
}
+34
View File
@@ -0,0 +1,34 @@
#ifndef __TIME_COUNT_H_
#define __TIME_COUNT_H_
/*H******************************************************************************
* NAME: time_count.h
*********************************************************************************/
//------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//------------------------------------------------------------------------------
typedef struct ///定时器结构体
{
u8 Init;
u8 ON_OFF; //到时标志
u8 Flag; //到时标志
u8 Cycle; //循环标志
u32 TimerCount; //计数值
u32 TimerCountMax; //计数值
}timer_TypeDef;
//变量声明
//******************************************************************************
//函数声明
extern void Timer_Init(void);
void Timer_NVIC_Configuration(void);
extern void SYSTimer_IRQHandler(void);
void delay(unsigned int Counter);
#endif
+47
View File
@@ -0,0 +1,47 @@
#ifndef __config_H
#define __config_H
/**********************************************************************************************************
应用程序配置
Application Program Configurations
***********************************************************************************************************/
//#define EXHIBIT ///展览定义此行
/*********************************************************************************************************
 引用系统头文件
*********************************************************************************************************/
//#include <absacc.h>
#include "stm32f4xx_conf.h" //STM32所有头文件
#include "string.h"
#include "stdlib.h"
#include "stdint.h"
/*------------------------------------------------------------------------------------------------------*/
//用户文件头文件
#include "time_count.h"
#include "math.h"
#include "CH376INC.h"
#include "FILE_SYS.h"
#include "GPS.h"
#include "Pluse_Putout.h"
#include "Pluse_InPut.h"
#include "TXH.h"
#include "POS_Connect.h"
#include "AT45DB.h"
#include "DS1307.h"
#include "MD_Connect.h"
#include "Multiplex_Port.h"
#include "FRam.h"
#include "Analog.h"
#include "Log.h"
#include "oled.h"
#include "Printf.h"
#include "Surface.h"
#include "delay.h"
#endif
/************************Multiplex_Port*********************************************************************************Analog
END FILE
*********************************************************************************************************/
+30
View File
@@ -0,0 +1,30 @@
#include "config.h" //全局声明
int main(void)
{
// SystemInit(); //系统时钟等初始化
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
TIM_DeInit(TIM2);
USART_DeInit(USART1);
DMA_DeInit(DMA2_Stream5);
DMA_DeInit(DMA2_Stream7);
GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOB);
IWDG_ReloadCounter();
__set_PRIMASK(0);
delay_init();
//delay_ms(500);
IWDG_ReloadCounter();
TXH_Init();
IWDG_ReloadCounter();
// TXHData.PREXDATA_WaitUpNummber = 0;
// FMItemWrite(CF_PREXDATA_WaitUpNummber,0);
while(1)
{
TXH_Task();
IWDG_ReloadCounter();
};
}
+142
View File
@@ -0,0 +1,142 @@
/**
******************************************************************************
* @file ADC_Interleaved_DMAmode2/stm32f4xx_conf.h
* @author MCD Application Team
* @version V1.0.0
* @date 19-September-2011
* @brief Library configuration file.
******************************************************************************
* @attention
*
* 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, STMICROELECTRONICS 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>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F4xx_CONF_H
#define __STM32F4xx_CONF_H
#if defined (HSE_VALUE)
/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */
#undef HSE_VALUE
#define HSE_VALUE ((uint32_t)8000000)
#endif /* HSE_VALUE */
/* Includes ------------------------------------------------------------------*/
/* Uncomment the line below to enable peripheral header file inclusion */
#include "stm32f4xx.h"
#include "stm32f4xx_it.h"
#include "stm32f4xx_adc.h"
#include "stm32f4xx_can.h"
#include "stm32f4xx_crc.h"
#include "stm32f4xx_cryp.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_dbgmcu.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_flash.h"
#include "stm32f4xx_fsmc.h"
#include "stm32f4xx_hash.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_i2c.h"
#include "stm32f4xx_iwdg.h"
#include "stm32f4xx_pwr.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_rng.h"
#include "stm32f4xx_rtc.h"
#include "stm32f4xx_sdio.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_wwdg.h"
#include "misc.h"
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
#define GPIOH_IDR_Addr (GPIOF_BASE+16) //0x40021C10
#define GPIOI_IDR_Addr (GPIOG_BASE+16) //0x40022010 //F4XXIO 口操作 , 只对单一的 IO 口 ,n 的值范围 [0-15]
#define GPIOAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //GPIOA 某一位输出
#define GPIOAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //GPIOA 某一位输入
#define GPIOBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //GPIOB 某一位输出
#define GPIOBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //GPIOB 某一位输入
#define GPIOCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //GPIOC 某一位输出
#define GPIOCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //GPIOC 某一位输入
#define GPIODout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //GPIOD 某一位输出
#define GPIODin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //GPIOD 某一位输入
#define GPIOEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //GPIOE 某一位输出
#define GPIOEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //GPIOE 某一位输入
#define GPIOFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //GPIOF 某一位输出
#define GPIOFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //GPIOF 某一位输入
#define GPIOGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //GPIOG 某一位输出
#define GPIOGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //GPIOG 某一位输入
#define GPIOHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //GPIOH 某一位输出
#define GPIOHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //GPIOH 某一位输入
#define GPIOIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //GPIOI 某一位输出
#define GPIOIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //GPIOI 某一位输入
/* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* If an external clock source is used, then the value of the following define
should be set to the value of the external clock source, else, if no external
clock is used, keep this define commented */
/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */
/* Uncomment the line below to expanse the "assert_param" macro in the
Standard Peripheral Library drivers code */
/* #define USE_FULL_ASSERT 1 */
/* Exported macro ------------------------------------------------------------*/
#ifdef USE_FULL_ASSERT
/**
* @brief The assert_param macro is used for function's parameters check.
* @param expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
#endif /* __STM32F4xx_CONF_H */
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
+95
View File
@@ -0,0 +1,95 @@
#include "config.h"
/****************************************************
函数名:TIM2_IRQHandler
功能 :定时器2接收中断服务函数
参数 :无
返回值:无
****************************************************/
void TIM2_IRQHandler(void)
{
SYSTimer_IRQHandler();//系统定时器中断(主定时器,timer2)
}
void USART1_IRQHandler(void)
{
POS_Connect_DMARX_IRQHandler();
}
void DMA2_Stream7_IRQHandler(void)
{
POS_Connect_DMATX_IRQHandler();
}
void DMA2_Stream6_IRQHandler(void)
{
Multiplex_Port_DMATX_IRQHandler();
}
void USART6_IRQHandler(void)
{
Multiplex_Port_DMARX_IRQHandler();
}
void USART2_IRQHandler(void)
{
MD_Connect_DMARX1_IRQHandler();
}
void DMA1_Stream6_IRQHandler(void)
{
MD_Connect_DMATX1_IRQHandler();
}
void USART3_IRQHandler(void)
{
MD_Connect_DMARX4_IRQHandler();
}
void DMA1_Stream3_IRQHandler(void)
{
MD_Connect_DMATX4_IRQHandler();
}
void UART4_IRQHandler(void)
{
MD_Connect_DMARX2_IRQHandler();
}
void DMA1_Stream4_IRQHandler(void)
{
MD_Connect_DMATX2_IRQHandler();
}
void UART5_IRQHandler(void)
{
MD_Connect_DMARX3_IRQHandler();
}
void DMA1_Stream7_IRQHandler(void)
{
MD_Connect_DMATX3_IRQHandler();
}
void EXTI15_10_IRQHandler(void)
{
Pluse_InPut_IRQHandler();
}
void EXTI0_IRQHandler(void)
{
Pluse_InPut_IRQHandler();
}
void EXTI1_IRQHandler(void)
{
Pluse_InPut_IRQHandler();
}
void HardFault_Handler(void)
{
// /* Go to infinite loop when Hard Fault exception occurs */
if (CoreDebug->DHCSR & 1)
{ //check C_DEBUGEN == 1 -> Debugger Connected
__breakpoint(0); // halt program execution here
}
__set_FAULTMASK(1);
NVIC_SystemReset();
while(1);
}
+46
View File
@@ -0,0 +1,46 @@
/**
******************************************************************************
* @file ADC_Interleaved_DMAmode2/stm32f4xx_it.h
* @author MCD Application Team
* @version V1.0.0
* @date 19-September-2011
* @brief This file contains the headers of the interrupt handlers.
******************************************************************************
* @attention
*
* 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, STMICROELECTRONICS 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>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F4xx_IT_H
#define __STM32F4xx_IT_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
#ifdef __cplusplus
}
#endif
#endif /* __STM32F4xx_IT_H */
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
+553
View File
@@ -0,0 +1,553 @@
/**
******************************************************************************
* @file system_stm32f4xx.c
* @author MCD Application Team
* @version V1.0.0
* @date 30-September-2011
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
* This file contains the system clock configuration for STM32F4xx devices,
* and is generated by the clock configuration tool
* stm32f4xx_Clock_Configuration_V1.0.0.xls
*
* 1. This file provides two functions and one global variable to be called from
* user application:
* - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
* and Divider factors, AHB/APBx prescalers and Flash settings),
* depending on the configuration made in the clock xls tool.
* This function is called at startup just after reset and
* before branch to main program. This call is made inside
* the "startup_stm32f4xx.s" file.
*
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
* by the user application to setup the SysTick
* timer or configure other parameters.
*
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
* be called whenever the core clock is changed
* during program execution.
*
* 2. After each device reset the HSI (16 MHz) is used as system clock source.
* Then SystemInit() function is called, in "startup_stm32f4xx.s" file, to
* configure the system clock before to branch to main program.
*
* 3. If the system clock source selected by user fails to startup, the SystemInit()
* function will do nothing and HSI still used as system clock source. User can
* add some code to deal with this issue inside the SetSysClock() function.
*
* 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define
* in "stm32f4xx.h" file. When HSE is used as system clock source, directly or
* through PLL, and you are using different crystal you have to adapt the HSE
* value to your own configuration.
*
* 5. This file configures the system clock as follows:
*=============================================================================
*=============================================================================
* Supported STM32F4xx device revision | Rev A
*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* HCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* AHB Prescaler | 1
*-----------------------------------------------------------------------------
* APB1 Prescaler | 4
*-----------------------------------------------------------------------------
* APB2 Prescaler | 2
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) | 25000000
*-----------------------------------------------------------------------------
* PLL_M | 25
*-----------------------------------------------------------------------------
* PLL_N | 336
*-----------------------------------------------------------------------------
* PLL_P | 2
*-----------------------------------------------------------------------------
* PLL_Q | 7
*-----------------------------------------------------------------------------
* PLLI2S_N | NA
*-----------------------------------------------------------------------------
* PLLI2S_R | NA
*-----------------------------------------------------------------------------
* I2S input clock | NA
*-----------------------------------------------------------------------------
* VDD(V) | 3.3
*-----------------------------------------------------------------------------
* Main regulator output voltage | Scale1 mode
*-----------------------------------------------------------------------------
* Flash Latency(WS) | 5
*-----------------------------------------------------------------------------
* Prefetch Buffer | OFF
*-----------------------------------------------------------------------------
* Instruction cache | ON
*-----------------------------------------------------------------------------
* Data cache | ON
*-----------------------------------------------------------------------------
* Require 48MHz for USB OTG FS, | Enabled
* SDIO and RNG clock |
*-----------------------------------------------------------------------------
*=============================================================================
******************************************************************************
* @attention
*
* 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, STMICROELECTRONICS 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>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/** @addtogroup CMSIS
* @{
*/
/** @addtogroup stm32f4xx_system
* @{
*/
/** @addtogroup STM32F4xx_System_Private_Includes
* @{
*/
#include "stm32f4xx.h"
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Defines
* @{
*/
/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to use external SRAM mounted
on STM324xG_EVAL board as data memory */
/* #define DATA_IN_ExtSRAM */
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */
/******************************************************************************/
/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
#define PLL_N 336
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7
/******************************************************************************/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Macros
* @{
*/
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Variables
* @{
*/
uint32_t SystemCoreClock = 168000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
* @{
*/
static void SetSysClock(void);
#ifdef DATA_IN_ExtSRAM
static void SystemInit_ExtMemCtl(void);
#endif /* DATA_IN_ExtSRAM */
/**
* @}
*/
/** @addtogroup STM32F4xx_System_Private_Functions
* @{
*/
/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemFrequency variable.
* @param None
* @retval None
*/
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* Reset the RCC clock configuration to the default reset state ------------*/
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Disable all interrupts */
RCC->CIR = 0x00000000;
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
/* Configure the System clock source, PLL Multiplier and Divider factors,
AHB/APBx prescalers and Flash settings ----------------------------------*/
SetSysClock();
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}
/**
* @brief Update SystemCoreClock variable according to Clock Register Values.
* The SystemCoreClock variable contains the core clock (HCLK), it can
* be used by the user application to setup the SysTick timer or configure
* other parameters.
*
* @note Each time the core clock (HCLK) changes, this function must be called
* to update SystemCoreClock variable value. Otherwise, any configuration
* based on this variable will be incorrect.
*
* @note - The system frequency computed by this function is not the real
* frequency in the chip. It is calculated based on the predefined
* constant and the selected clock source:
*
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
*
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
*
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
* or HSI_VALUE(*) multiplied/divided by the PLL factors.
*
* (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value
* 16 MHz) but the real value may vary depending on the variations
* in voltage and temperature.
*
* (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value
* 25 MHz), user has to ensure that HSE_VALUE is same as the real
* frequency of the crystal used. Otherwise, this function may
* have wrong result.
*
* - The result of this function could be not correct when using fractional
* value for HSE crystal.
*
* @param None
* @retval None
*/
void SystemCoreClockUpdate(void)
{
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock source */
SystemCoreClock = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock source */
SystemCoreClock = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock source */
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P
*/
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
if (pllsource != 0)
{
/* HSE used as PLL clock source */
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
else
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
SystemCoreClock = pllvco/pllp;
break;
default:
SystemCoreClock = HSI_VALUE;
break;
}
/* Compute HCLK frequency --------------------------------------------------*/
/* Get HCLK prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
/* HCLK frequency */
SystemCoreClock >>= tmp;
}
/**
* @brief Configures the System clock source, PLL Multiplier and Divider factors,
* AHB/APBx prescalers and Flash settings
* @Note This function should be called only once the RCC clock configuration
* is reset to the default reset state (done in SystemInit() function).
* @param None
* @retval None
*/
static void SetSysClock(void)
{
/******************************************************************************/
/* PLL (clocked by HSE) used as System clock source */
/******************************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_VOS;
/* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK / 1*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK / 1*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
/* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Configure Flash prefetch, Instruction cache, Data cache and wait state */
FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
/**
* @brief Setup the external memory controller. Called in startup_stm32f4xx.s
* before jump to __main
* @param None
* @retval None
*/
#ifdef DATA_IN_ExtSRAM
/**
* @brief Setup the external memory controller.
* Called in startup_stm32f4xx.s before jump to main.
* This function configures the external SRAM mounted on STM324xG_EVAL board
* This SRAM will be used as program data memory (including heap and stack).
* @param None
* @retval None
*/
void SystemInit_ExtMemCtl(void)
{
/*-- GPIOs Configuration -----------------------------------------------------*/
/*
+-------------------+--------------------+------------------+------------------+
+ SRAM pins assignment +
+-------------------+--------------------+------------------+------------------+
| PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 |
| PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 |
| PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 |
| PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 |
| PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 |
| PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 |
| PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | PF13 <-> FSMC_A7 |------------------+
| PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 | PF14 <-> FSMC_A8 |
| PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 | PF15 <-> FSMC_A9 |
| PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |------------------+
| PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 |
| | PE15 <-> FSMC_D12 |
+-------------------+--------------------+
*/
/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
RCC->AHB1ENR = 0x00000078;
/* Connect PDx pins to FSMC Alternate function */
GPIOD->AFR[0] = 0x00cc00cc;
GPIOD->AFR[1] = 0xcc0ccccc;
/* Configure PDx pins in Alternate function mode */
GPIOD->MODER = 0xaaaa0a0a;
/* Configure PDx pins speed to 100 MHz */
GPIOD->OSPEEDR = 0xffff0f0f;
/* Configure PDx pins Output type to push-pull */
GPIOD->OTYPER = 0x00000000;
/* No pull-up, pull-down for PDx pins */
GPIOD->PUPDR = 0x00000000;
/* Connect PEx pins to FSMC Alternate function */
GPIOE->AFR[0] = 0xc00cc0cc;
GPIOE->AFR[1] = 0xcccccccc;
/* Configure PEx pins in Alternate function mode */
GPIOE->MODER = 0xaaaa828a;
/* Configure PEx pins speed to 100 MHz */
GPIOE->OSPEEDR = 0xffffc3cf;
/* Configure PEx pins Output type to push-pull */
GPIOE->OTYPER = 0x00000000;
/* No pull-up, pull-down for PEx pins */
GPIOE->PUPDR = 0x00000000;
/* Connect PFx pins to FSMC Alternate function */
GPIOF->AFR[0] = 0x00cccccc;
GPIOF->AFR[1] = 0xcccc0000;
/* Configure PFx pins in Alternate function mode */
GPIOF->MODER = 0xaa000aaa;
/* Configure PFx pins speed to 100 MHz */
GPIOF->OSPEEDR = 0xff000fff;
/* Configure PFx pins Output type to push-pull */
GPIOF->OTYPER = 0x00000000;
/* No pull-up, pull-down for PFx pins */
GPIOF->PUPDR = 0x00000000;
/* Connect PGx pins to FSMC Alternate function */
GPIOG->AFR[0] = 0x00cccccc;
GPIOG->AFR[1] = 0x000000c0;
/* Configure PGx pins in Alternate function mode */
GPIOG->MODER = 0x00080aaa;
/* Configure PGx pins speed to 100 MHz */
GPIOG->OSPEEDR = 0x000c0fff;
/* Configure PGx pins Output type to push-pull */
GPIOG->OTYPER = 0x00000000;
/* No pull-up, pull-down for PGx pins */
GPIOG->PUPDR = 0x00000000;
/*-- FSMC Configuration ------------------------------------------------------*/
/* Enable the FSMC interface clock */
RCC->AHB3ENR = 0x00000001;
/* Configure and enable Bank1_SRAM2 */
FSMC_Bank1->BTCR[2] = 0x00001015;
FSMC_Bank1->BTCR[3] = 0x00010603;
FSMC_Bank1E->BWTR[2] = 0x0fffffff;
/*
Bank1_SRAM2 is configured as follow:
p.FSMC_AddressSetupTime = 3;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 6;
p.FSMC_BusTurnAroundDuration = 1;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
*/
}
#endif /* DATA_IN_ExtSRAM */
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.