forked from xialei/BenTengFDC2
170 lines
5.2 KiB
C
170 lines
5.2 KiB
C
#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
|
||
}
|
||
|
||
|
||
|