[二] Nuttx移植-星瞳pyboard開發板

一、Nuttx配置文件

  1. Nuttx配置文件位置:
    - 位於nuttx/configs內部的各個文件夾中,一個文件夾對應一個開發板。比如,stm32f4discovery這樣的stm官方發佈的開發板。但是自帶的開發板的配置文件中並沒有我手上這塊星瞳的pyboard stm32f405rgt6開發板的配置文件。所以要自己配置咯。
  2. Nuttx配置文件的作用:
    1. include/board.h : 因爲nuttx有對於許多設備的驅動,比如pwm,i2c,UART,usb-otg,SD-card等等,那這些驅動,肯定有引腳對應關係,比如,STM32F405RGT6,有六個USART其中有兩個是UART,那麼這裏的UART1(2,3,4,5,6)的RX,和TX分別對應哪個引腳,這是需要在配置文件中進行指定的。這樣你在Nuttx程序開發時,就可以直接使用GPIO_USART1_RX這樣的宏定義這樣帶來的好處顯而易見,對於程序的可移植性帶來很大幫助。
    2. include/board.h: 當然在配置文件中你除了配置外設之外,還有系統內部的一些東西的配置,比如系統時鐘的配置(各分頻的配置,等等),定時器的配置,DMA的配置。
    3. nsh/defconfig : 前面1,2中說的作用都是跟開發板或者芯片有關的配置項,那麼對於Nuttx操作系統當然也有對應的配置文件,這一點類似於Linux。可以對各種驅動,進行刪減和增加支持,對於自帶的Shell進行配置,對系統啓動程序加載的配置。
    4. scripts/*:這裏面放的是對應的.ld文件,我沒學過STM32,但是打開看看,大概能知道,這個裏面是對於STM32的flash,sram的大小的說明,也就是內存分佈的配置,並且對於其中的section(段)的配置,就類似於PC中,一個程序內存裏面數據段,代碼段這樣子。
    5. kernel/*: 應該跟Nuttx內核的內存分佈的初始化有關。
    6. Kconfig: 跟Linux一樣的,構建配置文件,Linux的我也沒學過,反正就是個配置文件,大部分的板子的這個配置文件基本都一個樣,所以暫時可以不用管。
    7. src/*:這裏也就是代碼文件夾,比如啓動時,執行什麼代碼,app初始化代碼等等。也就是從這裏去調用你編寫的app的入口函數。從而達到,nuttx啓動自動執行你的app的目的。畢竟總不能先插個串口轉USB到電腦,然後到nuttx控制檯去啓動你的程序吧。

二、構建自己的配置文件

  • include
    • /board.h
  • kernel
  • nsh
    • defconfig
  • scripts
  • src
  • Kconfig

1. include/board.h文件構建

board.h文件由於是主控芯片時鐘,外設等的配置文件,那麼也可以在omnibusf4的基礎上進行修改。因爲,omnibusf4的外部晶振使用的是8Mhz的,而我的星瞳pyboard的開發板的外部晶振是12Mhz的,所以要修改一下時鐘配置的那個部分。由於這個塊板子是可以運行micropython的,所以我參考了micropython中對pyboardV1.1的外設的配置文件mpconfigboard.h

#define GPIO_USART1_RX  GPIO_USART1_RX_2       /* PB7 */
#define GPIO_USART1_TX  GPIO_USART1_TX_2       /* PB6  */

這個引腳定義的配置是根據arch/arm/src/stm32/hardware/stm32f40xxx_pinmap.h這個文件中的宏定義配置出來的比如上面的GPIO_USART1_RX_2在pinmap.h中這樣定義的。如果你是其他芯片你看對應的pinmap.h文件就好。

#define GPIO_USART1_RX_1      (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN10)
#define GPIO_USART1_RX_2      (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN7)
#define GPIO_USART1_TX_1      (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN9)
#define GPIO_USART1_TX_2      (GPIO_ALT|GPIO_AF7|GPIO_PULLUP|GPIO_SPEED_100MHz|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN6)

其中GPIO_USART1_RX_2是對應PB7,因爲(GPIO_PORTB | GPIO_PIN7)PORTB代表是B。
於是配置好的board.h如下(還沒有配置SD和USB-OTG)

/************************************************************************************
 * configs/xingtong-pyboard/include/board.h
 *
 *   Copyright (C) 2019 Hotice0 All rights reserved.
 *   Author: Hotice0 <[email protected]>
 *
 ************************************************************************************/

#ifndef __CONFIG_XINGTONG_PYBOARD_INCLUDE_BOARD_H
#define __CONFIG_XINGTONG_PYBOARD_INCLUDE_BOARD_H

/************************************************************************************
 * Included Files
 ************************************************************************************/

#include <nuttx/config.h>

#ifndef __ASSEMBLY__
#  include <stdint.h>
#  include <stdbool.h>
#endif

/************************************************************************************
 * Pre-processor Definitions
 ************************************************************************************/

/* Clocking *************************************************************************/
/* The STM32F405RGT6 XINGTONG_PYBOARD board features a single 12MHz crystal.  Space is provided
 * for a 32kHz RTC backup crystal, but it is not stuffed.
 *
 * This is the canonical configuration:
 *   System Clock source           : PLL (HSE)
 *   SYSCLK(Hz)                    : 168000000    Determined by PLL configuration
 *   HCLK(Hz)                      : 168000000    (STM32_RCC_CFGR_HPRE)
 *   AHB Prescaler                 : 1            (STM32_RCC_CFGR_HPRE)
 *   APB1 Prescaler                : 4            (STM32_RCC_CFGR_PPRE1)
 *   APB2 Prescaler                : 2            (STM32_RCC_CFGR_PPRE2)
 *   HSE Frequency(Hz)             : 12000000      (STM32_BOARD_XTAL)
 *   PLLM                          : 8            (STM32_PLLCFG_PLLM)
 *   PLLN                          : 336          (STM32_PLLCFG_PLLN)
 *   PLLP                          : 2            (STM32_PLLCFG_PLLP)
 *   PLLQ                          : 7            (STM32_PLLCFG_PLLQ)
 *   Main regulator output voltage : Scale1 mode  Needed for high speed SYSCLK
 *   Flash Latency(WS)             : 5
 *   Prefetch Buffer               : OFF
 *   Instruction cache             : ON
 *   Data cache                    : ON
 *   Require 48MHz for USB OTG FS, : Enabled
 *   SDIO and RNG clock
 */

/* HSI - 16 MHz RC factory-trimmed
 * LSI - 32 KHz RC
 * HSE - On-board crystal frequency is 12MHz
 * LSE - 32.768 kHz
 */

#define STM32_BOARD_XTAL        12000000ul

#define STM32_HSI_FREQUENCY     16000000ul
#define STM32_LSI_FREQUENCY     32000
#define STM32_HSE_FREQUENCY     STM32_BOARD_XTAL
#define STM32_LSE_FREQUENCY     32768

/* Main PLL Configuration.
 *
 * PLL source is HSE
 * PLL_VCO = (STM32_HSE_FREQUENCY / PLLM) * PLLN
 *         = (12,000,000 / 12) * 336
 *         = 336,000,000
 * SYSCLK  = PLL_VCO / PLLP
 *         = 336,000,000 / 2 = 168,000,000
 * USB OTG FS, SDIO and RNG Clock
 *         =  PLL_VCO / PLLQ
 *         = 48,000,000
 */

#define STM32_PLLCFG_PLLM       RCC_PLLCFG_PLLM(12)
#define STM32_PLLCFG_PLLN       RCC_PLLCFG_PLLN(336)
#define STM32_PLLCFG_PLLP       RCC_PLLCFG_PLLP_2
#define STM32_PLLCFG_PLLQ       RCC_PLLCFG_PLLQ(7)

#define STM32_SYSCLK_FREQUENCY  168000000ul

/* AHB clock (HCLK) is SYSCLK (168MHz) */

#define STM32_RCC_CFGR_HPRE     RCC_CFGR_HPRE_SYSCLK  /* HCLK  = SYSCLK / 1 */
#define STM32_HCLK_FREQUENCY    STM32_SYSCLK_FREQUENCY
#define STM32_BOARD_HCLK        STM32_HCLK_FREQUENCY  /* same as above, to satisfy compiler */

/* APB1 clock (PCLK1) is HCLK/4 (42MHz) */

#define STM32_RCC_CFGR_PPRE1    RCC_CFGR_PPRE1_HCLKd4     /* PCLK1 = HCLK / 4 */
#define STM32_PCLK1_FREQUENCY   (STM32_HCLK_FREQUENCY/4)

/* Timers driven from APB1 will be twice PCLK1 */

#define STM32_APB1_TIM2_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM3_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM4_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM5_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM6_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM7_CLKIN   (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM12_CLKIN  (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM13_CLKIN  (2*STM32_PCLK1_FREQUENCY)
#define STM32_APB1_TIM14_CLKIN  (2*STM32_PCLK1_FREQUENCY)

/* APB2 clock (PCLK2) is HCLK/2 (84MHz) */

#define STM32_RCC_CFGR_PPRE2    RCC_CFGR_PPRE2_HCLKd2     /* PCLK2 = HCLK / 2 */
#define STM32_PCLK2_FREQUENCY   (STM32_HCLK_FREQUENCY/2)

/* Timers driven from APB2 will be twice PCLK2 */

#define STM32_APB2_TIM1_CLKIN   (2*STM32_PCLK2_FREQUENCY)
#define STM32_APB2_TIM8_CLKIN   (2*STM32_PCLK2_FREQUENCY)
#define STM32_APB2_TIM9_CLKIN   (2*STM32_PCLK2_FREQUENCY)
#define STM32_APB2_TIM10_CLKIN  (2*STM32_PCLK2_FREQUENCY)
#define STM32_APB2_TIM11_CLKIN  (2*STM32_PCLK2_FREQUENCY)

/* Timer Frequencies, if APBx is set to 1, frequency is same to APBx
 * otherwise frequency is 2xAPBx.
 * Note: TIM1,8 are on APB2, others on APB1
 */

#define BOARD_TIM1_FREQUENCY    STM32_APB2_TIM1_CLKIN
#define BOARD_TIM2_FREQUENCY    STM32_APB1_TIM2_CLKIN
#define BOARD_TIM3_FREQUENCY    STM32_APB1_TIM3_CLKIN
#define BOARD_TIM4_FREQUENCY    STM32_APB1_TIM4_CLKIN
#define BOARD_TIM5_FREQUENCY    STM32_APB1_TIM5_CLKIN
#define BOARD_TIM6_FREQUENCY    STM32_APB1_TIM6_CLKIN
#define BOARD_TIM7_FREQUENCY    STM32_APB1_TIM7_CLKIN
#define BOARD_TIM8_FREQUENCY    STM32_APB2_TIM8_CLKIN
#define BOARD_TIM9_FREQUENCY    STM32_APB2_TIM9_CLKIN
#define BOARD_TIM10_FREQUENCY   STM32_APB2_TIM10_CLKIN
#define BOARD_TIM11_FREQUENCY   STM32_APB2_TIM11_CLKIN
#define BOARD_TIM12_FREQUENCY   STM32_APB1_TIM12_CLKIN
#define BOARD_TIM13_FREQUENCY   STM32_APB1_TIM13_CLKIN
#define BOARD_TIM14_FREQUENCY   STM32_APB1_TIM14_CLKIN

/* SDIO dividers.  Note that slower clocking is required when DMA is disabled
 * in order to avoid RX overrun/TX underrun errors due to delayed responses
 * to service FIFOs in interrupt driven mode.  These values have not been
 * tuned!!!
 *
 * SDIOCLK=48MHz, SDIO_CK=SDIOCLK/(118+2)=400 KHz
 */

#define SDIO_INIT_CLKDIV        (118 << SDIO_CLKCR_CLKDIV_SHIFT)

/* DMA ON:  SDIOCLK=48MHz, SDIO_CK=SDIOCLK/(1+2)=16 MHz
 * DMA OFF: SDIOCLK=48MHz, SDIO_CK=SDIOCLK/(2+2)=12 MHz
 */

#ifdef CONFIG_SDIO_DMA
#  define SDIO_MMCXFR_CLKDIV    (1 << SDIO_CLKCR_CLKDIV_SHIFT)
#else
#  define SDIO_MMCXFR_CLKDIV    (2 << SDIO_CLKCR_CLKDIV_SHIFT)
#endif

/* DMA ON:  SDIOCLK=48MHz, SDIO_CK=SDIOCLK/(1+2)=16 MHz
 * DMA OFF: SDIOCLK=48MHz, SDIO_CK=SDIOCLK/(2+2)=12 MHz
 */

#ifdef CONFIG_SDIO_DMA
#  define SDIO_SDXFR_CLKDIV     (1 << SDIO_CLKCR_CLKDIV_SHIFT)
#else
#  define SDIO_SDXFR_CLKDIV     (2 << SDIO_CLKCR_CLKDIV_SHIFT)
#endif

/* DMA Channl/Stream Selections *****************************************************/
/* Stream selections are arbitrary for now but might become important in the future
 * is we set aside more DMA channels/streams.
 *
 * SDIO DMA
 *   DMAMAP_SDIO_1 = Channel 4, Stream 3 <- may later be used by SPI DMA
 *   DMAMAP_SDIO_2 = Channel 4, Stream 6
 */

#define DMAMAP_SDIO DMAMAP_SDIO_1

// UART/USART
#define GPIO_USART1_RX  GPIO_USART1_RX_2       /* PB7 */
#define GPIO_USART1_TX  GPIO_USART1_TX_2       /* PB6  */
#define GPIO_USART2_RX  GPIO_USART2_RX_1       /* PA3 */
#define GPIO_USART2_TX  GPIO_USART2_TX_1       /* PA2  */
#define GPIO_USART2_CTS GPIO_USART2_CTS_1      /* PA0 */
#define GPIO_USART2_RTS GPIO_USART2_RTS_1      /* PA1 */
#define GPIO_USART3_RX  GPIO_USART3_RX_1       /* PB11 */
#define GPIO_USART3_TX  GPIO_USART3_TX_1       /* PB10 */
#define GPIO_USART3_CTS GPIO_USART3_CTS_1      /* PB13 */
#define GPIO_USART3_RTS GPIO_USART3_RTS_1      /* PB14 */
#define GPIO_UART4_RX  GPIO_UART4_RX_1         /* PA1 */
#define GPIO_UART4_TX  GPIO_UART4_TX_1         /* PA0 */
#define GPIO_USART6_RX  GPIO_USART6_RX_1       /* PC7 */
#define GPIO_USART6_TX  GPIO_USART6_TX_1       /* PC6 */

/* UART RX DMA configurations */
#define DMAMAP_USART1_RX DMAMAP_USART1_RX_2
#define DMAMAP_USART6_RX DMAMAP_USART6_RX_1

// I2C busses
#define GPIO_I2C1_SCL     GPIO_I2C1_SCL_1      /* PB6 */
#define GPIO_I2C1_SDA     GPIO_I2C1_SDA_1      /* PB7 */
#define GPIO_I2C2_SCL     GPIO_I2C2_SCL_1      /* PB10 */
#define GPIO_I2C2_SDA     GPIO_I2C2_SDA_1      /* PB11 */

// SPI busses 
#define GPIO_SPI1_MISO    GPIO_SPI1_MISO_1  /* PA6 */
#define GPIO_SPI1_MOSI    GPIO_SPI1_MOSI_1  /* PA7 */
#define GPIO_SPI1_NSS     GPIO_SPI1_NSS_2   /* PA4 */
#define GPIO_SPI1_SCK     GPIO_SPI1_SCK_1   /* PA5 */
#define GPIO_SPI2_MISO    GPIO_SPI2_MISO_1  /* PB14 */
#define GPIO_SPI2_MOSI    GPIO_SPI2_MOSI_1  /* PB15 */
#define GPIO_SPI2_NSS     GPIO_SPI2_NSS_1   /* PB12 */
#define GPIO_SPI2_SCK     GPIO_SPI2_SCK_2   /* PB13 */

// CAN busses
#  define GPIO_CAN1_RX GPIO_CAN1_RX_2       /* PB8 */
#  define GPIO_CAN1_TX GPIO_CAN1_TX_2       /* PB9 */
#  define GPIO_CAN2_RX GPIO_CAN2_RX_1       /* PB12 */
#  define GPIO_CAN2_TX GPIO_CAN2_TX_1       /* PB13 */

/* microSD Connector:
 *
 *   ----------------- ----------------- ------------------------
 *   SD/MMC CONNECTOR        BOARD        GPIO CONFIGURATION(s
 *   PIN SIGNAL             SIGNAL          (no remapping)
 *   --- ------------- ----------------- -------------------------
 *   1   DAT2/RES      SD_D2/USART3_TX/  PC10 GPIO_SDIO_D2
 *                     SPI3_SCK
 *   2   CD/DAT3/CS    SD_D3/USART3_RX/  PC11 GPIO_SDIO_D3
 *                     SPI3_MISO
 *   3   CMD/DI        SD_CMD            PD2  GPIO_SDIO_CMD
 *   4   VDD           N/A               N/A
 *   5   CLK/SCLK      SD_CLK/SPI3_MOSI  PC12 GPIO_SDIO_CK
 *   6   VSS           N/A               N/A
 *   7   DAT0/D0       SD_D0/DCMI_D2     PC8  GPIO_SDIO_D0
 *   8   DAT1/RES      SD_D1/DCMI_D3     PC9  GPIO_SDIO_D1
 *   --- ------------- ----------------- -------------------------
 *
 *   NOTES:
 *   1. DAT4, DAT4, DAT6, and DAT7 not connected.
 *   2. There are no alternative pin selections.
 *   3. There is no card detect (CD) GPIO input so we will not
 *      sense if there is a card in the SD slot or not.  This will
 *      make usage very awkward.
 */

#endif  /* __CONFIG_XINGTONG_PYBOARD_INCLUDE_BOARD_H */

2. kernel && scripts 構建

由於其中有一個開發板,omnibusf4的開發板使用的也是STM32F405RGT6的主控芯片,所以kernel和scripts這兩個文件夾的文件,可以直接從那裏複製過來。因爲這個只跟主控芯片有關和開發板無關。

3. nsh/defconfig 構建

這個文件模仿omnibusf4的修改就好,這裏配置的其實是一些環境變量。至於有哪些配置項,該項是什麼作用,你可以在http://nuttx.org/Documentation/NuttXConfigVariables.html中找到。

我配置好的defconfig如下

#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_ARCH_LEDS is not set
# CONFIG_MMCSD_HAVE_CARDDETECT is not set
# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set
# CONFIG_MMCSD_MMCSUPPORT is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDPARMS is not set
# CONFIG_NSH_DISABLE_PRINTF is not set
# CONFIG_SPI_CALLBACK is not set
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="xingtong-pyboard"
CONFIG_ARCH_BOARD_XINGTONG_PYBOARD=y
CONFIG_ARCH_CHIP_STM32=y
CONFIG_ARCH_CHIP_STM32F405RG=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARMV7M_LAZYFPU=y
CONFIG_BOARD_LOOPSPERMSEC=16717
CONFIG_BUILTIN=y
CONFIG_DEBUG_ERROR=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_WARN=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_HELLOXX=y
CONFIG_INTELHEX_BINARY=y
CONFIG_MAX_TASKS=16
CONFIG_MAX_WDOGPARMS=2
CONFIG_MM_REGIONS=2
CONFIG_NFILE_DESCRIPTORS=8
CONFIG_NFILE_STREAMS=8
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_MMCSDSPIPORTNO=2
CONFIG_NSH_PROMPT_STRING="chewie> "
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_MQ_MSGS=4
CONFIG_PREALLOC_TIMERS=4
CONFIG_PREALLOC_WDOGS=16
CONFIG_RAM_SIZE=114688
CONFIG_RAM_START=0x20000000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_LPWORK=y
CONFIG_SCHED_WAITPID=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_STM32_DFU=y
CONFIG_STM32_JTAG_FULL_ENABLE=y
CONFIG_STM32_PWM_MULTICHAN=y
CONFIG_STM32_PWR=y
CONFIG_STM32_SPI1=y
CONFIG_STM32_SPI2=y
CONFIG_STM32_TIM1=y
CONFIG_STM32_TIM2=y
CONFIG_STM32_TIM3=y
CONFIG_STM32_TIM4=y
CONFIG_STM32_TIM5=y
CONFIG_STM32_TIM8=y
CONFIG_STM32_TIM9=y
CONFIG_STM32_TIM10=y
CONFIG_STM32_TIM12=y
CONFIG_STM32_USART1=y
CONFIG_STM32_USART3=y
CONFIG_STM32_USART6=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_CXXINITIALIZE=y
CONFIG_SYSTEM_ZMODEM=y
CONFIG_USART1_DMA=y
CONFIG_USART3_SERIAL_CONSOLE=y
CONFIG_USART6_DMA=y
CONFIG_USER_ENTRYPOINT="nsh_main"
CONFIG_WQUEUE_NOTIFIER=y

4.src/* 構建

  1. src/Makefile
############################################################################
# configs/xingtong-pyboard/src/Makefile
############################################################################

-include $(TOPDIR)/Make.defs

ASRCS =
CSRCS = stm32_boot.c stm32_appinit.c stm32_bringup.c

include $(TOPDIR)/configs/Board.mk
  1. src/xingtong-pyboard.h
/****************************************************************************
 * configs/xingtong-pyboard/src/xingtong-pyboard.h
 ****************************************************************************/

#ifndef __CONFIGS_XINGTONG_PYBOARD_SRC_XINGTONG_PYBOARD_H
#define __CONFIGS_XINGTONG_PYBOARD_SRC_XINGTONG_PYBOARD_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>
#include <nuttx/compiler.h>
#include <stdint.h>
#include <arch/stm32/chip.h>

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* Configuration ************************************************************/

/****************************************************************************
 * Public Types
 ****************************************************************************/

/****************************************************************************
 * Public data
 ****************************************************************************/

#ifndef __ASSEMBLY__

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: stm32_bringup
 *
 * Description:
 *   Perform architecture-specific initialization
 *
 *   CONFIG_BOARD_INITIALIZE=y :
 *     Called from board_initialize().
 *
 *   CONFIG_BOARD_INITIALIZE=y && CONFIG_LIB_BOARDCTL=y :
 *     Called from the NSH library
 *
 ****************************************************************************/

int stm32_bringup(void);


#endif /* __ASSEMBLY__ */
#endif /* __CONFIGS_XINGTONG_PYBOARD_SRC_XINGTONG_PYBOARD_H */
  1. src/stm32_boot.c
/****************************************************************************
 * configs/xingtong-pyboard/src/stm32_boot.c
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

#include <debug.h>

#include <nuttx/board.h>
#include <arch/board/board.h>

#include "up_arch.h"
#include "itm.h"

#include "stm32.h"
#include "xingtong-pyboard.h"

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: stm32_boardinitialize
 *
 * Description:
 *   All STM32 architectures must provide the following entry point.  This
 *   entry point is called early in the initialization -- after all memory
 *   has been configured and mapped but before any devices have been
 *   initialized.
 *
 ****************************************************************************/

void stm32_boardinitialize(void)
{

}

/****************************************************************************
 * Name: board_initialize
 *
 * Description:
 *   If CONFIG_BOARD_INITIALIZE is selected, then an additional
 *   initialization call will be performed in the boot-up sequence to a
 *   function called board_initialize().  board_initialize() will be
 *   called immediately after up_initialize() is called and just before the
 *   initial application is started.  This additional initialization phase
 *   may be used, for example, to initialize board-specific device drivers.
 *
 ****************************************************************************/

#ifdef CONFIG_BOARD_INITIALIZE
void board_initialize(void)
{
  /* Perform board-specific initialization */

  (void)stm32_bringup();
}
#endif
  1. src/stm32_app_init.c
/****************************************************************************
 * config/xingtong-pyboard/src/stm32_appinit.c
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

#include <nuttx/board.h>

#include "xingtong-pyboard.h"

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#ifndef OK
#  define OK 0
#endif

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: board_app_initialize
 *
 * Description:
 *   Perform application specific initialization.  This function is never
 *   called directly from application code, but only indirectly via the
 *   (non-standard) boardctl() interface using the command BOARDIOC_INIT.
 *
 * Input Parameters:
 *   arg - The boardctl() argument is passed to the board_app_initialize()
 *         implementation without modification.  The argument has no
 *         meaning to NuttX; the meaning of the argument is a contract
 *         between the board-specific initialization logic and the
 *         matching application logic.  The value cold be such things as a
 *         mode enumeration value, a set of DIP switch switch settings, a
 *         pointer to configuration data read from a file or serial FLASH,
 *         or whatever you would like to do with it.  Every implementation
 *         should accept zero/NULL as a default configuration.
 *
 * Returned Value:
 *   Zero (OK) is returned on success; a negated errno value is returned on
 *   any failure to indicate the nature of the failure.
 *
 ****************************************************************************/

int board_app_initialize(uintptr_t arg)
{
#ifdef CONFIG_BOARD_INITIALIZE

  /* Board initialization already performed by board_initialize() */

  return OK;
#else

  /* Perform board-specific initialization */

  return stm32_bringup();
#endif
}
  1. src/stm32_bringup.c
/****************************************************************************
 * config/xingtong-pyboard/src/stm32_bringup.c
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

#include <sys/mount.h>
#include <stdbool.h>
#include <stdio.h>
#include <debug.h>
#include <errno.h>

#include "xingtong-pyboard.h"

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/


/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: stm32_bringup
 *
 * Description:
 *   Perform architecture-specific initialization
 *
 *   CONFIG_BOARD_INITIALIZE=y :
 *     Called from board_initialize().
 *
 *   CONFIG_BOARD_INITIALIZE=n && CONFIG_LIB_BOARDCTL=y :
 *     Called from the NSH library
 *
 ****************************************************************************/

int stm32_bringup(void)
{
  int ret = OK;
  return ret;
}

5. Kconfig 構建

#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

if ARCH_BOARD_XINGTONG_PYBOARD
endif

三、修改 nuttx/configs/Kconfig文件,把剛剛自己新增的配置文件加入

編輯Kconfig文件加入對應xingtong-pyboard的配置項

config ARCH_BOARD_XINGTONG_PYBOARD
	bool "xingtong-pyboard"
	depends on ARCH_CHIP_STM32F405RG
	---help---
		Xingtong pyboard board based on the STMicro STM32F405RGT6

config ARCH_BOARD
	....
	default "olimex-strp711"           if ARCH_BOARD_OLIMEX_STRP711
	default "olimexino-stm32"          if ARCH_BOARD_OLIMEXINO_STM32
	default "omnibusf4"                if ARCH_BOARD_OMNIBUSF4
	

上面這裏加入
default "xingtong-pyboard" if ARCH_BOARD_XINGTONG_PYBOARD

if ARCH_BOARD_OLIMEXINO_STM32
source "configs/olimexino-stm32/Kconfig"
endif
if ARCH_BOARD_OMNIBUSF4
source "configs/omnibusf4/Kconfig"
endif
if ARCH_BOARD_OPEN1788
source "configs/open1788/Kconfig"
endif

這裏加入

if ARCH_BOARD_XINGTONG_PYBOARD
source "configs/xingtong-pyboard/Kconfig"
endif

四、編譯成bin

  1. 切換到nuttx/tools目錄執行configure.sh
    sudo ./configure.sh xingtong-pyboard/nsh
  2. nuttx目錄下make
    make
.....
CC:  stm32_boot.c
CC:  stm32_appinit.c
CC:  stm32_bringup.c
AR:   stm32_boot.o stm32_appinit.o stm32_bringup.o
make[2]: Leaving directory '/home/parallels/nuttxspace/nuttx/configs/xingtong-pyboard/src'
LD: nuttx
make[1]: Leaving directory '/home/parallels/nuttxspace/nuttx/arch/arm/src'
CP: nuttx.hex
CP: nuttx.bin

五、將.bin刷入到開發板

  1. 短接BOOT和3.3V (這樣啓動纔會進入dfu模式)
  2. 開發板通過ST-Link連接到電腦上
  3. nuttx目錄下執行命令
    sudo openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c init -c "reset halt" -c "flash write_image erase nuttx.bin 0x08000000"
    輸出如下
ash write_image erase nuttx.bin 0x08000000"
Open On-Chip Debugger 0.10.0+dev-00921-g263deb38 (2019-07-21-19:31)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : clock speed 2000 kHz
Info : STLINK V2J31S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.264380
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08000188 msp: 0x200016a8
Info : device id = 0x10076413
Info : flash size = 1024 kbytes
auto erase enabled
wrote 131072 bytes from file nuttx.bin in 5.211191s (24.563 KiB/s)

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections	

六、進入Nuttx Shell控制檯

  1. USB轉串口連接到UART3上(RX3, TX3),因爲在nah/defconfig中配置了一項CONFIG_USART3_SERIAL_CONSOLE=y 意思就是串口3上配置控制檯,也就是shell。
  2. 連接串口
    • Mac系統下:picocom /dev/tty.usbserial-1410 -b 115200 (picocom也需要安裝不是系統自帶的)
    • Linux和Mac一樣,只需要去安裝picocom即可,Ubuntu直接sudo apt-get install picocom命令安裝。
    • Windows下我不知道,可以自行百度
      在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章