如何实现这一构想?
那么要如何何将这一切兜到一起呢?经过几个晚上通宵达旦的工作后,我们总算让它相当漂亮地整合在一起了!
这款神秘盒设计的心脏采用了德州仪器(TI)的LM3S811评估套件。这款工具套件十分便宜、体积小,电路板上还为每个可用的I/O接脚设置0.1吋间距的接脚垫,每一个接脚也都明确标示其周边功能。PCB板上还直接建置一个JTAG编程器/除错器。
韧体开发采用StellarisWare周边驱动程式工具库,以利用微控制器(MCU)上的每个周边与系统控制功能。对于大部份的生产应用而言,由于不一定能够负担经常性的开销,因此,工具库的使用是一个快速开始着手建置以及为基本功能进行原型处理的最佳方法。透过测试板,已知的有效周边驱动程式库也意味着不必担心MCU配置或周边互动时的错误,让我们能够更专注于手边的问题。
以下摘录用于设置时间以及实现所需周边功能的“mcu_init()”函数。我们只需要几个简单的函数,就可以完成任务开始运作了。
//initialize system clock to 50Mhz and use the external oscillator
SysCtlClockSet(SYSCTL_SYSDIV_4 |
SYSCTL_USE_PLL |
SYSCTL_XTAL_6MHZ |
SYSCTL_OSC_MAIN); //reset peripherals
SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOD); SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOE); SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0); //default configuration: MCU will not enter sleep modes SysCtlPeripheralClockGating(false); //enable peripherals
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
驱动程序库的简便性说明了Stellaris系列MCU更广泛的设计理念。在读过LM3S811数据表后,我们清楚地了解到MCU的设计是以简化易用(如降低NRE)为目标。其中一例是周边接脚功能透过一个GPIO可实现多工应用的事实。这样一来,就不再需要严密划分周边功能,而且可清楚知道MCU系列中的某个元件可实现什么样的功能性。另一个例子是一组预先设定的可用石英晶体振荡器频率。限制一组固定的频率数一开始可能感到绑手绑脚,但这些频率数与常见的晶体振荡器一致,因而大幅简化了时脉设置。最终的结果如何呢?快速地启动、执行并完成C程式码编写,而不是被令人沮丧的C程式码所阻。
回过头来看看我们的的神秘盒子。七段显示面板以手动布线连接到一个控制器IC。继电器和蜂鸣器透过一组8输入Darlington电晶体阵列来进行切换。这些阵列可用于进行高电流GPIO缓冲,甚至还内建保护二极体来因应电感负载!灯泡部份则由手动布线直接连到两个继电器输出之一。
这整个机关装置在单身派对活动开始的当天上午就以手动布线完成了,先前在堆叠电子元件时也已逐步完成软体测试。最后,使用两块原型板,并以带线缆直接连接到MCU评估板,以确保一切干净俐落。所有的电子元件来源均采用0.100吋间距(通常是DIP),以确保适合所用的原型板。该原型板本身也采用双面电镀,以减少布线作业。禁锢箱的门锁采用气体力学原理,而神秘盒的外表则同时采用软体与电子元件共同开发而成。
等到为七段显示驱动时序问题进行除错后,软体就能整合地相当好了。基本的程式流程非常简单,程式逻辑采用轮询回圈建置,以确保事情更简单并避免难以发现错误。透过轮询高低层按钮/辅助输入以进行边缘检测。