#include "led.h" #include "stm32f10x_iwdg.h" #include "sd.h" #define WWDG_REFRESH (0x7F) uint8_t wwdg_int_cnt = 0; //LED IO初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE,PD端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_9); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_0); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_10; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOA,GPIO_Pin_1); //PB.5 输出高 GPIO_ResetBits(GPIOA,GPIO_Pin_10); // pwr5v open //KC 1 2 3 4 5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_ResetBits(GPIOC,GPIO_Pin_5); //PB.5 输出高 GPIO_SetBits(GPIOC,GPIO_Pin_7); // 1043 ENable // GPIO_ResetBits(GPIOC,GPIO_Pin_7); // 1043 DISENable GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 |GPIO_Pin_14|GPIO_Pin_9|GPIO_Pin_5; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_9); // pwr3.3v close GPIO_ResetBits(GPIOB,GPIO_Pin_0); GPIO_ResetBits(GPIOB,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); GPIO_ResetBits(GPIOB,GPIO_Pin_14); ////GPIO_SetBits(GPIOB,GPIO_Pin_9); // pwr3.3v close // GPIO_ResetBits(GPIOB,GPIO_Pin_9); // pwr3.3v open GPIO_ResetBits(GPIOB,GPIO_Pin_5); // can_en open // //SD卡是否插入检测脚 // GPIO_InitStructure.GPIO_Pin = SD_INSERT_PIN; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PC4 // GPIO_Init(SD_INSERT_PORT, &GPIO_InitStructure);//初始化GPIOC GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // A+ detect GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOC GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // Acc detect GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); // 释放PB4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_4); // 1043 work BKP_TamperPinCmd(DISABLE); /* 关闭入侵检测功能,PC13可以用作普通IO*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 1043 Can_int GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC } /* * 设置 IWDG 的超时时间 * Tout = prv/40 * rlv (s) * prv可以是[4,8,16,32,64,128,256] * prv:预分频器值,取值如下: * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 * * rlv:预分频器值,取值范围为:0-0XFFF * 函数调用举例: * IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超时溢出 */ void IWDG_Config(uint8_t prv ,uint16_t rlv) { // 使能 预分频寄存器PR和重装载寄存器RLR可写 IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable ); // 设置预分频器值 IWDG_SetPrescaler( prv ); // 设置重装载寄存器值 IWDG_SetReload( rlv ); // 把重装载寄存器的值放到计数器中 IWDG_ReloadCounter(); // 使能 IWDG IWDG_Enable(); } // 喂狗 void IWDG_Feed(void) { // 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位 // 当计数器的值减到0的时候会产生系统复位 //IWDG_ReloadCounter(); WWDG->CR = WWDG_REFRESH; wwdg_int_cnt = 0; } void IWDG_Init(void) // use window dog { // IWDG 1s 超时溢出 //IWDG_Config(IWDG_Prescaler_64 ,625); RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; WWDG->CFR = WWDG_CFR_EWI | WWDG_CFR_WDGTB | 0x7f; //使能EWI中断,8分频// WWDG->CR = WWDG_REFRESH; WWDG->CR |= WWDG_CR_WDGA; NVIC_SetPriority(WWDG_IRQn, 0); NVIC_EnableIRQ(WWDG_IRQn); ////DebugOut("WWDG init ok\r\n",0, PCPRINTF); } void WWDG_IRQHandler(void)//// { WWDG->SR = 0; //#if (WDG_TYPE == WDG_WWDG) wwdg_int_cnt++; if (wwdg_int_cnt <= 30) // 15 { WWDG->CR = WWDG_REFRESH; } //#endif }