bsp_exti.c 4.81 KB
/*
*********************************************************************************************************
*
*	模块名称 : 外部中断模块
*	文件名称 : bsp_exit.c
*	版    本 : V1.0
*	说    明 : 将断电检测引脚PG15作为外部中断。
*	修改记录 :
*		版本号   日期        作者     说明
*
*********************************************************************************************************
*/
#include "bsp.h"
#include "bsp_exti.h"


agvPowOffList PowOffList;

// AGV信号处理单元板电源掉电管脚初始化
void PowerFailInit(void)  // PB8--电源掉电检测 高--正常  低--掉电
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  //使能GPIOB 时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;            //对应引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;         //普通输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;   //100M
	//		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;         //上拉
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉    GPIO_PuPd_NOPULL
	GPIO_Init(GPIOB, &GPIO_InitStructure);              //初始化GPIOB8
}

void EXTIX_Init(void)    // 信号处理单元板CPU掉电检测脚PB8 外部中断设置
{
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;

	PowerFailInit();               //电源掉电管脚初始化

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);    //使能SYSCFG时钟

	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource8);//PB8 连接到中断线8

	/* 配置EXTI_Line8 */
	EXTI_InitStructure.EXTI_Line = EXTI_Line8;//LINE8
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
	//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发  正常0 掉电时1
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  // 下降沿触发 正常 1 掉电0
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE8
	EXTI_Init(&EXTI_InitStructure);//配置

	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中断  EXTI9_5_IRQHandler
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
	NVIC_Init(&NVIC_InitStructure);//配置	   
}


extern u16 BackupSRAM_WriteData(u16 AddrOffset, u8 *pData, u16 DataLen);
unsigned char SaveUsRegHoldingBuf[500] = {0};

void EXTI9_5_IRQHandler(void)   // 掉电 中断函数 PB8-->对应 EXTI9_5_IRQHandler
{
	 // 添加电源掉电中断处理代码
	 /**   相应代码   **/
//	BackupSRAM_WriteData(0,PowOffList.buffer,12);
//	BreakShortToTwoByte(usRegHoldingBuf,101,(char*)SaveUsRegHoldingBuf);
//	BackupSRAM_WriteData(0,SaveUsRegHoldingBuf,202);
	Uart_Printf(COM1,"<*****************开启保存\r\n");
	
	 // 最后一句代码
	EXTI_ClearITPendingBit(EXTI_Line8);//清除LINE8上的中断标志位  
}


// 下面是RTC 4K SRAM 的 初始化及读写

#define BACKUP_SRAM_SIZE		(4*1024)		//备份SRAM大小 4KB

/**
 * @brief 备份 RTC 4K SRAM初始化
 * @param[in] void
 * @retval  NULL
 */
void vBkpSramInit(void)     // 备份 RTC 4K SRAM初始化 
{
	/*  电源接口时钟使能(Power interface clock enable) */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	
	/* DBP 位置1 使能对备份域的访问 */
	PWR_BackupAccessCmd(ENABLE);
	
	/* 通过将 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 置 1, 使能备份 SRAM 时钟 */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
	
	//while(PWR_GetFlagStatus(PWR_FLAG_BRR) != SET);
	PWR->CSR |= 0X0200;   // 使能备份调压器,不开启会导致备份SRAM数据丢失!!
}

// 写入数据到备份RAM中
u16 BackupSRAM_WriteData(u16 AddrOffset, u8 *pData, u16 DataLen)
{ 
	u32 len;
	
	if(pData==NULL) return 0;											
	if(DataLen==0) return 0;											
	if(AddrOffset >= BACKUP_SRAM_SIZE) return 0;	  // 	起始地址有误					
	len = AddrOffset + DataLen;	
	if(len > BACKUP_SRAM_SIZE) len = BACKUP_SRAM_SIZE;					
	len -= AddrOffset;													     //写入的数据长度 
	DataLen = len;
	//#define BKPSRAM_BASE ((uint32_t)0x40024000)  /*!< Backup SRAM(4 KB) base address 
	memcpy((u8 *)BKPSRAM_BASE+AddrOffset, pData, DataLen);
	
	return len;
}

// 从备份RAM中读出数据
u16 BackupSRAM_ReadData(u16 AddrOffset, u8 *pData, u16 DataLen)
{ 
	u32 len;
	
	if(pData==NULL) return 0;											
	if(DataLen==0) return 0;											
	if(AddrOffset >= BACKUP_SRAM_SIZE) return 0;						
	len = AddrOffset + DataLen;	
	if(len > BACKUP_SRAM_SIZE) len = BACKUP_SRAM_SIZE;					
	len -= AddrOffset;	
	DataLen = len;	
	memcpy(pData, (u8 *)BKPSRAM_BASE+AddrOffset, DataLen);
	
	return len;
}

void agvReadLastCoo()
{
//	memset(PowOffList.buffer,0,12);
//	BackupSRAM_ReadData(0,PowOffList.buffer,12);
//	Uart_Printf(COM1,"启动读取RAMx=%f	y=%f	w=%f\r\n",PowOffList.PowOffCoordinatePoints.xPoint,
//	PowOffList.PowOffCoordinatePoints.yPoint,PowOffList.PowOffCoordinatePoints.W);	
	memset(SaveUsRegHoldingBuf,0,500);
	BackupSRAM_ReadData(0,SaveUsRegHoldingBuf,202);
//	CombineTwoByteToOneShort(usRegHoldingBuf,101,(char*)SaveUsRegHoldingBuf);
	Uart_Printf(COM1,"启动读取\r\n");	
}