WRTnode 2R STM32固件的烧写和spi-bridge的使用

WRTnode2r_STM32_bootloader.hex

rtthread.bin

首先放上来的这两个文件,是WRTnode群共享放出的bootloader和我自己编译的rtthread程序。大家可以先拿编译好的固件使用。

STM32固件的烧写

接线

我这里使用的烧写工具是ST-Link,接线方式参考pinMap:

只需要接GND,SWCLK和SWDIO即可调试。

烧写

接好之后,我们打开STM32 ST-LINK Utility软件开始烧写固件。

首先点击Connect to the target连接STM32,连接成功之后应该可以在右上角看到STM32F10xx Medium-density,64KBytes等信息,这是STM32F103T8U6芯片的信息。

Snip20151123_33

然后我们点击Program verify,选WRTnode2r_STM32_bootloader.hex开始烧写。

Snip20151123_33

然后烧写rtthread.bin,这里一定要记得地址必须填0x08001000,不然bootloader就没了。

 烧好以后,就可以在终端中使用spi-bridge与STM32进行交互了。

spi-bridge

更新&编译

在内测版WRTnode 2R的SDK中是没有WRTndoe2r-stm32这个package的,所以我们首先得更新feeds,进入wrtnode文件夹,然后输入:

1
2
3
./scripts/feeds update wrtnode
./scripts/feeds install -a
make menuconfig

在WRTnode中选择WRTndoe2r-stm32,你将得到spi-bridge命令和flash-stm32命令。

1
spi-bridge

下图就是spi-bridge的效果:

输入tab,回车,就可以看到所有的命令和命令的解释说明。个人认为最大的亮点在于,它加入了Arduino的语法,可以使用pinMode,digitalWrite,digitalRead等命令,由于是测试版,还未加入所有的功能,以后肯定会加入诸如analogWrite(PWM),analogRead(ADC)等功能,大大降低单片机开发难度,让更多人能够跨入这个门槛中。

1
2
3
4
spi-bridge             # 进入交互模式
spi-bridge write ps # 执行命令
spi-bridge read # 读取命令结果
spi-bridge status # 获取当前状态,通常返回OK

通过输入下面的命令,我们可以控制PB5输出高电平:

1
2
spi-bridge write "pinMode 5 0"         # 0表示输出
spi-bridge write "digitalWrite 5 1" # 1表示高电平

至于各个引脚的定义,在官方的PIN_MAP中可以找到:https://github.com/WRTnode/wrtnode2r_stm32/blob/master/maple/wirish/boards/wrtnode2/board.cpp#L67

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
PMAP_ROW(GPIOB, 0, TIMER3, 3, ADC1, 8), /* D0/PB0 */
PMAP_ROW(GPIOB, 1, TIMER3, 4, ADC1, 9), /* D1/PB1 */
PMAP_ROW(GPIOB, 2, NULL, 0, NULL, ADCx), /* D2/PB2 */
PMAP_ROW(GPIOB, 3, NULL, 0, NULL, ADCx), /* D3/PB3 */
PMAP_ROW(GPIOB, 4, NULL, 0, NULL, ADCx), /* D4/PB4 */
PMAP_ROW(GPIOB, 5, NULL, 0, NULL, ADCx), /* D5/PB5 */
PMAP_ROW(GPIOB, 6, TIMER4, 1, NULL, ADCx), /* D6/PB6 */
PMAP_ROW(GPIOB, 7, TIMER4, 2, NULL, ADCx), /* D7/PB7 */
PMAP_ROW(GPIOA, 0, TIMER2, 1, ADC1, 0), /* D8/PA0 */
PMAP_ROW(GPIOA, 1, TIMER2, 2, ADC1, 1), /* D9/PA1 */
PMAP_ROW(GPIOA, 2, TIMER2, 3, ADC1, 2), /* D10/PA2 */
PMAP_ROW(GPIOA, 3, TIMER2, 4, ADC1, 3), /* D11/PA3 */
PMAP_ROW(GPIOA, 8, TIMER1, 1, NULL, ADCx), /* D12/PA8 */
PMAP_ROW(GPIOA, 9, TIMER1, 2, NULL, ADCx), /* D13/PA9 */
PMAP_ROW(GPIOA, 10, TIMER1, 3, NULL, ADCx), /* D14/PA10 */
PMAP_ROW(GPIOA, 11, TIMER1, 4, NULL, ADCx), /* D15/PA11 */
PMAP_ROW(GPIOA, 12, NULL, 0, NULL, ADCx), /* D16/PA12 */
PMAP_ROW(GPIOA, 13, NULL, 0, NULL, ADCx), /* D17/PA13 */
PMAP_ROW(GPIOA, 14, NULL, 0, NULL, ADCx), /* D18/PA14 */
PMAP_ROW(GPIOA, 15, NULL, 0, NULL, ADCx), /* D19/PA15 */
PMAP_ROW(GPIOA, 4, NULL, 0, NULL, ADCx), /* D20/PA4 */
PMAP_ROW(GPIOA, 5, NULL, 0, NULL, ADCx), /* D21/PA5 */
PMAP_ROW(GPIOA, 6, NULL, 0, NULL, ADCx), /* D22/PA6 */
PMAP_ROW(GPIOA, 7, NULL, 0, NULL, ADCx), /* D23/PA7 */
};

下面的链接是spi-bridge的源码,有兴趣的同学可以自行研究:

https://github.com/WRTnode/openwrt-packages/blob/master/wrtnode/spi-bridge/src/main.c