bsp_exti.c
4.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
*********************************************************************************************************
*
* 模块名称 : 外部中断模块
* 文件名称 : 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");
}