4) 使能模拟/数字LVD电路
设置RESET_CR1寄存器的bit[1:0]为1,置RESET_CR1[1]=1使能模拟LVD中断,置RESET_CR1[0]=1使能数字LVD中断。
5) 等待LVD毛刺产生
读取RESET_SR0寄存器的bit[1:0]直到读到的数字为0。
6) 设置低电压阀值
低电压阀值在RESET_CR0寄存器中设置,其值与对应的低电压如下表一所示。注意模拟电压阀值设置RESET_CR0[7:4],数字电压阀值设置RESET_CR0[3:0]。
表一:RESET_CR0值与电压对应关系
7) 选择中断向量0为“Fixed Function”
设置IDMUX_IRQ_CTL0的bit[1:0]位为2’b00。
IDMUX_IRQ_CTL寄存器用来为特定的中断向量选择中断源,每一个中断向量可以被特定固定功能模块触发,可被DMA触发,也可被UDB(电平或边沿)触发。中断向量0的固定功能源是LVD中断,如下表二所示:
表二:中断向量与中断源的对应关系
8) 设置中断服务子程序地址并指向中断向量0
将地址“address_foo”赋给中断向量寄存器INTC_VECT0,在PSoC3中使用CY_SET_REG16()来赋值。
9) 设置中优先级(可选)
配置INTC_PRIOR0寄存器的bits[7:5]来设定优先级,缺省值为0。
10) 使能中断向量0
设置INTC_SET_EN0寄存器的bit[0]为1。
11) 使能中断总开关,通过调用CyGlobalIntEnable宏。
根据上述步骤在PSoC Creator中实现代码如下:
uint8 temp;
// 1.) declare an interrupt. address is stored into "blarf"
CY_ISR(blarf) //
{
// Test is a pin connected to an LED
Test_Write(1);
// clear the sticky bits
temp = (* (reg8 *) CYREG_RESET_SR0);
}
void main()
{
// 2.) enable the clock to the interrupt controller
CY_SET_REG8(CYDEV_INTC_CSR_EN, 0x01);
// 3.) make sure the LVIs are not set as a reset source
(* (reg8 *) CYREG_RESET_CR3) = 0x00;
// 4.) enable the LVI-A/D circuits
(* (reg8 *) CYREG_RESET_CR1) |= 0x03;
// 5.) the LVIs glitch while being enabled, read them to clear the glitch