
本帖最后由 源地1号 于 2019-6-24 22:46 编辑 netPYB快速入门 该板子是在pyboard(PYB)标准板基础之上加入了W5500以太网控制芯片,重新魔改mpy系统底层程序,它可以提供稳定可靠的互联网接入,轻松实现物联网应用,我们为该板子起名为netPYB.今天我在此发帖看看,发一次帖子能不能将netPYB所有的基本编程功能和主要功能讲完,当然是用Python语言,可以给经常用C语言编程的小伙伴们提供一下另一套思路,高效编程,快速开发还是Python, 人生苦短,快用Python 硬件方面:STM32F405RGT6也就是PYB标准版的最小系统的硬件电路,以太网使用的W5500控制芯片,板载MM7660加速度芯片,RTC后备电池座,用户按键,复位按键及进入dfu模式的BOOT0按键,USB口可以实现USB通讯,生成类似优盘,轻松打开用户编程文件,进行用户程序的编写,USB接口同时生成虚拟串口,用于REPL调试及程序信息打印,TF卡座可以挂载外部TF卡由于存放海量的用户程序和用户数据。 编程方面:推荐使用Python语言,简单高效,快速应用。这里的Python指的是mpy(MicroPython这个单词缩写,初学者可以完全当做Python,懂Python可以当做阉割版的Python,鉴于该单词的商标争议和这个单词确实太长了不好键入,我们下文和以后就是用mpy来代替这个单词,请大家多多谅解,避免商标投诉),如果我们文章和学习资料中提到了μPython或者uPython大家自动地等效为mpy。 netPYB与Arduino UNO区别该学习板一个大特点,或许大家已经看到了,没错,外形像极了,Ardxxxx UNO开发板(很火的那个电子入门的板子,意大利同行开发的风靡一时的板子)。 先说一下它们的共同点吧! netPYB在机械结构尺寸,电平信号输入标准,引脚标号,引脚功能对应上完全兼容Ardxxxx UNO,也就说Ardxxxx UNO所有外设板子(外接模块)都可以拿来在这个板子上用。 不同点:
哎~~说这么多就这个理由也值得一学,这板子可以学习Python。 在可预见的未来: 儿童编程启蒙用Python 少年编程用Python 高考考试很可能考Python 服务器维护可以用Python 网络应用可以用Python 人工智能用Python 程序猿防脱发用Python 程序猿嫌命短改行用Python 程序猿节省时间找媳妇用Python 人生苦短用Python。 netPYB板推荐使用Python编程学习,别以为玩转咱的netPYB板子,只是入门了电路硬件,很可能你收获的是学会了Python,从此你将走向人生巅峰。 python是一种解释性语言,如果将板子内部植入了Mircropython系统,也就意味着将python语言的解释器,植入到了STM32芯片内,这样用户程序就不像C语言那样,在芯片外编译,链接了,这就意味着,Pyboard使用的python程序,不需要像C语言那样需要复杂的IDE了,理论上讲,windows自带的记事本软件就可以了,不过记事本这样的软件,无法提供关键词高亮,提示,格式的对齐也是挺不直观的,显的十分LOW,我推荐用户使用专业的程序编辑软件,如果你有高级语言使用基础,大型的高级语言开发工具一般都支持Python语言,继续用就行,如果用户没有编程基础或者只是想入门编程,我推荐使用Sublime Text 下载 # @Time : 2019/06/23 # @Author : WU HENG 源地工作室 # @File : main.py# @程序原理:netPYB通过使用W5500进行网络通讯,netPYB角色是客户端,pc端使用TCP/UDP调试工具 # 角色是服务器端。 # @外设模块: # @接线引脚:netPYB占用SPI1,CS使用X5(PYB),RST使用Y11 # @实验现象:PC端的服务端会收到hello world,按板子上的USR按键会收到bye world # @实验注意:netPYB是使用了改造的固件,标准版的PYB是不能使用network SOCKET功能的需要加载相应的固件 # @硬件购买:netPYB购买某宝搜索netPYB或者upython或者源地工作室 import network import pyb #板载驱动库 import socket #网络通信协议库 nic = network.WIZNET5K(pyb.SPI(1),pyb.Pin.board.X5,pyb.Pin.board.Y11) #W5500初始化nic.ifconfig(('192.168.1.145','255.255.255.0','192.168.1.1','8.8.8.8')) #设置开发板的网络属性 print(nic.ifconfig()) #打印一下是否设置好 s=socket.socket() #创建socket对象 addr=('192.168.1.151',1234) #设置服务器的ip地址和端口号 s.connect(addr) #连接服务器 pyb.delay(500) s.send("hello world!") #连接成功以后,向服务器发送hello world,如果服务器收到表示实验成功 pyb.Switch().callback(lambda:s.send("bye world!")) #按键中断发送一段话网络基本功能实验测试 测试一下在同一局域网内通讯,程序稍加改动就可以接入广域网,上云服务器,或者实现其他的物联应用,这里我们进行最简单的实验,电脑上使用TCP&UDP调试软件,创建一个服务器启动并等待客户端的接入 ![]()
![]()
![]() 基本功能测试示例 由于netPYB是从标准板PYB改造而来,自然PYB大部分程序是兼容的,在功能示意图中有硬件引脚对应表,使用哪一种标号都是可以的。下面是官网的基本功能应用,可以对比一下C语言代码,保守估计,代码量是C语言的十分之一吧! import pybpyb.repl_uart(pyb.UART(1, 9600)) # duplicate REPL on UART(1) pyb.wfi() # pause CPU, waiting for interrupt pyb.freq() # get CPU and bus frequencies pyb.freq(60000000) # set CPU freq to 60MHz pyb.stop() # stop CPU, waiting for external interrupt 延时和定时 import time time.sleep(1) # sleep for 1 second time.sleep_ms(500) # sleep for 500 milliseconds time.sleep_us(10) # sleep for 10 microseconds start = time.ticks_ms() # get value of millisecond counter delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference 板载LED控制 from pyb import LED led = LED(1) # 1=red, 2=green, 3=yellow, 4=blue led.toggle() led.on() led.off()# LEDs 3 and 4 support PWM intensity (0-255) LED(4).intensity() # get intensity LED(4).intensity(128) # set intensity to half 板子用户按键 from pyb import Switch sw = Switch() sw.value() # returns True or False sw.callback(lambda: pyb.LED(1).toggle()) 引脚和通用输入输出引脚控制 from pyb import Pin p_out = Pin('X1', Pin.OUT_PP) p_out.high() p_out.low() p_in = Pin('X2', Pin.IN, Pin.PULL_UP) p_in.value() # get value, 0 or 1 舵机控制 from pyb import Servo s1 = Servo(1) # servo on position 1 (X1, VIN, GND) s1.angle(45) # move to 45 degrees s1.angle(-60, 1500) # move to -60 degrees in 1500ms s1.speed(50) # for continuous rotation servos 外部中断 from pyb import Pin, ExtInt callback = lambda e: print("intr") ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback) 定时器 from pyb import Timer tim = Timer(1, freq=1000) tim.counter() # get counter valuetim.freq(0.5) # 0.5 Hz tim.callback(lambda t: pyb.LED(1).toggle()) RTC (实时时钟) from pyb import RTC rtc = RTC() rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time rtc.datetime() # get date and time PWM (脉宽调制输出) from pyb import Pin, Timer p = Pin('X1') # X1 has TIM2, CH1 tim = Timer(2, freq=1000) ch = tim.channel(1, Timer.PWM, pin=p) ch.pulse_width_percent(50) ADC (模数转换) from pyb import Pin, ADC adc = ADC(Pin('X19')) adc.read() # read value, 0-4095 UART (串口) from pyb import UART uart = UART(1, 9600) uart.write('hello') uart.read(5) # read up to 5 bytes SPI 总线 from pyb import SPI spi = SPI(1, SPI.MASTER, baudrate=200000, polarity=1, phase=0) spi.send('hello')spi.recv(5) # receive 5 bytes on the bus spi.send_recv('hello') # send and receive 5 bytes I2C 总线 from pyb import I2C i2c = I2C(1, I2C.MASTER, baudrate=100000) i2c.scan() # returns list of slave addresses i2c.send('hello', 0x42) # send 5 bytes to slave with address 0x42 i2c.recv(5, 0x42) # receive 5 bytes from slave i2c.mem_read(2, 0x42, 0x10) # read 2 bytes from slave 0x42, slave memory 0x10 i2c.mem_write('xy', 0x42, 0x10) # write 2 bytes to slave 0x42, slave memory 0x10 CAN 总线 from pyb import CAN can = CAN(1, CAN.LOOPBACK) can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126)) can.send('message!', 123) # send a message with id 123 can.recv(0) # receive message on FIFO 0 板载加速度传感器from pyb import Accel accel = Accel()print(accel.x(), accel.y(), accel.z(), accel.tilt()) |
netPYBv1.1åçå¾.rar
下载1.02 MB, 下载次数: 15
其实我想问一下最基本的串口中断处理怎么弄,比如我主任务运行一套循环动作,接收到串口中断协议数据,怎么把接收到的一串数据搬运到指定缓冲区?能够简单写一段实现上述功能的示例代码最好了。
UART (串口)
from pyb import UART
uart = UART(1, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes
uart.read(5)这段话意思是从缓冲区读取5个bytes 可能没有中断触发的及时但是 串口传进来数据被缓冲待用,应该有好的办法能处理暂时没有想到,还一个办法就是在Python嵌套C语言 应该可以办到
我之前试过,发的数据满5个字节才有用。
对于不定长的数据可能只能用1个字节的,而且关键在于没有用中断的话实效性就只能打个问号。
我这边现在试过但没有用 Python 的原因如下:
MCU要求FLASH比较大,FLASH小的放不进去;
Python我用的是放到TF卡中运行,别人能直接读到源代码;
中断回调处理我现在没找到高效的方案。
python 确实没有C语言的精细高效,据说在新改进的microPyhton会得到解决