【得捷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,串口助手显示如下:
可以看见开发板十分准确地每秒打印了当前频率
功能实现
(完)
|