96Boards扩展板 STM32 B96B-F446VE 牛刀小试

前言

原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。

本文使用Markdown写成,为获得更好的阅读体验和正常的链接、图片显示,请访问我的博客原文:

http://www.cnblogs.com/sjqlwy/p/st_puzzle.html

这块B96B-F446VE(以下简称stm96)官方缺少相关例程和应用资料,网上别人分享的项目也很匮乏,所以上手stm96的过程中走了很多弯路,这里记录如下。

1、文档资料汇总

首先是意法半导体产品页面,资料很详细(需要注册下载),这里特地讲一下各个文件:

  • TN1235 :ST-Link基本介绍,包括虚拟串口(VCP)的说明。
  • UM1959 :用户手册,注意不是应用手册,主要是该扩展板的技术参数,非常有用
  • B-F446E-96B01A BOM : Bill of Materials,物料表,可以知道具体的原件。
  • B-F446E-96B01A schematics pack :电路图,非常有用
  • ST-Link 固件和驱动下载 :有些功能需要升级到最新固件
  • STM32 ST-LINK Utility:非常有用的工具,之前有所介绍。

其次是Mbed的开发板页面,也有很多参考信息:

其他参考网站:

2、开发工具

个人了解到的开发IDE有:

  • Keil | 流行的开发工具,收费
  • mbed online | ARM官推,在线免费使用
  • Arduino IDE (stm32duino) |基于stm32duino项目,免费
  • CooCox IDE | 基于Eclipse和gcc,免费

由于个人不喜欢在电脑里安装太多软件,另外想要Linux CLI终端、Windows GUI图形切换时不费劲,所以想要找一个通用(支持多种开发板)且跨平台的开发环境,最后找到了PlatformIO

platformio-logo.17fdc3bc.png

90fd3da6gy1fkdlimi90mj20uw079mzd.jpg

可以看到它支持市面上各种常见平台的开发,真正Use whenever. Run everywhere.

PlatformIO核心是Platform Core,使用该命令行程序即可以使用大多数功能。此外,它还可以集成到多种流行的编辑器中,比如Atom、Visual Studio Code、Sublime Text、Vim等。这里我们以VSC为例。

安装VSC之后,在扩展界面搜索并安装PlatformIO IDE即可,另外一个Jun Han制作的PlatformIO扩展也不错。

90fd3da6gy1fkdlp3q4z9j20o10bedhm.jpg

建议额外安装vscode-icons扩展。

90fd3da6gy1fkdly71irfj218g0nwtcj.jpg

正常安装之后即可以看到左下角多出一排按钮,启动vsc也会看到程序主界面。

3、小试牛刀

点击New Project,开发板选择B96B,开发框架支持mbedSTM32Cube,以mbed为例。

90fd3da6gy1fkdm2yzqcnj20gp0a2aae.jpg

点灯及串口通讯代码如下:

#include "mbed.h"
//初始化一个串口,这里使用ST-Link默认的虚拟串口,串口调试设置为9600-8-N-1,流控制:无。
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut myled(LED1);

init main(){
    //pc.baund(19200);
    while(1){
        pc.printf("Hello World\n");
        myled = !myled;
        wait(1);
    }
}

90fd3da6gy1fke82t2bzrj218g0nwadd.jpg

【编译上传】a.首次编译固件会额外编译mbed os,耗时较长,后面就好了;b.默认会将firmware.bin自动拷贝到stm96存储空间里,但是我这里有问题,拷贝失败(虽然显示success)?没有reset?总之我是用ST-Link Utility手动上传的,生成的bin文件可以右击选择在资源管理器打开。

3.1 代码简述

  1. Serial xx(tx, rx) | 参考mbed手册,可以使用指定串口,tx在前,rx在后。

  2. 参考原理图及PinNames.h,可知SERIAL_TX = PC_10 = USBTX,SERIAL_RX = PC_11 = USBRX。

    90fd3da6gy1fke8e05c68j20ku0c40vs.jpg

    【f446的uart4与st-link相连,由st-link的虚拟串口与PC连接】

  3. 板载用户资源引脚(计LED x 3;button x 1):

    LED1PD_10
    LED2LED1
    LED3PD_11
    LED4PD_12
    LED_REDLED1
    USER_BUTTONPD_13
    BUTTON1USER_BUTTON
  4. 虚拟串口的默认波特率为9600,也可以手动设置。

  5. 程序效果为:每秒钟串口输出Hellow World,并且红色LED闪灭。

  6. 串口调试可以用Xshell、AiThinker Serial Tool 或者 platformio for VSC自带的。

  7. platformio串口波特率默认9600,可以通过platformio.ini修改

  8. 除了mbed框架,platformio还支持stm32cube框架编程。

3.2 点灯也出错?教练这剧本不对啊!

初起看到灯闪了也没啥,结果串口调试总是不对,9600波特率显示乱码,调整为19200显示正确。搜索问题时发现19200为9600的两倍。再回头去看LED1闪灭频率,调整为10s,结果数下来5秒就交替闪灭,这里面一定有问题!由于对于STM32相关开发还是小白状态,为了解决问题查看了大量资料,最后猜测是系统时钟问题。

发现问题

解决问题

现在我们怀疑mbed使用了外部晶振,而且频率设置可能错了。查看BOM和PCB文件:

90fd3da6gy1fkebstusblj2148023jrl.jpg

【板载三颗晶振】

90fd3da6gy1fkebtoz733j218g0nwjyl.jpg

【PCB文件显示晶振位置】

90fd3da6gy1fkebypm50qj20er0b3ab1.jpg

【原理图】OSC=OSCILLATOR 振荡器

对比原理图,可知X1附属于ST-Link,X2和X3附属于STM32F446主芯片。那么X2和X3是什么作用呢(后来知道X3一般为外部晶振)?

查阅以下文章STM32时钟配置STM32 系統時脈介紹,捋了捋思路,对照STM32F446芯片手册,终于搞明白了。

  1. HSI是STM32F446高速内部时钟,RC振荡器,频率为8MHz。
  2. HSE是高速外部时钟,X3石英振荡器,频率为16MHz。
  3. LSE是低速外部时钟,接频率为32.768kHz的X2石英晶体。

16/8=2,正好两倍关系。这时我们看到ST官方Wiki页面Automatic clock configuration,按图索骥:

  • .platformio\packages\framework-mbed\targets\TARGET_STM\TARGET_STM32F4\TARGET_STM32F446xE\TARGET_B96B_F446VE目录下的system_clock.c文件,可以看到

    /* Select the clock sources (other than HSI) to start with (0=OFF, 1=ON) */
    #define USE_PLL_HSE_EXTC (0) /* Use external clock */
    #define USE_PLL_HSE_XTAL (1) /* Use external xtal */

    提示mbed正在使用外部时钟。

  • .platformio\packages\framework-mbed\targets\TARGET_STM\TARGET_STM32F4\device目录下的stm32f4xx_hal_conf.h文件,可以看到

    /* ########################## HSE/HSI Values adaptation ##################### */
    /**
      * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
      *        This value is used by the RCC HAL module to compute the system frequency
      *        (when HSE is used as system clock source, directly or through the PLL).
      */
    #if !defined  (HSE_VALUE)
      // #define HSE_VALUE    ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
      #define HSE_VALUE    ((uint32_t)16000000U) /*!< Value of the External oscillator in Hz */
    #endif /* HSE_VALUE */

    问题明了了,默认外部晶振频率为8MHz,我们手动修改为16MHz,先clean重新编译,闪灭时间和串口波特率终于正常了,问题解决。.platformio在当前用户文件夹下,如C:\Users\yourname\

转载于:https://www.cnblogs.com/sjqlwy/p/st_puzzle.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值