/********************************************************* *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd *文件名: main.c *作 者: AE Team *版 本: V1.00 *日 期: 2021/05/13 *描 述: GPIO模块示例程序 * 定时扫描GPIO_PA2的电平状态,高电平点亮LED1,低电平熄灭LED1 *备 注: *本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。 **********************************************************/ #include "main.h" #include //定义布尔 extern int ozone_work_state; extern zkey_module_t key_module; extern bool g_ozone_interva_stat; /*********************************************************************************************************************** * =====================================================看门狗====================================================== ** ***********************************************************************************************************************/ void iwdt_init(void) { /** * @brief 看门狗介绍:当计数到0时,窗口计数器+1 * 当窗口计数为“2”的时候,产生中断 * 当窗口计数器为“4”的之前没有进行喂狗操作,产生复位 * */ IWDT_InitStruType x; x.WDT_Tms = 4000; x.WDT_IE = Enable; /* IWDT中断使能 */ x.WDT_Rst = Enable; /* IWDT复位使能 */ x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */ IWDT_Init(&x); /* 使能IWDT */ IWDT_Enable(); } void feed_iwdt(void) { //喂狗 if (0x01 == IWDT_GetFlagStatus()) //产生中断 IWDT_Clear(); } extern uint32_t print_time; //############### 测试一下看门狗 ##############// void test_iwdt(void) { if (print_time <= 5000) { feed_iwdt(); } } /*********************************************************************************************************************** * =====================================================adc====================================================== ** ***********************************************************************************************************************/ uint16_t meanvalue; void ADCInit(void) { ADC_InitStruType x; GPIO_InitSettingType y; y.Signal = GPIO_Pin_Signal_Analog;//模拟 y.Dir = GPIO_Direction_Input;//输入 y.Func = GPIO_Reuse_Func0; // GPIO_Init(GPIO_Pin_B9, &y); GPIO_Init(GPIO_Pin_A2, &y); //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us x.CLKS = ADC_CLKS_PCLK; x.CLKDIV = ADC_CLKDIV_1_4; /* ADC时钟源预分频 */ //采集到的模拟量*2.048/4096=现在的电压 x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v */ x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD */ x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */ // x.CHS = ADC_CHS_AIN4; x.CHS = ADC_CHS_AIN8; x.SMPS = ADC_SMPS_HARD; /* AD采样模式为硬件控制 */ //采样时间st*2+1=1.743us x.ST = 10; /* AD采样时间选择 */ x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */ ADC_Init(&x); ADC_ACP_Disable(); ADC_IE_Enable(); /* ADC中断使能 */ NVIC_Init(NVIC_ADC_IRQn, NVIC_Priority_1, Enable); } void ADCACPConfig(void) { ADC_ACP_TypeDef x; //Tacp约0.5us x.ACP_EN = ENABLE; //溢出时间 4*0.5=20us x.ACPC_OVER_TIME = 0x30; /* 自动转换比较的溢出时间 */ //2us内采样8次 x.ACPC_TIMES = ADC_ACPC_TIMES_8; /* 自动转换比较次数选择位 */ x.ACPC_MIN_TARGET = 0x010; /* 自动比较高阈值,当mean值小于该值时,会触发中断 */ x.ACPC_MAX_TARGET = 0x700; /* 自动比较低阈值,当mean值大于该值时,会触发中断 */ ADC_ACPConfig(&x); } /*********************************************************************************************************************** * ======================================================主函数======================================================= ** ***********************************************************************************************************************/ int main(void) { HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC SystemInit(); DeviceClockAllEnable(); //打开所有外设时钟 User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断) SysTick_Enable(); uart0_init(); gpio_init(); zkey_init(&key_module); t16n0_1_init(); //配置PA4输出pwm iwdt_init(); power_on_ozone_work_state(); //上电工作情况 ADCInit(); /* 配置自动比较功能,启动ADC */ ADCACPConfig(); // ADC_Start(); printf("Initialization completed\r\n"); while (1) { // port_do_debug_light_state(); port_key_state(); if (get_ozone_starting_up_state() == true) { //开机中 if (ozone_work_state == 2) is_ozone_work_time_over(); if (g_ozone_interva_stat == true) is_ozone_interva_time_over(); // if(meanvalue!=0){ // printf("meanvalue:%d\r\n",meanvalue); // meanvalue=0; // } } // test_iwdt(); feed_iwdt(); //当产生中断的时候进行喂狗操作 } }