11. 安全与保护机制
在嵌入式系统设计中,安全与保护机制是至关重要的一环。LPC1100 系列单片机基于 ARM Cortex-M0 内核,提供了多种安全与保护机制,以确保系统的可靠性和安全性。本节将详细介绍这些机制的原理和应用,包括硬件保护机制和软件保护机制。
11.1 硬件保护机制
LPC1100 系列单片机的硬件保护机制主要包括复位保护、电源保护、时钟监控和存储器保护等。这些机制通过硬件电路实现,能够有效防止系统在异常情况下发生故障或数据丢失。
11.1.1 复位保护
复位保护机制用于在系统上电或发生严重故障时恢复到初始状态。LPC1100 系列单片机支持多种复位源,包括上电复位(POR)、外部复位引脚(nRESET)、看门狗定时器复位(WDT)、软件复位等。
- 上电复位(POR):当电源电压低于某个阈值时,POR 电路会自动触发复位。这确保了系统在电源不稳定时能够正确初始化。
- 外部复位引脚(nRESET):通过外部引脚可以手动触发复位。通常连接到一个按钮或外部复位电路。
- 看门狗定时器复位(WDT):看门狗定时器用于监控软件的运行状态。如果软件在设定的时间内没有重置看门狗定时器,系统将自动复位。
- 软件复位:通过软件指令可以触发复位。这对于在软件中检测到严重错误时恢复系统非常有用。
代码示例:配置看门狗定时器
#include "LPC11xx.h"
// 配置看门狗定时器
void WDT_Config(void) {
// 使能看门狗定时器
LPC_WDT->WDTMOD = 0x00000003; // 模式选择:定时器模式,允许时钟
LPC_WDT->WDTTC = 0x000000FF; // 设置看门狗定时器计数器值
// 启动看门狗定时器
LPC_WDT->WDTFEED = 0xAA; // 喂狗
LPC_WDT->WDTFEED = 0x55; // 喂狗
}
// 主函数
int main(void) {
// 初始化看门狗定时器
WDT_Config();
while (1) {
// 正常运行的代码
// 每次循环中喂狗
LPC_WDT->WDTFEED = 0xAA;
LPC_WDT->WDTFEED = 0x55;
// 模拟正常运行
for (int i = 0; i < 1000000; i++) {
// 空循环
}
}
return 0;
}
代码说明:
WDTMOD
寄存器用于设置看门狗模式和时钟源。WDTTC
寄存器用于设置看门狗定时器的计数器值。WDTFEED
寄存器用于喂狗,防止看门狗定时器超时复位系统。
11.1.2 电源保护
电源保护机制用于确保系统在电源电压不稳定时能够正常工作。LPC1100 系列单片机支持低电压检测(LVD)和低电压复位(LVR)功能。
- 低电压检测(LVD):当电源电压低于设定的阈值时,LVD 电路会触发中断或标志位,通知系统电压异常。
- 低电压复位(LVR):当电源电压低于设定的阈值时,LVR 电路会自动触发系统复位。
代码示例:配置低电压检测
#include "LPC11xx.h"
// 配置低电压检测
void LVD_Config(void) {
// 使能低电压检测
LPC_SYSCON->PDRUNCFG &= ~(1 << 8); // 使能 LVD
// 设置低电压检测阈值
LPC_SYSCON->LVDCTRL = 0x00000007; // 设置阈值为 2.35V
// 使能 LVD 中断
LPC_SYSCON->LVDSTAT |= (1 << 2); // 使能 LVD 中断
}
// LVD 中断处理函数
void LVD_IRQHandler(void) {
if (LPC_SYSCON->LVDSTAT & (1 << 0)) {
// 电压低于阈值,处理相应操作
LPC_SYSCON->LVDSTAT = (1 << 0); // 清除中断标志
}
}
// 主函数
int main(void) {
// 初始化低电压检测
LVD_Config();
// 使能全局中断
__enable_irq();
while (1) {
// 正常运行的代码
}
return 0;
}
代码说明:
PDRUNCFG
寄存器用于控制 LVD 的使能状态。LVDCTRL
寄存器用于设置低电压检测的阈值。LVDSTAT
寄存器用于读取和清除 LVD 中断标志。LVD_IRQHandler
函数是 LVD 中断处理函数,用于处理低电压检测事件。
11.1.3 时钟监控
时钟监控机制用于确保系统时钟的稳定性和正确性。LPC1100 系列单片机支持系统时钟监控和外部时钟监控功能。
- 系统时钟监控:当系统时钟频率超出设定范围时,系统时钟监控电路会触发中断或标志位,通知系统时钟异常。
- 外部时钟监控:当外部时钟源(如晶振)发生故障时,外部时钟监控电路会触发中断或标志位,通知系统时钟源异常。
代码示例:配置系统时钟监控
#include "LPC11xx.h"
// 配置系统时钟监控
void SysClockMonitor_Config(void) {
// 使能系统时钟监控
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 29); // 使能 SYSCON 时钟
// 设置系统时钟监控阈值
LPC_SYSCON->SYSOSCCTRL = (1 << 6); // 使能系统时钟监控
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 28); // 使能系统时钟监控时钟
// 使能系统时钟监控中断
LPC_SYSCON->SYSPLLCTRL |= (1 << 1); // 使能系统时钟监控中断
}
// 系统时钟监控中断处理函数
void SysClockMonitor_IRQHandler(void) {
if (LPC_SYSCON->SYSPLLSTAT & (1 << 1)) {
// 时钟频率超出设定范围,处理相应操作
LPC_SYSCON->SYSPLLSTAT = (1 << 1); // 清除中断标志
}
}
// 主函数
int main(void) {
// 初始化系统时钟监控
SysClockMonitor_Config();
// 使能全局中断
__enable_irq();
while (1) {
// 正常运行的代码
}
return 0;
}
代码说明:
SYSAHBCLKCTRL
寄存器用于控制系统时钟和监控时钟的使能状态。SYSOSCCTRL
寄存器用于设置系统时钟监控的阈值。SYSPLLCTRL
寄存器用于使能系统时钟监控中断。SYSPLLSTAT
寄存器用于读取和清除系统时钟监控中断标志。SysClockMonitor_IRQHandler
函数是系统时钟监控中断处理函数,用于处理时钟频率异常事件。
11.1.4 存储器保护
存储器保护机制用于防止非法访问存储器,确保系统的数据安全。LPC1100 系列单片机支持存储器保护单元(MPU),可以配置不同区域的访问权限。
- 存储器保护单元(MPU):通过配置 MPU,可以设置不同存储器区域的访问权限,包括读、写、执行权限等。
代码示例:配置存储器保护单元
#include "LPC11xx.h"
// 配置存储器保护单元
void MPU_Config(void) {
// 使能 MPU
LPC_MPU->CTRL = 0x00000001; // 使能 MPU
// 配置存储器区域 0
LPC_MPU->RNR = 0; // 选择区域 0
LPC_MPU->RBAR = 0x20000000; // 设置区域基地址
LPC_MPU->RASR = (1 << 16) | (1 << 15) | (1 << 14) | (1 << 8) | (1 << 7) | (1 << 6); // 设置区域大小和权限
// 1 << 16: 使能区域
// 1 << 15: 访问权限为只读
// 1 << 14: 访问权限为只执行
// 1 << 8: 区域大小为 64KB
// 1 << 7: 区域大小为 32KB
// 1 << 6: 区域大小为 16KB
// 配置存储器区域 1
LPC_MPU->RNR = 1; // 选择区域 1
LPC_MPU->RBAR = 0x20010000; // 设置区域基地址
LPC_MPU->RASR = (1 << 16) | (1 << 15) | (1 << 14) | (1 << 8) | (1 << 7) | (1 << 6); // 设置区域大小和权限
}
// 主函数
int main(void) {
// 初始化存储器保护单元
MPU_Config();
while (1) {
// 正常运行的代码
}
return 0;
}
代码说明:
LPC_MPU->CTRL
寄存器用于使能 MPU。LPC_MPU->RNR
寄存器用于选择要配置的存储器区域。LPC_MPU->RBAR
寄存器用于设置存储器区域的基地址。LPC_MPU->RASR
寄存器用于设置存储器区域的大小和访问权限。
11.2 软件保护机制
软件保护机制用于防止软件错误或恶意攻击导致的系统故障。LPC1100 系列单片机支持多种软件保护机制,包括软件复位、故障处理和代码保护等。
11.2.1 软件复位
软件复位通过软件指令触发系统复位,用于在软件检测到严重错误时恢复系统。LPC1100 系列单片机支持通过 NVIC 系统控制寄存器触发复位。
代码示例:触发软件复位
#include "LPC11xx.h"
// 触发软件复位
void SoftwareReset(void) {
// 触发系统复位
NVIC_SystemReset();
}
// 主函数
int main(void) {
while (1) {
// 模拟检测到严重错误
if (/* 检测到严重错误 */) {
// 触发软件复位
SoftwareReset();
}
// 正常运行的代码
}
return 0;
}
代码说明:
NVIC_SystemReset
函数用于触发系统复位。
11.2.2 故障处理
故障处理机制用于检测和处理系统中的故障。LPC1100 系列单片机支持硬件故障处理和软件故障处理。
- 硬件故障处理:包括总线故障(Bus Fault)、使用故障(Usage Fault)和存储器管理故障(Memory Management Fault)等。
- 软件故障处理:通过自定义故障处理函数,可以在检测到故障时执行相应的处理逻辑。
代码示例:配置故障处理
#include "LPC11xx.h"
// 总线故障处理函数
void BusFault_Handler(void) {
// 处理总线故障
while (1) {
// 持续处理或等待复位
}
}
// 使用故障处理函数
void UsageFault_Handler(void) {
// 处理使用故障
while (1) {
// 持续处理或等待复位
}
}
// 存储器管理故障处理函数
void MemManage_Handler(void) {
// 处理存储器管理故障
while (1) {
// 持续处理或等待复位
}
}
// 主函数
int main(void) {
// 使能全局中断
__enable_irq();
while (1) {
// 正常运行的代码
}
return 0;
}
代码说明:
BusFault_Handler
函数用于处理总线故障。UsageFault_Handler
函数用于处理使用故障。MemManage_Handler
函数用于处理存储器管理故障。
11.2.3 代码保护
代码保护机制用于防止代码被非法读取或修改。LPC1100 系列单片机支持通过编程闪存保护寄存器实现代码保护。
- 闪存保护寄存器:通过配置闪存保护寄存器,可以设置闪存区域的读写保护。
代码示例:配置闪存保护
#include "LPC11xx.h"
// 配置闪存保护
void FlashProtect_Config(void) {
// 使能闪存保护
LPC_FLASH->FLASHPROT = 0x00000001; // 使能闪存保护
// 设置保护区域
LPC_FLASH->FLASHSEC = 0x000000FF; // 保护所有 16 个扇区
}
// 主函数
int main(void) {
// 初始化闪存保护
FlashProtect_Config();
while (1) {
// 正常运行的代码
}
return 0;
}
代码说明:
LPC_FLASH->FLASHPROT
寄存器用于使能闪存保护。LPC_FLASH->FLASHSEC
寄存器用于设置闪存保护区域。
11.3 安全与保护机制的综合应用
在实际应用中,安全与保护机制的综合应用可以显著提高系统的可靠性和安全性。通过合理配置硬件和软件保护机制,可以有效防止系统在异常情况下发生故障。
代码示例:综合应用安全与保护机制
#include "LPC11xx.h"
// 配置看门狗定时器
void WDT_Config(void) {
// 使能看门狗定时器
LPC_WDT->WDTMOD = 0x00000003; // 模式选择:定时器模式,允许时钟
LPC_WDT->WDTTC = 0x000000FF; // 设置看门狗定时器计数器值
// 启动看门狗定时器
LPC_WDT->WDTFEED = 0xAA; // 喂狗
LPC_WDT->WDTFEED = 0x55; // 喂狗
}
// 配置低电压检测
void LVD_Config(void) {
// 使能低电压检测
LPC_SYSCON->PDRUNCFG &= ~(1 << 8); // 使能 LVD
// 设置低电压检测阈值
LPC_SYSCON->LVDCTRL = 0x00000007; // 设置阈值为 2.35V
// 使能 LVD 中断
LPC_SYSCON->LVDSTAT |= (1 << 2); // 使能 LVD 中断
}
// 配置系统时钟监控
void SysClockMonitor_Config(void) {
// 使能系统时钟监控
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 29); // 使能 SYSCON 时钟
// 设置系统时钟监控阈值
LPC_SYSCON->SYSOSCCTRL = (1 << 6); // 使能系统时钟监控
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 28); // 使能系统时钟监控时钟
// 使能系统时钟监控中断
LPC_SYSCON->SYSPLLCTRL |= (1 << 1); // 使能系统时钟监控中断
}
// 配置存储器保护单元
void MPU_Config(void) {
// 使能 MPU
LPC_MPU->CTRL = 0x00000001; // 使能 MPU
// 配置存储器区域 0
LPC_MPU->RNR = 0; // 选择区域 0
LPC_MPU->RBAR = 0x20000000; // 设置区域基地址
LPC_MPU->RASR = (1 << 16) | (1 << 15) | (1 << 14) | (1 << 8) | (1 << 7) | (1 << 6); // 设置区域大小和权限
// 配置存储器区域 1
LPC_MPU->RNR = 1; // 选择区域 1
LPC_MPU->RBAR = 0x20010000; // 设置区域