本帖最后由 源地1号 于 2019-7-3 11:02 编辑 ' o% u/ v" j | ; E( f2 s5 d$ n3 _; m' V' j$ J' n 还是在推广STM32组成的Pyboard,使用Python语言编程,一旦领悟其流程后,简单程度让人发指,学习者明显感受到自己的智商受到了侮辱,我x,这样就行!这样就完了!这xx就OK了!相见恨晚的言论不绝于耳。; T& z4 v4 u3 o 人生苦短,快用Python!! 这句话放在这里,我们分析一下,在STM32构建的Pyboard(PYB)硬件平台上,使用Python编程到底简单在什么地方。 1、代码量少了,代码容易读了,容易理解了,也容易改了,代码相比于c语言大大降低,这是因为mpy库化的原因,将验证的控制细节程序打包成库直接调用就行,c语言一般都是从底层干起,例如写个STM32控制W5500的程序用户代码算到调用的官方库和w5500库都在300行以上,mpy就十几行代码。/ }& v5 ~6 Z* ^ 代码少了,排查BUG的效率大大增加, 代码少了,所谓的写代码就变成了粘贴复制改参数了, 代码少了,程序猿脱发就少了,有时间看孩子找对象了, 代码少了,老板们产品上市周期短了,发财就更迅速了,; N% q% z4 ~! N0 o; Y% k! e 2、编写代码的软件简单了,由于Python解释器内置于STM32芯片内,这就不想C语言那样需要编译连接了,代码也少,也不需要文件组织软件了,这两方面,决定了使用Python开发任何文本编辑软件就行,不需要什么IDE(MDK KEIL IAR等)。6 d# A- N- ~. K6 P s 代码编写过程简单了,就不需要安装体积臃肿的IDE,电脑的空间就更大了,几乎任何一台电脑都能编写代码修改代码,甚至使用云编写都可以。! H, f+ F6 Q7 k2 Y& }2 A: o0 ] 3、调试下载简单了,使用C语言的时候可能还用到Jlink,stlink,脱机下载器什么的调试下载器,PYB现在插上电脑就可以生成U盘打开就能编辑,编辑完点保存就行,这一步相对于下载烧录程序,生成的虚拟串口来进行调试(REPL)或查看打印信息,巨方便。3 [2 s' }# i8 c7 A: m, R 4、报错机制简单了,如果程序有BUG可以很容易的通过REPL进行报错,很智能。 5、教程简单了,用户所谓的例程,短短的一个帖子就能说完,这个帖子最下边列出基本的应用例程。2 ^# D# L3 z$ b/ h. _9 q$ u 我暂时总结了上边几点,再有什么心得体会再补充。5 P- x7 |* d; c; j1 x --------------------------------------------------------------------------------------------------, T+ s/ x) Z3 g( `& I- W& ^6 _- L 硬件认识: 开发流程图:+ }* G% N7 e" w! ~ |# S 写代码用的轻量级专业脚本编写软件sublime Text:8 d7 s- g5 H+ H REPL交互调试用的串口调试软件: -----------------------------------------------------------------------------------------------------, W. C# B- S7 h; k' F3 p4 N 基本功能代码示例(直接粘贴复制验证):/ M7 Q2 @2 P6 y- b- A3 s uPython(μPython,MPY)基本功能代码示例: 基本控制代码: import pyb pyb.repl_uart(pyb.UART(1, 9600)) #duplicate REPL on UART(1) pyb.wfi() # pause CPU, waiting forinterrupt pyb.freq() # get CPU and bus frequencies pyb.freq(60000000) # set CPU freq to 60MHz pyb.stop() # stop CPU, waiting for externalinterrupt 延时和定时 ---------------- 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 ofmillisecond 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() 2 n, u' U1 c& J% _ # LEDs 3 and 4 support PWM intensity(0-255) LED(4).intensity() # get intensity LED(4).intensity(128) # set intensity tohalf * V. g2 A- M7 q" U, E! [/ {板子用户按键 --------------- frompyb 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 degreesin 1500ms s1.speed(50) # for continuous rotationservos ) q% g: X5 z' t& g- ^外部中断 ------------------- from pyb import Pin, ExtInt * x0 p! g9 ]; ~: j callback = lambda e:print("intr") ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING,Pin.PULL_NONE, callback) 9 z2 ]: R# I P* d定时器 ------ from pyb import Timer tim = Timer(1, freq=1000) tim.counter() # get counter value tim.freq(0.5) # 0.5 Hz tim.callback(lambda t: pyb.LED(1).toggle()) - }4 W( ^% b z$ o3 MRTC (实时时钟) --------------------- 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 ! G+ b: m9 ~4 E& U8 g9 ^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) ! I/ ^# w3 \, Z+ _ADC (模数转换) ---------------------------------- from pyb import Pin, ADC " i# C" m, v# P$ L( K, s adc = ADC(Pin('X19')) adc.read() # read value, 0-4095 DAC (数模转换) ---------------------------------- from pyb import Pin, DAC 6 G. P/ a8 e0 z/ O+ b4 a dac = DAC(Pin('X5')) dac.write(120) # output between 0 and 255 . H" G i. b+ jUART (串口) ----------------- 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 5bytes # s# M2 y ]% `, Q) Q% r" e( m$ |I2C 总线 ------- from pyb import I2C % g7 D2 K: r' J1 u( x i2c = I2C(1, I2C.MASTER, baudrate=100000) i2c.scan() # returns list of slaveaddresses i2c.send('hello', 0x42) # send 5 bytes toslave with address 0x42 i2c.recv(5, 0x42) # receive 5 bytes fromslave i2c.mem_read(2, 0x42, 0x10) # read 2 bytesfrom slave 0x42, slave memory 0x10 i2c.mem_write('xy', 0x42, 0x10) # write 2bytes to slave 0x42, slave memory 0x10 CAN 总线 --------------------------------- from pyb import CAN , P/ u* _/ t1 y3 K- j9 K 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 % e6 o" [5 @* I5 S( W9 C0 h accel = Accel() print(accel.x(), accel.y(), accel.z(),accel.tilt()) # S% A. R" [5 n+ K * O, j6 }2 N. T X% h) x |
谢谢分享 |
使用mpy编程,简单快速。 |