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

一、硬件设计

原理图一览

stm32f407使用BACnet与上位机通讯笔记_第1张图片

1.1 主控电路

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

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

stm32f407使用BACnet与上位机通讯笔记_第2张图片

1.2 电源电路

电源一览

stm32f407使用BACnet与上位机通讯笔记_第3张图片

1.2.1 防反接和过压保护电路

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

stm32f407使用BACnet与上位机通讯笔记_第4张图片

1.2.2 12V 转 5V 电路

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

stm32f407使用BACnet与上位机通讯笔记_第5张图片

stm32f407使用BACnet与上位机通讯笔记_第6张图片

1.2.3 5V 线性稳压电路

stm32f407使用BACnet与上位机通讯笔记_第7张图片

1.3 485 通讯电路

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

stm32f407使用BACnet与上位机通讯笔记_第8张图片

二、软件设计

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 对象,我们便可以与之交互通讯了。

stm32f407使用BACnet与上位机通讯笔记_第9张图片

 初始化后,来看看逻辑处理部分,goto 这个函数:

stm32f407使用BACnet与上位机通讯笔记_第10张图片

 进入如下,bacnet_task 即可帮我们处理逻辑部分。

stm32f407使用BACnet与上位机通讯笔记_第11张图片

 最值得关注的是这一部分,他帮我们出来在上面创建两个 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 即可控制灯的亮灭了。

stm32f407使用BACnet与上位机通讯笔记_第12张图片

 

 

你可能感兴趣的:(stm32,笔记,嵌入式硬件)