You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

144 lines
5.3 KiB

/*********************************************************
*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 <stdbool.h> //定义布尔
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(); //当产生中断的时候进行喂狗操作
}
}