|
本帖最后由 源地1号 于 2019-6-24 22:46 编辑 3 Y3 |8 `$ V1 f+ u4 Q$ ~* n 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/233 L$ L( Z, h5 A1 M, [ # @Author : WU HENG 源地工作室 # @File : main.py# @程序原理:netPYB通过使用W5500进行网络通讯,netPYB角色是客户端,pc端使用TCP/UDP调试工具 # 角色是服务器端。- f8 z. [) ~' z0 b: Q* r- x$ H # @外设模块:, K: C6 c# a1 \ # @接线引脚:netPYB占用SPI1,CS使用X5(PYB),RST使用Y11; x+ k6 M$ V; x: O6 [+ `6 u6 a # @实验现象:PC端的服务端会收到hello world,按板子上的USR按键会收到bye world # @实验注意:netPYB是使用了改造的固件,标准版的PYB是不能使用network SOCKET功能的需要加载相应的固件 # @硬件购买:netPYB购买某宝搜索netPYB或者upython或者源地工作室 import network import pyb #板载驱动库' @& F1 d- T! Q; h1 p, t import socket #网络通信协议库' ~- ?! c4 O3 U4 y 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')) #设置开发板的网络属性" A2 U. h5 o; R0 P/ N! j4 P# w print(nic.ifconfig()) #打印一下是否设置好' x1 X" s/ Z$ y- P s=socket.socket() #创建socket对象5 {; d* j' P+ M$ U addr=('192.168.1.151',1234) #设置服务器的ip地址和端口号6 W* N- L$ d* B s.connect(addr) #连接服务器) c" q# ]: E% [! t4 x0 s pyb.delay(500)" Q( H& d" U% K! }3 s s.send("hello world!") #连接成功以后,向服务器发送hello world,如果服务器收到表示实验成功 pyb.Switch().callback(lambda:s.send("bye world!")) #按键中断发送一段话网络基本功能实验测试 测试一下在同一局域网内通讯,程序稍加改动就可以接入广域网,上云服务器,或者实现其他的物联应用,这里我们进行最简单的实验,电脑上使用TCP&UDP调试软件,创建一个服务器启动并等待客户端的接入 ![]()
![]()
( f5 W* Q8 G9 e2 V( S0 Z7 g基本功能测试示例 由于netPYB是从标准板PYB改造而来,自然PYB大部分程序是兼容的,在功能示意图中有硬件引脚对应表,使用哪一种标号都是可以的。下面是官网的基本功能应用,可以对比一下C语言代码,保守估计,代码量是C语言的十分之一吧! import pybpyb.repl_uart(pyb.UART(1, 9600)) # duplicate REPL on UART(1)7 t$ Z R( H% ?5 Z+ L0 Q7 g# e7 f# D. d pyb.wfi() # pause CPU, waiting for interrupt0 N( e! Z. S+ J pyb.freq() # get CPU and bus frequencies4 x# r! H2 J, V" Y pyb.freq(60000000) # set CPU freq to 60MHz4 F+ m- X" v' `: ]% s; L pyb.stop() # stop CPU, waiting for external interrupt - }1 n$ a% {' P* e3 k6 } 延时和定时5 ^; m; `) O5 z% U* L3 S import time4 V8 L5 l* i2 Y time.sleep(1) # sleep for 1 second time.sleep_ms(500) # sleep for 500 milliseconds, |1 [, ]; K) H, x5 A; w time.sleep_us(10) # sleep for 10 microseconds2 u: V: _' o' ^ start = time.ticks_ms() # get value of millisecond counter delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference" v. i4 |: U. c4 F 板载LED控制 f8 G$ m( L9 u# o from pyb import LED led = LED(1) # 1=red, 2=green, 3=yellow, 4=blue2 q0 M4 |* ?2 F2 {; e) c led.toggle()& H, ]" j; ~! r led.on()0 U" n" W' @% L" j6 T led.off()# LEDs 3 and 4 support PWM intensity (0-255)* I$ r' y) L( ^ LED(4).intensity() # get intensity LED(4).intensity(128) # set intensity to half7 ^4 O# x0 f. f" O0 N4 h/ M 板子用户按键) w& ?2 B7 T9 t6 F& U% x' Q8 t1 Z5 u from pyb import Switch' N- Y l% f2 G# [ sw = Switch() sw.value() # returns True or False sw.callback(lambda: pyb.LED(1).toggle()) 引脚和通用输入输出引脚控制9 \7 h1 C# Q" c4 B1 z& S: ~. y from pyb import Pin p_out = Pin('X1', Pin.OUT_PP) p_out.high() p_out.low()8 Y& |+ m, J$ z0 F* W p_in = Pin('X2', Pin.IN, Pin.PULL_UP) p_in.value() # get value, 0 or 14 m3 F# t0 d1 C6 S J# M 舵机控制 from pyb import Servo' N- e* t) @7 w 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+ C' r6 z5 a3 X1 g/ c0 i" X 外部中断0 R" J- i8 V- c4 V from pyb import Pin, ExtInt- g# \1 v$ |& s/ ~/ Y5 [5 i callback = lambda e: print("intr") ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)& R7 l) ^9 B* y2 \ 定时器7 w; Q" o* {. W, Y5 O from pyb import Timer% u% [4 N+ I+ V, P+ j- r tim = Timer(1, freq=1000)5 L+ U3 P5 m! z( t- c1 h tim.counter() # get counter valuetim.freq(0.5) # 0.5 Hz% J1 Y" u6 l5 }" h9 B tim.callback(lambda t: pyb.LED(1).toggle()) RTC (实时时钟)2 |) N- o5 m2 n' Y from pyb import RTC rtc = RTC()% O+ T, S2 w% S6 Y rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # set a specific date and time1 |) o# q: U3 b' [: H7 b rtc.datetime() # get date and time PWM (脉宽调制输出)1 b. i& D7 f' W5 v% e3 | from pyb import Pin, Timer& b" J6 [, I7 Y: T0 K+ u$ ~0 F- J p = Pin('X1') # X1 has TIM2, CH1/ l6 g6 Z0 \3 r tim = Timer(2, freq=1000)8 ?2 {2 U0 u" Y9 } ch = tim.channel(1, Timer.PWM, pin=p). e" ?" F! l5 d+ b ch.pulse_width_percent(50) ADC (模数转换), e, u6 S m i, S$ o from pyb import Pin, ADC adc = ADC(Pin('X19'))9 n- K) _" p) A4 o: |9 } adc.read() # read value, 0-4095 UART (串口)- G6 E) Q5 L9 S- P" q K from pyb import UART uart = UART(1, 9600) j% a, A" w m4 K8 g. R uart.write('hello')' S4 K8 k9 }9 I5 u7 x/ u uart.read(5) # read up to 5 bytes SPI 总线 from pyb import SPI/ J! J0 }7 G4 e( a- s spi = SPI(1, SPI.MASTER, baudrate=200000, polarity=1, phase=0) spi.send('hello')spi.recv(5) # receive 5 bytes on the bus# R) y' M J# D. b spi.send_recv('hello') # send and receive 5 bytes }8 }6 ]3 R1 I& l* j4 }9 X$ V6 Z8 f I2C 总线. X( e, K$ S5 r, [5 T9 i* X c6 F from pyb import I2C% x$ N* s1 c$ I! T# x i2c = I2C(1, I2C.MASTER, baudrate=100000)0 t4 m' K% J# t/ o8 F/ Y r i2c.scan() # returns list of slave addresses4 T% g$ l* ]: V( H6 x i2c.send('hello', 0x42) # send 5 bytes to slave with address 0x42 i2c.recv(5, 0x42) # receive 5 bytes from slave1 h T* X# N7 U" e$ b 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 板载加速度传感器/ ?2 k5 n9 x& nfrom pyb import Accel. L0 E9 t- J) Z& g; K5 [ accel = Accel()print(accel.x(), accel.y(), accel.z(), accel.tilt()) $ M5 S3 z4 S6 V+ H/ i+ R) ~, a. ` |
netPYBv1.1åçå¾.rar
下载1.02 MB, 下载次数: 15
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版
其实我想问一下最基本的串口中断处理怎么弄,比如我主任务运行一套循环动作,接收到串口中断协议数据,怎么把接收到的一串数据搬运到指定缓冲区?能够简单写一段实现上述功能的示例代码最好了。
UART (串口)+ g! R. b5 T8 |% B
from pyb import UART
uart = UART(1, 9600) V2 b% I) I8 F4 o- l& j# |# L
uart.write('hello')& |4 w N( @+ F7 Y; {
uart.read(5) # read up to 5 bytes
uart.read(5)这段话意思是从缓冲区读取5个bytes 可能没有中断触发的及时但是 串口传进来数据被缓冲待用,应该有好的办法能处理暂时没有想到,还一个办法就是在Python嵌套C语言 应该可以办到
我之前试过,发的数据满5个字节才有用。+ `* {' X9 X/ O) t/ C9 K0 F( J1 n
对于不定长的数据可能只能用1个字节的,而且关键在于没有用中断的话实效性就只能打个问号。
我这边现在试过但没有用 Python 的原因如下:& V5 ~, l0 E8 O+ s) r
MCU要求FLASH比较大,FLASH小的放不进去;# d6 b/ a0 y9 e* i) ^" m
Python我用的是放到TF卡中运行,别人能直接读到源代码;
中断回调处理我现在没找到高效的方案。
python 确实没有C语言的精细高效,据说在新改进的microPyhton会得到解决