/**
******************************************************************************
* @file PWR_STOP/main.c
* @author MCD Application Team
* @version V1.0.1
* @date 11-October-2013
* @brief Main program body
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "MM32F031xxn.h"
#include <math.h> //Library
#include "user.h"
#include "control_circuit.h"
//函数声明
void on_off(uint8_t num);
void uart2_report(void);
void uart1_communication(void);
void report2_format(void);
void auto2_sending(void);
void Delay_Ms(uint32_t time_ms);
//变量声明
uint32_t counter_cycle, uart1_rate, uart2_rate, cntr_unse, cntr_tim14;
uint16_t adc_v, voltage, o2c, o2f, o2t, o2RH, o2P;
uint32_t o2p, kpa;
uint8_t USART1_TXbuffer[30], USART1_RXbuffer[30], USART2_TXbuffer[30], USART2_RXbuffer[30], buf_us6300[4], report8[30];
u8 flag_pad, flag_menu, flag_light, battery, display_flag;
uint16_t voltage_buffer[15], power_off_cntr;
uint8_t rx_flag, code_right, code_num, flag_adj, flash_write;
uint8_t USART1_RXtotal, USART1_TXtotal, USART2_RXtotal, USART2_TXtotal, flag_preparing_report, sensor_num;
float o2c_factor, o2f_factor, atm, temperature;
uint8_t I2C1_Tx_Buffer[16];
uint8_t I2C1_Rx_Buffer[16];
//void data_init(void)
//{
// STMFLASH_Read (FLASH_STORE_BASE_ADDR,(uint8_t*)I2C1_Rx_Buffer,16);
// if((I2C1_Rx_Buffer[0]==0xAA)&&(I2C1_Rx_Buffer[3]==0x55))
// {
// o2c_add = I2C1_Rx_Buffer[1];
// o2f_add = I2C1_Rx_Buffer[2];
// }
// else
// {
// I2C1_Tx_Buffer[0] = 0xAA;
// I2C1_Tx_Buffer[1] = o2c_add;
// I2C1_Tx_Buffer[2] = o2f_add;
// I2C1_Tx_Buffer[3] = 0x55;
// STMFLASH_Write(FLASH_STORE_BASE_ADDR,(uint8_t*)I2C1_Tx_Buffer,16);
// }
// if(o2f_add>0x80)
// o2f_factor = 1 + 0.01*(o2f_add - 0x80);
// else
// o2f_factor = 1 - 0.01*(0x80-o2f_add);
//}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
uint32_t i;
uint8_t enable;
for (i=0;i<MILLISECOND*64*10;i++){} // 这段延时不可省去:
// ------初始化全局变量------------
o2c = 210;
o2f = 0;
sensor_num = 0;
flag_menu = 0;
flash_write = 0;
stm32_Init ();
uart1_communication();
uart2_report();
ControlCircuit_Init(); // 初始化12V控制IO
// data_init();
LED_ON;
for (i=0;i<MILLISECOND*64*10;i++){} // 这段延时不可省去:
LED_OFF;
VAL_ON;
// 开启12V输出
//Voltage12V_Control(1);
// 关闭12V输出
Voltage12V_Control(0);
// I2CInitMasterMode();
// I2CMasterWrite(I2C1,US6300_ADDR, 0x06, 0, buf_us6300);
for (i=0;i<500000;i++){}; // 这段延时可导致标定时通信不正常;但有时,在线仿真时没有此延时,EEPROM无法通过;
// I2CMasterWrite(I2C1,US6300_ADDR, 0x50, 0, buf_us6300);
// for (i=0;i<500;i++){};
// I2CMasterWrite(I2C1,US6300_ADDR, 0x30, 0, buf_us6300);
// for (i=0;i<500;i++){};
// I2CMasterWrite(I2C1,US6300_ADDR, 0xAA, 0, buf_us6300);
// for (i=0;i<500000;i++){} // 这段延时可导致标定时通信不正常;但有时,在线仿真时没有此延时,EEPROM无法通过;
// IWDG->KR = 0xAAAA; // 刷新看门狗IWDG ;写入0xAAAA=装入重载值;
IWDG->KR = 0xCCCC; // 启动看门狗;
IWDG->KR = 0xAAAA; // 刷新看门狗IWDG; 写入0xAAAA=装入重载值;
// I2CMasterWrite(I2C1,US6300_ADDR, 0xAA, 0, buf_us6300);//读第一次数据时必须唤醒3次
// for (i=0;i<500000;i++){} // 这段延时可导致标定时通信不正常;但有时,在线仿真时没有此延时,EEPROM无法通过;
// IWDG->KR = 0xAAAA; // 刷新看门狗IWDG ;写入0xAAAA=装入重载值;
// *****************************************************
while(1)
{
IWDG->KR = 0xAAAA; // 刷新看门狗IWDG ;写入0xAAAA=装入重载值?
//Voltage12V_Control(1); // PA15输出高电平
// Delay_Ms(5); // 保持高电平
//Voltage12V_Control(0); // PA15输出低电平
// Delay_Ms(5); // 保持低电平
if(flag_menu)
{
// I2CMasterWrite(I2C1,US6300_ADDR, 0x50, 0, buf_us6300);
// for (i=0;i<5000;i++){};
// I2CMasterWrite(I2C1,US6300_ADDR, 0x50, 0, buf_us6300);
// for (i=0;i<5000;i++){};
// I2CMasterWrite(I2C1,US6300_ADDR, 0x30, 0, buf_us6300);
// for (i=0;i<5000;i++){};
// I2CMasterRead1_6300(I2C1,US6300_ADDR, 3, buf_us6300);
// atm = ((buf_us6300[0]&0x0f)*256*256 + buf_us6300[1]*256 + buf_us6300[2])/1000.0; //value/10=hpa,kpa/6.895=psi,hpa/6.895=psi*10;
// for (i=0;i<5000;i++){};
// I2CMasterWrite(I2C1,US6300_ADDR, 0x32, 0, buf_us6300); //温度
// for (i=0;i<5000;i++){};
// I2CMasterRead1_6300(I2C1,US6300_ADDR, 3, buf_us6300);
// temperature = ((buf_us6300[0]&0x0f)*256*256 + buf_us6300[1]*256 + buf_us6300[2])/100.0;
flag_menu = 0;
}
}
}
// *****************************************************************************************
// 准备常规报
// *****************************************************************************************
void report2_format(void)
{
uint32_t i,j;
uint8_t temp, temp_AAA[4], temp2_AAA[20];
uint16_t temp_u16;
uint32_t temp_u32;
union AAA
{
float f[5] ;
u8 u8_[20];
} convert; //
convert.f[0] = (float)o2c/10;
convert.f[1] = (float)o2RH/10;
convert.f[2] = (float)o2t/10; //--传感器显示此数据
convert.f[3] = (float)o2P/10;
convert.f[4] = (float)atm;
for (i=0;i<5;i++) //5个浮点
{
for (j=0;j<4;j++) temp_AAA[3-j] = convert.u8_[i*4+j];
for (j=0;j<4;j++) temp2_AAA[i*4+j] = temp_AAA[j];
}
flag_preparing_report=1; //防止在变更过程中发送
for (i=0;i<20;i++) report8[i+4] = temp2_AAA[i]; //利用union将浮点转到report8中;
report8[0]=0x16;
report8[1]=0x09;
report8[2]=0x01;
report8[3]=sensor_num-1;
temp = 0;
for(i=0;i<24;i++) temp += report8[i];
report8[24] = 0x00 - temp; //计算校验字;
for (i=0;i<25;i++)
USART2_TXbuffer[i] = report8[i]; //将report8拷贝; report8[i]
flag_preparing_report = 0;
}
// *******************************************************************************
// auto_sending自动发送浓度
// *******************************************************************************
void auto2_sending(void) //正常检测时,自动发送检测数据----复核时模式应该还是calibration, 符合完成后才改成NORMAL;
{
if(flag_preparing_report==0) //防护措施:防止数据准备未完成时发送;
{
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA1_Channel4->CMAR = (u32)&USART2_TXbuffer;
DMA1_Channel4->CNDTR = USART2_TXtotal; //DMA通道的DMA缓存的大小
DMA_Cmd(DMA1_Channel4, ENABLE);
}
}
void uart1_communication(void)
{
uint16_t temp_16;
//GPIO端口设置
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
UART_InitTypeDef UART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); //使能UART2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //开启GPIOA时钟
//UART1 NVIC 配置
//UART 初始化设置
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
uart1_rate = 9600;
UART_InitStructure.UART_BaudRate = uart1_rate;//串口波特率
USART1_TXtotal = 4;
USART1_RXtotal = 12;
UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
UART_InitStructure.UART_StopBits = UART_StopBits_1;//一个停止位
UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校验位
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; //收发模式
UART_Init(UART1, &UART_InitStructure); //初始化串口1
UART_Cmd(UART1, ENABLE); //使能串口1
//UART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//UART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
// printf("UART OK!\r\n");
//----------UART1_DMA配置部分-------------------
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(UART1->TDR); //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_TXbuffer; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_BufferSize = USART1_TXtotal; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel2, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道UART1_Tx_DMA_Channel所标识的寄存器
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) &(UART1->RDR); //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RXbuffer; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,赐馍栌读取发送到内存
DMA_InitStructure.DMA_BufferSize = USART1_RXtotal; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel3, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道UART1_Tx_DMA_Channel所标识的寄存器
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
// UART_DMACmd(UART1,UART_DMAReq_EN,ENABLE); //使能uart1 DMA
DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);
UART_DMACmd(UART1,UART_DMAReq_EN,ENABLE); //使能uart1 DMA
// DMA_Cmd(DMA1_Channel4, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);
}
void uart2_report(void)
{
uint16_t temp_16;
//GPIO端口设置
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
UART_InitTypeDef UART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART2, ENABLE); //使能UART2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //开启GPIOA时钟
//UART1 NVIC 配置
//UART 初始化设置
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
uart2_rate = 115200;
UART_InitStructure.UART_BaudRate = uart2_rate;//串口波特率
USART2_TXtotal = 25;
USART2_RXtotal = 8;
UART_InitStructure.UART_WordLength = UART_WordLength_8b;//字长为8位数据格式
UART_InitStructure.UART_StopBits = UART_StopBits_1;//一个停止位
UART_InitStructure.UART_Parity = UART_Parity_No;//无奇偶校验位
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;//无硬件数据流控制
UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; //收发模式
UART_Init(UART2, &UART_InitStructure); //初始化串口1
UART_Cmd(UART2, ENABLE); //使能串口1
//UART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//UART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
// printf("UART OK!\r\n");
//----------UART1_DMA配置部分-------------------
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能DMA传输
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(UART2->TDR); //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_TXbuffer; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_BufferSize = USART2_TXtotal; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道UART1_Tx_DMA_Channel所标识的寄存器
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) &(UART2->RDR); //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RXbuffer; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,赐馍栌读取发送到内存
DMA_InitStructure.DMA_BufferSize = USART2_RXtotal; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel5, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道UART1_Tx_DMA_Channel所标识的寄存器
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
// UART_DMACmd(UART1,UART_DMAReq_EN,ENABLE); //使能uart1 DMA
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
UART_DMACmd(UART2,UART_DMAReq_EN,ENABLE); //使能uart1 DMA
// DMA_Cmd(DMA1_Channel4, ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
//**
//矩阵切换
//**
void on_off(uint8_t num)
{
uint8_t board, sensor_num;
board = num%128/16;
sensor_num = num%16;
switch(board) //切换板编号
{
case 0:
EN0_ON; EN1_OFF; EN2_OFF; EN3_OFF;
break;
case 1:
EN0_OFF; EN1_ON; EN2_OFF; EN3_OFF;
break;
case 2:
EN0_OFF; EN1_OFF; EN2_ON; EN3_OFF;
break;
case 3:
EN0_OFF; EN1_OFF; EN2_OFF; EN3_ON;
break;
}
switch(sensor_num) //传感器编号
{
case 15:
A0_ON; A1_ON; A2_ON; A3_ON;
break;
case 14:
A0_OFF; A1_ON; A2_ON; A3_ON;
break;
case 13:
A0_ON; A1_OFF; A2_ON; A3_ON;
break;
case 12:
A0_OFF; A1_OFF; A2_ON; A3_ON;
break;
case 11:
A0_ON; A1_ON; A2_OFF; A3_ON;
break;
case 10:
A0_OFF; A1_ON; A2_OFF; A3_ON;
break;
case 9:
A0_ON; A1_OFF; A2_OFF; A3_ON;
break;
case 8:
A0_OFF; A1_OFF; A2_OFF; A3_ON;
break;
case 7:
A0_ON; A1_ON; A2_ON; A3_OFF;
break;
case 6:
A0_OFF; A1_ON; A2_ON; A3_OFF;
break;
case 5:
A0_ON; A1_OFF; A2_ON; A3_OFF;
break;
case 4:
A0_OFF; A1_OFF; A2_ON; A3_OFF;
break;
case 3:
A0_ON; A1_ON; A2_OFF; A3_OFF;
break;
case 2:
A0_OFF; A1_ON; A2_OFF; A3_OFF;
break;
case 1:
A0_ON; A1_OFF; A2_OFF; A3_OFF;
break;
case 0:
A0_OFF; A1_OFF; A2_OFF; A3_OFF;
break;
}
}
//电压采样
void Get_Adc_Average(void)
{
uint8_t i;
uint16_t temp_v, Temp_average_float;
}
void Delay_Ms(uint32_t time_ms)
{
uint32_t i, j;
// 延时系数根据MM32F031主频调整(默认48MHz,约48000次循环为1ms)
for(i = 0; i < time_ms; i++)
{
for(j = 0; j < 48; j++)
{
// 空循环延时,同时定期刷新看门狗避免复位
if(j % 10000 == 0)
IWDG->KR = 0xAAAA; // 刷新看门狗
}
}
}
//正常显示
void display(void)
{
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
这个是主函数