你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在STM32构建的Pyboard板上使用Python编程的大体流程,超简单

[复制链接]
源地1号 发布时间:2019-7-3 00:15
本帖最后由 源地1号 于 2019-7-3 11:02 编辑
* S; n. M( m/ s" _. |7 g
& n! o6 q5 q% Z, D5 o2 \还是在推广STM32组成的Pyboard,使用Python语言编程,一旦领悟其流程后,简单程度让人发指,学习者明显感受到自己的智商受到了侮辱,我x,这样就行!这样就完了!这xx就OK了!相见恨晚的言论不绝于耳。
3 u; O: X4 z7 n( S人生苦短,快用Python!!  e4 T* ]3 z/ y9 E
这句话放在这里,我们分析一下,在STM32构建的Pyboard(PYB)硬件平台上,使用Python编程到底简单在什么地方。 1、代码量少了,代码容易读了,容易理解了,也容易改了,代码相比于c语言大大降低,这是因为mpy库化的原因,将验证的控制细节程序打包成库直接调用就行,c语言一般都是从底层干起,例如写个STM32控制W5500的程序用户代码算到调用的官方库和w5500库都在300行以上,mpy就十几行代码。
& y" F: h& A4 {, D  k( B c语言.jpg
' U8 F) e6 w1 I, P python.png ( w/ N, I. Y  D0 t- T& d; I
代码少了,排查BUG的效率大大增加,: e. w# |* ]) u" r
代码少了,所谓的写代码就变成了粘贴复制改参数了,
) ], l1 f  n- f/ V  L. ~代码少了,程序猿脱发就少了,有时间看孩子找对象了,
- @# S6 a3 j- ^# Y代码少了,老板们产品上市周期短了,发财就更迅速了,
, A' D( C. o" x! m" f* Q/ e2、编写代码的软件简单了,由于Python解释器内置于STM32芯片内,这就不想C语言那样需要编译连接了,代码也少,也不需要文件组织软件了,这两方面,决定了使用Python开发任何文本编辑软件就行,不需要什么IDE(MDK  KEIL  IAR等)。
  a6 W/ s' G1 b- y# |/ _8 c, M代码编写过程简单了,就不需要安装体积臃肿的IDE,电脑的空间就更大了,几乎任何一台电脑都能编写代码修改代码,甚至使用云编写都可以。
# }5 X0 N; h; V( ?. p6 ]' D3、调试下载简单了,使用C语言的时候可能还用到Jlink,stlink,脱机下载器什么的调试下载器,PYB现在插上电脑就可以生成U盘打开就能编辑,编辑完点保存就行,这一步相对于下载烧录程序,生成的虚拟串口来进行调试(REPL)或查看打印信息,巨方便。% ?* J$ k* @! @
4、报错机制简单了,如果程序有BUG可以很容易的通过REPL进行报错,很智能。% w( _; B! G* r; f9 O. [/ {
5、教程简单了,用户所谓的例程,短短的一个帖子就能说完,这个帖子最下边列出基本的应用例程。
9 Z) ~+ h6 b8 Q: m我暂时总结了上边几点,再有什么心得体会再补充。
# D( s( a4 b+ O# b- A3 E" d--------------------------------------------------------------------------------------------------/ n! B$ @" w6 g! \
硬件认识:. E4 U4 J5 V. N3 j* E) f4 l
pyboard_usb_micro.jpg ( M8 e5 g& b& {+ ?3 C7 j2 `: }
开发流程图:6 n& a- G# e2 {8 s
py流程图2.png ; E8 P$ t2 c5 k  m% S6 Z* \; `
写代码用的轻量级专业脚本编写软件sublime Text:
8 d: v, s* S! m! W8 R* B ST.png
* h! g2 o  ^% j/ F$ mREPL交互调试用的串口调试软件:
* j5 ]( d8 b3 R) |- B/ D6 c7 o7 k REPLC.png 1 m# ?+ T6 t9 e+ d7 q9 o$ A7 l6 c" x& c
-----------------------------------------------------------------------------------------------------
: c7 h4 \/ N& M0 v* @1 e基本功能代码示例(直接粘贴复制验证):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

1 u" R4 i$ @, z8 S6 D3 K+ `
延时和定时
----------------
    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()

6 I! ?8 V# F, \7 \( X' k
    # 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

+ q$ {6 z' W+ w: f3 P
    p_out = Pin('X1', Pin.OUT_PP)
    p_out.high()
    p_out.low()

- y; A# N# H3 [( ]6 L/ u2 `
    p_in = Pin('X2', Pin.IN, Pin.PULL_UP)
    p_in.value() # get value, 0 or 1

, S& G# H  y1 B; P4 G- k
舵机控制
-------------
    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)

/ @" L  z) ?* Z* I* `# u
定时器
------
    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 o
RTC (实时时钟)
---------------------
    from pyb import RTC

0 i' N7 h( u) r3 k' c: j+ v- p$ ~* V( Y
    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+ Q
PWM (脉宽调制输出)
----------------------------
    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) E
ADC (模数转换)
----------------------------------
    from pyb import Pin, ADC
- L! G- t9 S- ?  h2 L" W* F
    adc = ADC(Pin('X19'))
    adc.read() # read value, 0-4095

8 l  v  n/ b6 l. W/ p" F
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$ ?+ q
UART (串口)
-----------------
    from pyb import UART

2 J5 ?; G6 F3 z6 [3 |3 C! H# s9 `
    uart = UART(1, 9600)
    uart.write('hello')
    uart.read(5) # read up to 5 bytes

! N9 d( M4 c  F  q, C, M1 Z
SPI 总线
-------
    from pyb import SPI

3 N" G* x. m& j, P9 E
    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

3 n4 \1 K& }8 S3 p9 J; k) S. H6 c' ]
I2C 总线
-------
    from pyb import I2C

9 n' O' J' g- O) @" L0 o8 Q, S
    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 D
CAN 总线
---------------------------------
    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

( \+ W3 I6 W: O
板载加速度传感器
----------------------
    from pyb import Accel

1 X! F- }" X: v, b1 }) y
    accel = Accel()
    print(accel.x(), accel.y(), accel.z(),accel.tilt())
/ q3 y( w) `/ n

0 {# h5 N( [2 L9 ]0 g8 \4 g% N2 q8 L
& h5 d  `- c7 q  P. C  k
赞 收藏 1 评论2 发布时间:2019-7-3 00:15

举报

2个回答
STMCU-管管 回答时间:2019-7-15 16:24:22
谢谢分享
shaoziyang 回答时间:2019-7-18 10:21:50
使用mpy编程,简单快速。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版