ICU
模块依赖:ICU port
ICU:Input Capture Unit,输入捕获单元。主要有以下功能:
边缘计数
边缘检测和通知
时间戳
信号测量
作为唤醒源使用
我们配置一个边沿检测和通知功能的ICU通道,下降沿检测,可以作为元器件的电压检测,即供电由高电平跳转为低电平时,触发我们的ICU通道的中断,可以在中断通知函数里去做响应的处理(关断部分功能做保护),当然如果只是做高低电平的检测,完全可以通过Dio channel1去读取,但是DIO channel读取后再做响应,对于一些实时性要求很高的元器件,很可能是无效的,即在响应之前,元器件已损坏,而ICU通道进行检测和通知,能满足较高的实时性要求
在ICU下新建一个channel,双击进入配置项
IcuDefaultStartEdge配置为falling edge,其余先不管
接下来我们在PORT下配置一个SIUL_EIRQ类型的通道,如下
返回ICU,在该选项卡下新增一个配置项
双击进入,在IcuSiul2Channels下新增一个通道,双击进入,配置如下
然后在这里去使能我们的通道的中断
然后回到ICU channel的配置界面做如下配置
Channel ref选择我们各个配置的siul通道即可;
Icu messurement mode设置为SIGNAL_EDGE_DETECT;
Icusignal Edge detection功能打开;
配置中断通知函数为current_falling_detect (该函数名自拟即可)
回到general界面,IcuMAXchannel填入1,配了几个通道就填几
剩余API勾选如下
ICU函数调用
打开Suil2_Icu_Ip_Irq.c,查看SIUL2_ICU_IRQ_CH_3_ISR_USED定义在哪一个中断下,查找到其定义在SIUL2_EXT_IRQ_0_7_ISR,在platform初始化完成后,安装中断如下
Platform_InstallIrqHandler(SIUL_0_IRQn,&SIUL2_EXT_IRQ_24_31_ISR, NULL_PTR);
在主函数中,此ICU相关的函数或指令调用如下:
extern ISR(SIUL2_EXT_IRQ_0_7_ISR);
void current_falling_detect(void);
void current_falling_detect(void)
{
//function_forbiden;
}
int main()
{
//init
//....
Platform_Init(NULL_PTR);
Platform_InstallIrqHandler(SIUL_0_IRQn,&SIUL2_EXT_IRQ_24_31_ISR, NULL_PTR);
//.....
//....
}
我们可以在current_falling_detect中做相关的功能禁止,保护元器件