|
本帖最后由 源地1号 于 2019-7-3 11:02 编辑 还是在推广STM32组成的Pyboard,使用Python语言编程,一旦领悟其流程后,简单程度让人发指,学习者明显感受到自己的智商受到了侮辱,我x,这样就行!这样就完了!这xx就OK了!相见恨晚的言论不绝于耳。 人生苦短,快用Python!! e4 T* ]3 z/ y9 E 这句话放在这里,我们分析一下,在STM32构建的Pyboard(PYB)硬件平台上,使用Python编程到底简单在什么地方。 1、代码量少了,代码容易读了,容易理解了,也容易改了,代码相比于c语言大大降低,这是因为mpy库化的原因,将验证的控制细节程序打包成库直接调用就行,c语言一般都是从底层干起,例如写个STM32控制W5500的程序用户代码算到调用的官方库和w5500库都在300行以上,mpy就十几行代码。
代码少了,排查BUG的效率大大增加,: e. w# |* ]) u" r 代码少了,所谓的写代码就变成了粘贴复制改参数了, 代码少了,程序猿脱发就少了,有时间看孩子找对象了, 代码少了,老板们产品上市周期短了,发财就更迅速了, 2、编写代码的软件简单了,由于Python解释器内置于STM32芯片内,这就不想C语言那样需要编译连接了,代码也少,也不需要文件组织软件了,这两方面,决定了使用Python开发任何文本编辑软件就行,不需要什么IDE(MDK KEIL IAR等)。 代码编写过程简单了,就不需要安装体积臃肿的IDE,电脑的空间就更大了,几乎任何一台电脑都能编写代码修改代码,甚至使用云编写都可以。 3、调试下载简单了,使用C语言的时候可能还用到Jlink,stlink,脱机下载器什么的调试下载器,PYB现在插上电脑就可以生成U盘打开就能编辑,编辑完点保存就行,这一步相对于下载烧录程序,生成的虚拟串口来进行调试(REPL)或查看打印信息,巨方便。% ?* J$ k* @! @ 4、报错机制简单了,如果程序有BUG可以很容易的通过REPL进行报错,很智能。% w( _; B! G* r; f9 O. [/ { 5、教程简单了,用户所谓的例程,短短的一个帖子就能说完,这个帖子最下边列出基本的应用例程。 我暂时总结了上边几点,再有什么心得体会再补充。 --------------------------------------------------------------------------------------------------/ n! B$ @" w6 g! \ 硬件认识:. E4 U4 J5 V. N3 j* E) f4 l
开发流程图:6 n& a- G# e2 {8 s
写代码用的轻量级专业脚本编写软件sublime Text:
REPL交互调试用的串口调试软件:
----------------------------------------------------------------------------------------------------- 基本功能代码示例(直接粘贴复制验证):4 |9 f* l) J9 N1 s- E( z! q 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 2 i1 ^ e6 q% w' F3 P 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 7 O' b# D. L1 ]* o4 F 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 tohalf 8 c* N, b/ c% f6 x板子用户按键 --------------- frompyb import Switch ' ]$ N% P( p6 g( V! y- P sw = Switch() sw.value() # returns True or False sw.callback(lambda: pyb.LED(1).toggle()) . L0 ^- }' B1 ]; U& a引脚和通用输入输出引脚控制 ------------- 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 D! u1 v- z! \ 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 3 J! b9 D: R# P+ i. w外部中断 ------------------- from pyb import Pin, ExtInt / a, L( `2 f, S5 i$ o" V( f7 o5 I callback = lambda e:print("intr") ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING,Pin.PULL_NONE, callback) 定时器 ------ from pyb import Timer 9 u$ N: O. K2 `' {4 W @ 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()) 9 J% p+ g7 x- v3 ]% R |% h* {1 oRTC (实时时钟) --------------------- 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 6 H$ p9 M; E! m+ QPWM (脉宽调制输出) ---------------------------- from pyb import Pin, Timer % z* `6 i2 \: e+ m; z F 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) 1 H0 U+ Y2 S) EADC (模数转换) ---------------------------------- from pyb import Pin, ADC - L! G- t9 S- ? h2 L" W* F adc = ADC(Pin('X19')) adc.read() # read value, 0-4095 DAC (数模转换) ---------------------------------- from pyb import Pin, DAC 4 b8 c5 c D0 p- s dac = DAC(Pin('X5')) dac.write(120) # output between 0 and 255 1 Q( ~8 \1 H N) s" S$ ?+ qUART (串口) ----------------- 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 I2C 总线 ------- from pyb import I2C 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 * P5 w$ r, i! s9 M9 DCAN 总线 --------------------------------- from pyb import CAN 9 I, i1 ?# c2 Z/ V/ P 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()) / q3 y( w) `/ n0 g8 \4 g% N2 q8 L & h5 d `- c7 q P. C k |
| 谢谢分享 |
| 使用mpy编程,简单快速。 |
微信公众号
手机版