今天中午收到的板子,下午宅在家里,小玩了一下。
文章太长,先把要点列一列吧:
感受到的优点:
Nucleo板得到了Keil MDK-ARM V5.0版本的开发软件全方面的完善支持:
Device列表中可直接找到,自动列出对应需要安装的Pack;
MDK-ARM自带对应的示例程序;
MDK-ARM自带对应的参考文档,方便查找
Nucleo板带的STLINK虚拟出串口,适合信息输出。
只要有台带usb接口的电脑,有条mini usb的数据线,就可以用了。
尺寸小巧,不占地。
缺点吐槽:
mini usb接口;
需要上电烙铁才能更改的SBxx设置点;
总结:非常适合0基础的初学者上手。
(本人是理工科院校计算机科学与技术专业本科毕业,虽然这个专业有这么大长的个名字,实际上偏软件的厉害,4年里面连单片机的课程都没有,顶多就是有个组成原理的课程,让我们用面包板插了插红绿灯。毕业以后一直从事软件开发,硬件方面知识很弱。写的都是自己的肤浅体会,有错的,烦请老鸟们指正。)
在拍下板子,等待发货期间,自己已经去下载安装了Keil的MDK-ARM V5开发软件,官网下的免费评估版本的。
在Pack Installer里面安装必要的Pack时,立刻能够体会到使用ST官方开发板的好处。Keil的这个开发工具对ST的这块板支持是真完善啊--不管是通 过Devices查找STM32L053,或者通过Boards查找Nucleo都能直接找到,软件自动给列出需要安装的Packs, 更适合我这个菜鸟的是,在Examples中,直接就有2个适合这块nucleo开发板运行的示例程序。
凭着以前玩Visual Studio等IDE的经验,Keil的这个开发工具我用起来没有什么陌生感,直接把那个Blinky程序研究了一下。
Blinky.c 这里面有个main()函数,主要就是在一个循环里,不停的控制LED灯闪烁,另外有一个printf 打印Hello World.
while(1) { /* Loop forever */
LED_On (num);
Delay(10); /* Delay 100ms */
LED_Off(num);
printf ("Hello World\n\r”);
Retarget.c 按我的理解就是把c标准库中printf函数的实现所调用的核心的fputc fgetc等函数重载了,使的本来是向标准输入输出设备操作的函数变成了串口读写操作。
Serial.c就是封装了串口的操作函数。
后面还有个startup_stm32l053xx.s ,ST官方的程序注释的真详细啊。直接读注释就知道,
这个startup_stm32l053xx.s调用了system_stm32l0xx.c 做初始化,然后调用Blinky.c中main函数。也就是先boot起板子上的设备,然后跑应用程序。
;******************** (C) COPYRIGHT 2014 STMicroelectronics ********************
;* File Name : startup_stm32l053xx.s
;* Author : MCD Application Team
;* Date : 15-April-2014
;* Description : STM32l053xx Devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Branches to __main in the C library (which eventually
;* calls main()).
;******************************************************************************
* @file system_stm32l0xx.c
* @authorMCD Application Team
* @version V1.0.0RC1
* @date 15-April-2014
* @brief CMSIS Cortex-M0+ Device Peripheral Access Layer System Source File.
*
* This file provides two functions and one global variable to be called from
* user application:
* - SystemInit(): This function is called at startup just after reset and
* before branch to main program. This call is made inside
* the "startup_stm32l0xx.s" file.
看date 2014年4月,好新鲜的代码哦,还在半年保质期内 ;)
好了还是回归正题说这个开发板,今天下午连上电脑,突然发现,坑爹啊,居然是mini usb接口,而不是如今Android手机都使用的micro usb接口!对于一块在2014年出来的板子,使用mini usb接口,实在让我觉得有点不理解。从抽屉里面翻出一根mini usb的线,乖乖,头子上都有锈迹了。
连上板子和电脑,安装驱动,会不止添加一个设备,最后还添加了一个虚拟串口,因为安装界面一闪而过,这个当时没有特别注意。
然后我就在keil 这个集成开发环境里面,打开Blinky这个工程,然后编译,download程序到板子。一路pass,官方的东西合作的亲密无间啊,看的到的是板上的led闪闪,可是那个“hello world”去哪儿了。
读程序Serial.c,里面有一句注释,太贴心了:
void SER_Initialize (void) {
/* Configure PA3 to USART2_RX, PA2 to USART2_TX */
串口的RX是PA3, 串口的TX是PA2。虽然本人是个软件工程师,可是串口没少用过,232的2、3、 5脚还是熟悉的。另外以本人刷路由器,刷卫星接收机的经验,TTL电平也是略懂的。于是我抄出TTL 转USB虚拟串口的小板,然后就准备拿杜邦线往nucleo开发板的PA2、 PA3上接。
哪里是PA2 、PA3呢?这个时候又发现Keil的这个MDK跟ST的这块板子有多亲了,在Books里面,直接就列出了Board Data Books, 鼠标一点,书就到眼前来。
其中5.8节
The USART2 interface available on PA2 and PA3 of the STM32 microcontroller can be connected to ST-LINK MCU, STMicroelectronics Morpho connector or to Arduino connector. The choice can be changed by setting the related solder bridges. By default the USART2 communication between the target MCU and ST-LINK MCU is enabled in order to support Virtual Com Port for mbed (SB13 and SB14 ON, SB62 and SB63 OFF).
大致就是,这块nucleo 板子上有两块MCU, 一块就核心干活的 STM32L053R8, 另外有一块ST-LINK,我猜这后面一块负责了用usb连接下载调试通讯什么的,关键是后面这块MCU连接上了核心MCU的PA2、PA3脚,并把这两个脚的数据虚拟成了一个串口!
(这里又发现一个坑爹的事情,如果不希望PA2、PA3 被STLINK接管,而是通过板上的接线端子连接访问,需要自己焊接处理板子反面的SB开头的那几个电阻(0欧姆?),这对只会敲键盘,不会烧电烙铁的我可不是个容易的事情)
于是在自己的电脑上,硬件管理器里面一看,果然有安装的时候没有太注意的那个STLink虚拟串口,记下串口号码com7, 打开串口调试软件,设置成com7, 结果期待的”hello world"还是没有出现。再看程序,原来波特率是115200,串口调试软件里面默认打开是9600. 修改以后,熟悉的“hello world”一行行的刷出来了。
<ignore_js_op>
USARTx->BRR= __USART_BRR(32000000ul, 115200ul);/* 115200 baud @ 32MHz */
从一个软件工程师的角度,这个例子程序是非常有参考借鉴意义的,因为可以通过printf将中间结果打印当做调试输出,而这块nucleo开发板直接就能够把调试结果通过虚拟串口输出,不需要用户额外的自己接TTL转USB等。
一下午就玩了这么点东西。基本上属于没好好读完官方指导文档就撸了袖子上手,碰到问题才查查资料,可就这样,也把这块板子欢快的跑起例子程序了。可见这块板子是非常方便开发者使用的。