正点原子F407核心板上手指南



简介

img

  • MCU: STM32F407ZET6
  • SRAM: 1MiB
  • 更多介绍: 淘宝店铺介绍
  • 电路板目录: XuanWuOS/xwbd/atkf407core

开发环境

搭建环境

下载工程

git clone --recursive https://gitee.com/xwos/atkf407core.git
cd atkf407core
unzip project-template.zip
  • 工程需放在STM32CubeIDE的工作目录内(即STM32CubeIDE启动时指定的目录), 并按照上面的命令将“project-template.zip”解压到工程目录中, 这些文件为工程模板。

img

  • 已有工程,同步命令:
cd atkf407core
git pull
git submodule update

导入工程

打开菜单File --> Import... --> General --> Projects from Folder or Archive

img

重新设置编译环境

  • 打开菜单"Project --> Properties --> C/C++ Build --> Environment"
  • 点击"Restore Defaults"
  • 参考《工程配置指南》 中的 “使用STM32CubeIDE进行开发 -- 编译环境设置” 以及 "使用STM32CubeIDE进行开发 -- 设置工具链为GNU MCU Eclipse提供的工具链" 重新设置环境变量。
Debug编译环境设置

img

Release编译环境设置

img

Linux下的环境变量PATH设置

img

Windows下的环境变量PATH设置

img


编译

img


调试

打开菜单Run --> Debug Configurations...,根据仿真器类型,选择调试配置:

  • atkf407core-openocd-daplinkgdb + openocd + DAPLink调试器
  • atkf407core-openocd-jlinkgdb + openocd + JLink调试器
  • atkf407core-stlinkgdb + STLink GDB Server + JLink调试器

img

步骤

  • 使用MicroUSB线连接电路板上的USB-232接口与PC;

img

  • 打开终端工具(windows可选putty、SecretCRT,Linux可选gtkterm、picocom、minicom), 但先不要在终端工具中打开串口,否则MCU会进入下载模式;
  • 上电,STM32CubeIDE中启动调试,等待MCU运行到初始断点;
  • 在终端工具中打开串口,参数:1M波特率/8位数据/1位停止位/无奇偶校验;
  • 开始单步调试或连续运行调试。

技巧

1.复位系统

因为板子的调试接口是4线SWD,与调试器之间没有复位线连接,经常无法完成自动复位, 时常发生在下载完程序,等待MCU运行到初始断点处时。可按以下步骤处理:

  • 在程序的初始化流程中设置一个断点,例如xwos_main()函数内部;
  • 若MCU处于停止运行状态,需要让MCU处于运行状态:

img

  • 手动按一下板子上的复位按键,此时MCU可停在预设的断点处。
2.关闭写缓存

ARMv7-m4内核的MCU带有写缓存,常常会对定位程序BUG带来困扰,可以在调试时关闭。

/* xwbd/atkf407core/bm/stm32cube/mif.c */

__xwbsp_init_code
void stm32cube_lowlevel_init(void)
{
        ...
        cm_scs.scnscb.actlr.bit.disdefwbuf = 1; /* disdefwbuf位置1关闭写缓存 */
        ...
}

示例

玄武OS中有多个示例可帮助用户快速了解API的用法:

  • 线程
    • 创建线程:xwam/example/thread/create
    • 线程睡眠:xwam/example/thread/sleep
  • 定时器:xwam/example/timer
  • 同步
    • 信号量:xwam/example/sync/semaphore
    • 条件量:xwam/example/sync/condition
    • 事件信号旗:xwam/example/sync/flag
    • 线程栅栏:xwam/example/sync/barrier
    • 信号选择器:xwam/example/sync/selector
  • 临界区管理
    • 中断管理:xwam/example/lock/cpuirq
    • 自旋锁:xwam/example/lock/spinlock
    • 顺序锁:xwam/example/lock/seqlock
    • 互斥锁:xwam/example/lock/mutex
  • 内存管理
    • 简单内存分配器:xwam/example/mm/sma
    • 内存切片分配器:xwam/example/mm/memslice
    • 伙伴算法分配器:xwam/example/mm/bma
    • 内存池:只用于比较大的内存区域的管理,例如外接的SRAM。 atkf407core工程已经为板载的SRAM建立了内存池。

每个示例中都有一个xxx_start()函数,可在xwbd/atkf407core/bm/main/main.c文件中的 主线程main_thrd()中调用这些函数启动示例,但最好一次只启动一个示例,避免冲突。

/* xwbd/atkf407core/bm/main/main.c */

xwer_t main_thrd(void * arg)
{
        ...
        example_flag_start();
        ...

        return XWOK;
}

系统集成的原理

  • 玄武OS是高度模块化设计,非常强调代码的复用性,因此玄武OS提供了一个编译系统来 集成各种各样的软件。
  • 所有移植的第三方组件、驱动包、示例代码等都是以玄武模块的形式独立编译成 静态库.a,之后再将它们链接成ELF文件,再由ELF生成bin或Hex文件。
  • 玄武模块的设计思想借鉴了安卓系统的Android.mk,因此每个玄武模块 中都有一个xwmo.mk文件。
  • 每个玄武模块都是独立编译的,每个xwmo.mk中定义的编译参数头文件搜索路径只对当前玄武模块有效。因此,当其他玄武模块想要引入 当前玄武模块的某个头文件时,极有可能因为编译配置不同,导致头文件内 的子头文件搜索不到而编译失败。
  • 每个玄武模块即为一个封闭的包,因此,开发者需要对外提供接口头文件, 以便其他玄武模块调用。这些接口头文件只能包含外部可见的子头文件类型定义以及API接口。例如,工程中,电路板模块(xwbd/atkf407core/bm) 内有很多玄武模块内都包含了一个名为mif.h的头文件, 名字的意思是模块接口(Module InterFace)
  • 电路板模块(xwbd/atkf407core/bm)内有一个主模块main,提供xwos_main() 函数,此模块功能类似于传统C语言的main()函数,作用是将所有玄武模块集成 在一起。
  • 玄武OS内包含了大量玄武模块,例如xwam内包含了示例与一些应用,xwmd内 包含了中间件,xwem包含了移植的第三方开源软件。这些玄武模块对所有xwbd内 的开发板理论上都是复用的。
  • 有关玄武模块可以参考应用手册——构建系统

功能

  • BSP
    • STM32Cube模块:xwbd/atkf407core/bm/stm32cube
    • STM32CubeMX配置文件:xwbd/atkf407core/bm/stm32cube/cubemx/atkf407core.ioc
    • STM32CubeMX生成源码目录:xwbd/atkf407core/bm/stm32cube/cubemx
    • STM32Cube适配玄武OS的源码:xwbd/atkf407core/bm/stm32cube/xwac
    • 终端UART
      • 设备:USART1
      • 参数:1M波特率/8位数据/1位停止位/无奇偶校验
      • 驱动
        • 驱动框架 —— 设备栈:xwmd/ds/uart/dma.c
        • 设备栈驱动:xwbd/atkf407core/bm/stm32cube/xwac/xwds/uart.c
        • HAL库驱动:xwbd/atkf407core/bm/stm32cube/cubemx/Core/Src/usart.c
    • SRAM
      • 映射地址:0x68000000
      • 大小:1MiB
      • 驱动:xwbd/atkf407core/bm/stm32cube/cubemx/Core/Src/fsmc.c
      • 内存池
        • 头文件
          • xwbd/atkf407core/bm/stm32cube/mif.h
          • xwos/mm/mempool/allocator.h
        • 内存池对象:sram_mempool
        • 申请:xwmm_mempool_malloc(sram_mempool, ...)
        • 释放:xwmm_mempool_free(sram_mempool, ...)
        • 重新申请:xwmm_mempool_realloc(sram_mempool, ...)

附录