|
本帖最后由 源地1号 于 2019-7-3 11:02 编辑 还是在推广STM32组成的Pyboard,使用Python语言编程,一旦领悟其流程后,简单程度让人发指,学习者明显感受到自己的智商受到了侮辱,我x,这样就行!这样就完了!这xx就OK了!相见恨晚的言论不绝于耳。 人生苦短,快用Python!! 这句话放在这里,我们分析一下,在STM32构建的Pyboard(PYB)硬件平台上,使用Python编程到底简单在什么地方。 1、代码量少了,代码容易读了,容易理解了,也容易改了,代码相比于c语言大大降低,这是因为mpy库化的原因,将验证的控制细节程序打包成库直接调用就行,c语言一般都是从底层干起,例如写个STM32控制W5500的程序用户代码算到调用的官方库和w5500库都在300行以上,mpy就十几行代码。
代码少了,排查BUG的效率大大增加, 代码少了,所谓的写代码就变成了粘贴复制改参数了, 代码少了,程序猿脱发就少了,有时间看孩子找对象了, 代码少了,老板们产品上市周期短了,发财就更迅速了, 2、编写代码的软件简单了,由于Python解释器内置于STM32芯片内,这就不想C语言那样需要编译连接了,代码也少,也不需要文件组织软件了,这两方面,决定了使用Python开发任何文本编辑软件就行,不需要什么IDE(MDK KEIL IAR等)。 代码编写过程简单了,就不需要安装体积臃肿的IDE,电脑的空间就更大了,几乎任何一台电脑都能编写代码修改代码,甚至使用云编写都可以。 3、调试下载简单了,使用C语言的时候可能还用到Jlink,stlink,脱机下载器什么的调试下载器,PYB现在插上电脑就可以生成U盘打开就能编辑,编辑完点保存就行,这一步相对于下载烧录程序,生成的虚拟串口来进行调试(REPL)或查看打印信息,巨方便。 4、报错机制简单了,如果程序有BUG可以很容易的通过REPL进行报错,很智能。 5、教程简单了,用户所谓的例程,短短的一个帖子就能说完,这个帖子最下边列出基本的应用例程。 我暂时总结了上边几点,再有什么心得体会再补充。 -------------------------------------------------------------------------------------------------- 硬件认识:
开发流程图:
写代码用的轻量级专业脚本编写软件sublime Text:
REPL交互调试用的串口调试软件:
----------------------------------------------------------------------------------------------------- 基本功能代码示例(直接粘贴复制验证): 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() # LEDs 3 and 4 support PWM intensity(0-255) LED(4).intensity() # get intensity LED(4).intensity(128) # set intensity tohalf 板子用户按键 --------------- 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 外部中断 ------------------- 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 value tim.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 DAC (数模转换) ---------------------------------- from pyb import Pin, DAC dac = DAC(Pin('X5')) dac.write(120) # output between 0 and 255 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 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 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()) |
| 谢谢分享 |
| 使用mpy编程,简单快速。 |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版