|
移植MicroPython到SensorTile的过程
[复制链接]
本帖最后由 dcexpert 于 2017-1-20 00:41 编辑
两周前就应该写这一篇,但是因为各种原因耽误下来。今天晚上,终于抽出时间,将移植过程整理出来。在移植过程中,遇到不少新问题,经过反复研究和测试,终于逐个解决,我将移植的过程写下来,希望给大家一点参考。
大家知道,SensorTile使用的控制器是STM32L476JGY6。在MicroPython的支持开发板中,有NUCLEO_L476RG和STM32L476DISC,它们使用的控制器型号分别是 STM32L476RGT6和STM32L476VGT6。STM32L476JGY6和它们的区别不大,因此想象中移植应该是很容易的,但是实际上结果并非如此。
开始的时候,和往常一样,先创建了SensorTile文件夹,并将STM32L476DISC的文件复制过去,然后将MICROPY_HW_BOARD_NAME定义改为SensorTile,将MICROPY_HW_LED1修改为pin_G12。编译后就会发现提示错误,有管脚定义冲突。将UART、I2C、SPI定义中该删除的删除,该修改的进行修改,然后再次编译,这次提示LED1没有定义。查看数据手册,发现PORTG端口正好 STM32L476RGT6和STM32L476VGT6上没有,但是其它型号上都存在。micropython是使用ST的HAL进行开发的,因此不会因为型号的变化造成端口没有定义的错误,这个问题应该还是定义上造成的。因为Micropython在开发板的定义部分没有文档,只能自己研究了,经过反复分析和研究,并经过多次测试,终于发现是需要在pins.cvs中定义管脚,所有需要在micropython中使用的引脚、引脚的别名都需要在这里进行定义。在pins.cvs中添加了STM32L476JGY6引脚定义后,编译终于通过了。
使用STM32 ST-LINK Utility下载程序后(注意不能通过DFU方式下载,因为DFU程序对于STM32L476存在bug,在Linux和Windows下都是如此),可以正确识别出pybflash磁盘和串口。打开终端程序,输入pyb.LED(1).toggle(),先试试LED的效果,结果没有变化,这说明PORTG并没有真正工作。虽然micropython可以运行,但是LED不能使用就很不方便,此外蓝牙也是通过PORTG进行驱动的,所以必须解决这个问题。为了解决它,尝试了多种方法,最后发现还是需要深入底层,于是改用C++写测试程序,进一步去分析,最终找出了是因为在STM32L476中,PORTG需要额外使用VddIO2才能驱动。具体的过程可以参考这一篇帖子: 【sensorTile】使用Mbed进行程序开发的问题及解决。将相关代码加入到MicroPython的底层驱动后,LED终于可以使用了。后来在我建议下,官方代码中也加入了对STM32L476的PORTG支持。
下一步就是传感器的驱动了,这部分还没有来得及开始测试,不过看原理图中,SensorTile在内部传感器上使用了半双工(3-Wire)模式的SPI方式,而没有使用I2C接口。这可能是为了更快的访问传感器,降低功耗。但是遗憾的是MicroPython目前还不支持这个模式,看来还需要继续研究了。等解决了这个问题,再继续和大家分享。
附pins.cvs的定义: - PA0,PA0
- PA1,PA1
- PA2,PA2
- PA3,PA3
- PA4,PA4
- PA5,PA5
- PA6,PA6
- PA7,PA7
- PA8,PA8
- PA9,PA9
- PA10,PA10
- PA11,PA11
- PA12,PA12
- PA15,PA15
- PB0,PB0
- PB1,PB1
- PB2,PB2
- PB3,PB3
- PB4,PB4
- PB5,PB5
- PB6,PB6
- PB7,PB7
- PB8,PB8
- PB9,PB9
- PB10,PB10
- PB11,PB11
- PB12,PB12
- PB13,PB13
- PB14,PB14
- PB15,PB15
- PC0,PC0
- PC1,PC1
- PC2,PC2
- PC3,PC3
- PC4,PC4
- PC5,PC5
- PC6,PC6
- PC7,PC7
- PC8,PC8
- PC9,PC9
- PC10,PC10
- PC11,PC11
- PC12,PC12
- PC13,PC13
- PC14,PC14
- PC15,PC15
- PD2,PD2
- PG9,PG9
- PG10,PG10
- PG11,PG11
- PG12,PG12
- PG13,PG13
- PG14,PG14
- PH0,PH0
- PH1,PH1
- LED_RED,PG12
- LED_GREEN,PG12
- LED_YELLOW,PG12
- LED_BLUE,PG12
复制代码
mpconfigboard.h
- #define MICROPY_HW_BOARD_NAME "SensorTile"
- #define MICROPY_HW_MCU_NAME "STM32L476JG"
- #define MICROPY_HW_HAS_SWITCH (0)
- #define MICROPY_HW_HAS_FLASH (1)
- #define MICROPY_HW_HAS_SDCARD (0)
- #define MICROPY_HW_HAS_LCD (0)
- #define MICROPY_HW_ENABLE_RTC (1)
- // MSI is used and is 4MHz
- #define MICROPY_HW_CLK_PLLM (1)
- #define MICROPY_HW_CLK_PLLN (40)
- #define MICROPY_HW_CLK_PLLR (2)
- #define MICROPY_HW_CLK_PLLP (7)
- #define MICROPY_HW_CLK_PLLQ (4)
- // UART config
- /*
- #define MICROPY_HW_UART2_TX (pin_A2)
- #define MICROPY_HW_UART2_RX (pin_A3)
- #define MICROPY_HW_UART_REPL PYB_UART_2
- #define MICROPY_HW_UART_REPL_BAUD 115200
- */
- #define MICROPY_HW_I2C_BAUDRATE_TIMING {{100000, 0x90112626}}
- #define MICROPY_HW_I2C_BAUDRATE_DEFAULT 100000
- #define MICROPY_HW_I2C_BAUDRATE_MAX 100000
- #define MICROPY_HW_FLASH_LATENCY FLASH_LATENCY_4
- // I2C busses
- /*
- #define MICROPY_HW_I2C1_SCL (pin_B6)
- #define MICROPY_HW_I2C1_SDA (pin_B7)
- #define MICROPY_HW_I2C2_SCL (pin_B10)
- #define MICROPY_HW_I2C2_SDA (pin_B11)
- */
- #define MICROPY_HW_I2C3_SCL (pin_C0)
- #define MICROPY_HW_I2C3_SDA (pin_C1)
- // SPI busses
- /*
- #define MICROPY_HW_SPI1_NSS (pin_A4)
- #define MICROPY_HW_SPI1_SCK (pin_B3)
- #define MICROPY_HW_SPI1_MISO (pin_B4)
- #define MICROPY_HW_SPI1_MOSI (pin_B5)
- */
- #define MICROPY_HW_SPI2_NSS (pin_B12)
- #define MICROPY_HW_SPI2_SCK (pin_B13)
- #define MICROPY_HW_SPI2_MISO (pin_B14)
- #define MICROPY_HW_SPI2_MOSI (pin_B15)
- #define MICROPY_HW_SPI3_NSS (pin_G12)
- #define MICROPY_HW_SPI3_SCK (pin_G9)
- #define MICROPY_HW_SPI3_MISO (pin_G10)
- #define MICROPY_HW_SPI3_MOSI (pin_G11)
- // USRSW is pulled low. Pressing the button makes the input go high.
- /*
- #define MICROPY_HW_USRSW_PIN (pin_C13)
- #define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
- #define MICROPY_HW_USRSW_EXTI_MODE (GPIO_MODE_IT_FALLING)
- #define MICROPY_HW_USRSW_PRESSED (0)
- */
- // LEDs
- #define MICROPY_HW_LED1 (pin_G12) // orange LED
- #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
- #define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
复制代码
|
|