当给继电器线圈供电时,控制蜂鸣器的io口有时候无法正确开关。不给继电器线圈供电,就没问题。
进一步测试发现不是干扰问题,是程序方面的问题。1601的所有gpio口共用同一个输出控制寄存器,在中断中有写gpio口的操作,sdk的接口函数也没有做任何针对性处理,导致
写寄存器冲突。在gpio口接口函数中加入临界区保护机制,问题解决。
代码如下:
void DRV_Gpio_ValSet(uint32_t pins_mask, bool is_one)
{
ndis_enter_critical();//临界区保护机制
if(is_one)
IOMUX.GPIO.reg |= pins_mask;
else
IOMUX.GPIO.reg &= ~pins_mask;
ndis_exit_critical();
}