stm32f407使用BACnet与上位机通讯笔记

发布时间:2024年01月10日

一、硬件设计

原理图一览

1.1 主控电路

主控采用 STM32F407VET6 为其配置了两颗高速/低速晶振,以及基本的 PA6 和 PA7 指示灯。

我们使用 PA10 和 PA9 作为 485 通讯串口,使用 PC0 作为485芯片手法控制口。

1.2 电源电路

电源一览

1.2.1?防反接和过压保护电路

在供电端口我们设置了两个二极管起到防反接作用,同时使用了一个瞬态抑制二极管 SMBJ12A 保护电路。

1.2.2?12V 转 5V 电路

根据芯片手册直接配置出合适的电路即可。?

1.2.3?5V 线性稳压电路

1.3 485 通讯电路

在左侧 CN14 端口我们仍可以使用 usb转串口工具直接读取 UART1 的串口数据,在右侧 CN16 则通过 485 芯片转成 485 信号。在 485 芯片上的 485AA 引脚则可以配置输出或输入。

二、软件设计

2.1 获得 stm32?BACnet-mstp 软件包

在?BACnet stack - open source BAz?官网中,提供了stm32 的官方案例,我们将其移植到 stm32407 即可成功配置 BACnet-mstp 软件层。

下方连接即可下载案例:

p/bacnet/code - Revision 3232: /trunk/bacnet-stack/ports/stm32f10x

2.2 框架基本概念了解

?在这里是初始化 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); */
                }
            }
        }
    }

2.3 使用 Yabe 上位机控制

选择端口,连接成功后修改 out of?service 即可控制灯的亮灭了。

?

?

文章来源:https://blog.csdn.net/nullccc/article/details/135494762
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。