原理图一览
主控采用 STM32F407VET6 为其配置了两颗高速/低速晶振,以及基本的 PA6 和 PA7 指示灯。
我们使用 PA10 和 PA9 作为 485 通讯串口,使用 PC0 作为485芯片手法控制口。
电源一览
在供电端口我们设置了两个二极管起到防反接作用,同时使用了一个瞬态抑制二极管 SMBJ12A 保护电路。
根据芯片手册直接配置出合适的电路即可。?
在左侧 CN14 端口我们仍可以使用 usb转串口工具直接读取 UART1 的串口数据,在右侧 CN16 则通过 485 芯片转成 485 信号。在 485 芯片上的 485AA 引脚则可以配置输出或输入。
在?BACnet stack - open source BAz?官网中,提供了stm32 的官方案例,我们将其移植到 stm32407 即可成功配置 BACnet-mstp 软件层。
下方连接即可下载案例:
p/bacnet/code - Revision 3232: /trunk/bacnet-stack/ports/stm32f10x
?在这里是初始化 binary_output 的实例,对于下侧的 for循环,MAX_BINARY_OUTPUTS 宏定义为 2。则意味着我们会创建两个?binary_output 对象。此时创建成功后即可操作?binary_output 对象,我们便可以与之交互通讯了。
?初始化后,来看看逻辑处理部分,goto 这个函数:
?进入如下,bacnet_task 即可帮我们处理逻辑部分。
?最值得关注的是这一部分,他帮我们出来在上面创建两个?Binary Output 的逻辑。
首先,它检查特定二进制输出是否处于"Out of Service"状态。如果不是,它会获取当前的二进制数值和极性,并根据极性进行相应的处理。如果极性不是正常极性,它会切换二进制值。然后,根据二进制值,它会控制相应的GPIO引脚,以及可能控制LED灯的开关状态。
最重要的是下面三个函数。
Binary_Output_Out_Of_Service(i); //检查特定二进制输出是否处于"Out of Service"状态
Binary_Output_Present_Value(i); //判断极性
Binary_Output_Polarity(i); //获值
/* Binary Output */
for (i = 0; i < MAX_BINARY_OUTPUTS; i++) {
out_of_service = Binary_Output_Out_Of_Service(i); //检查特定二进制输出是否处于"Out of Service"状态
if (!out_of_service) { //如果不是继续
binary_value = Binary_Output_Present_Value(i); //判断极性
polarity = Binary_Output_Polarity(i); //获值
if (polarity != POLARITY_NORMAL) {
if (binary_value == BINARY_ACTIVE) {
binary_value = BINARY_INACTIVE;
} else {
binary_value = BINARY_ACTIVE;
}
}
if (binary_value == BINARY_ACTIVE) {
if (i == 0) {
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
/* led_on(LED_2); */
} else {
GPIO_SetBits(GPIOB, GPIO_Pin_5);
/* led_on(LED_3); */
}
} else {
if (i == 0) {
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
/* led_off(LED_2); */
} else {
GPIO_SetBits(GPIOB, GPIO_Pin_5);
/* led_off(LED_3); */
}
}
}
}
选择端口,连接成功后修改 out of?service 即可控制灯的亮灭了。
?
?