647|0

17

帖子

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/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表