617|0

18

帖子

6

TA的资源

一粒金砂(中级)

楼主
 

【得捷Follow me第4期】(补充)网络控制STM32从机、实现简易频率计功能 [复制链接]

  本帖最后由 QuaX_Chow 于 2024-3-30 21:21 编辑

2024.3.30

本篇是Follow Me第四期任务提交的补充内容

 

分两个部分:网络控制STM32从机、实现简易频率计功能

 

1.网络控制从机

 

电脑上由网络调试助手使用TCP向W5500-EVB-Pico发送指令,再由W5500-EVB-Pico通过串口,向从机发送我们在从机设定好的指令,这样从机即可进行对应操作

 

框架示意图如下:
 

经查阅手册,从机主控F407的USART3为PB10和PB11:

 

 

连接即可:

 

 

对应在W5500-EVB-PICO上如下所示:

 

 

这里我们需要使用stlink给从机下载代码。
最终实物连接图如下:
 

 

功能实现代码如下:

 

from usocket import socket
from machine import Pin, SPI, UART
import network
import time

# 初始化UART
uart = UART(0, baudrate=115200, bits=8, stop=1)

# 初始化WIZNET5K以太网模块
def w5x00_init():
    spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
    nic = network.WIZNET5K(spi, Pin(17), Pin(20))  # spi, cs, reset引脚
    nic.active(True)

    nic.ifconfig(('192.168.137.100', '255.255.255.0', '192.168.137.1', '8.8.8.8'))

    print('IP地址:', nic.ifconfig())
    while not nic.isconnected():
        time.sleep(1)

# 服务器循环
def server_loop():
    s = socket()
    s.bind(('192.168.137.100', 5050))
    s.listen(5)

    conn, addr = s.accept()
    print("已连接到:", conn, "地址:", addr)
    print("服务器已开启")
    while True:
        data = conn.recv(2048)
        print("发送: ", data.decode('utf-8'), " 给从机")
        if data != b'NULL':
            uart.write(data)

# 客户端循环
def client_loop():
    s = socket()
    s.connect(('192.168.137.114', 5050))

    print("循环客户端已连接!")
    while True:
        data = s.recv(2048)
        print(data.decode('utf-8'))
        if data != b'NULL':
            s.send(data)

def main():
    w5x00_init()

    while True:
        server_loop()

if __name__ == "__main__":
    main()

 

通过输入1~4四个数字,即可控制对应led的状态:

 

 

2.实现简易频率计功能

 

模块:MCU与AK5522使用IIS通信,AK5522读取到阈值高电平,模块串口打印一次“1”

这里需要开启双核,一个核用于定时,一个计数

 

框架示意图如下:

 

 

W5500-EVB-Pico通过串口👇直接读取AK5522模块发送的数据

 

 

模块的部分原理图如下:

 

 

功能实现代码如下:

from usocket import socket
from machine import Pin, UART
import time
import _thread

# 初始化UART1和UART0
uart1 = UART(1, baudrate=115200, bits=8, stop=1)
uart0 = UART(0, baudrate=115200, bits=8, stop=1)

# 初始化计数器
count = 0

# Core 0的线程函数,用于接收数据并计算1的数量
def receive_and_count():
    global count
    while True:
        if uart1.any():
            data = uart1.read(64)  # 读取UART1接收到的数据
            count += data.count(b'1')
        time.sleep(1)  # 每秒计算一次1的数量

# Core 1的线程函数,用于打印1的数量
def print_count():
    while True:
        uart0.write('FRE: {}\n'.format(count))
        time.sleep(1)  # 每秒打印一次计数结果

# 启动Core 0的线程
_thread.start_new_thread(receive_and_count, ())

# 在Core 1上运行打印1的数量的代码
print_count()

 

,用补充1的F407开发板输出1KHz的PWM,串口助手显示如下:

 

 

可以看见开发板十分准确地每秒打印了当前频率

 

功能实现

 

(完)

点赞 关注
个人签名

github.com/Amanitaphalloide

 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表