不带操作系统架构适合用状态机方式来做功能逻辑应用。每一种状态跑完跑下一种,时时要求高的用中断,要求不高的定时器标记计数,while循环中用累加延长时间。执行函数。人懒只随便写了一点。。。。。。。
#define overcurrent_ADC_val 100;
//版本
typedef struct
{
unsigned char ucVersion[32];
unsigned char ucDate[32];
unsigned char ucTime[32];
}TS_versions;
const TS_versions versions=
{
"Pro_name_V00",
__DATE__,
__TIME__,
}
//显示运行状态
enum en_led_state{
Led_star=0,
led_run,
led_charge,
led_stop,
led_short_error,
led_overcurrent_error
};
//程序运行状态
enum en_state{
Fun_start=0,
Fun_run,
Fun_stop,
Fun_sleep,
Fun_error
};
enum en_state state;
enum en_led_state led_state;
extern unsigned int GET_ADC_VAL(unsigned char num);
//PWM调整参数处理
void PWM_PRO(enum state flag);
//LED工作显示处理
void LED_PRO(enum state flag);
//ADC工作选择
void ADC_PRO(enum state flag)
{
unsigned int temp_bat_val=0;
switch(flag)
{
case Fun_start:
temp_bat_val= GET_ADC_BAT_VAL();
break;
case Fun_run:
temp_bat_val= GET_ADC_LOAD_VAL();
if(temp_bat_val>overcurrent_ADC_val)
led_state=led_run;
else
led_state=led_overcurrent_error;
break;
case Fun_stop:
break;
case Fun_sleep:
break;
case Fun_error:
break;
default:
break;
}
}
//输入启动检测
void KEY_CAN(void);
//开门狗喂狗
void WD_DOG();
//唤醒睡眠操作
void WAKE_UP(void)
{
GPIO_WAKEUP_Init();
}
void Sleep(void)
{
GPIO_Sleep_Init();
}
//EEPROM 操作
EEPROM_Wirte(void);
EEPROM_Read(void);
void Fun_PRO(void)
{
printf("Version : %s\r\n", versions.ucVersion);
printf("buildTime: %s\r\n", versions.ucDate);
printf("buildTime: %s\r\n", versions.ucTime);
EEPROM_Read();//读取保存的状态和重要的数据参数
if(timer_1ms_count>10)//延时执行函数
{
timer_start_10ms_count++;
timer_1ms_count=0;
KEY_CAN();
}
WD_DOG();
switch(state)
{
case Fun_start:
WAKE_UP();
if(timer_start_10ms_count>10)
{
ADC_PRO(Fun_start);
timer_start_10ms_count=0;
}
break;
case Fun_run:
PWM_PRO(Fun_run);
ADC_PRO(Fun_run);
LED_RUN(Fun_run);
break;
case Fun_stop:
PWM_PRO(Fun_stop);
LED_PRO(Fun_stop);
break;
case Fun_sleep:
Sleep();
break;
case Fun_error:
LED_PRO(Fun_error);
break;
default:
break;
}
}
//main.c
int main(void)
{
Hard_Init();
while(1)
{
Fun_PRO();
}
}