目錄
一、Nuttx配置文件
- Nuttx配置文件位置:
- 位於nuttx/configs內部的各個文件夾中,一個文件夾對應一個開發板。比如,stm32f4discovery這樣的stm官方發佈的開發板。但是自帶的開發板的配置文件中並沒有我手上這塊星瞳的pyboard stm32f405rgt6開發板的配置文件。所以要自己配置咯。 - 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/* 構建
- 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
- 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 */
- 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
- 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
}
- 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
- 切換到nuttx/tools目錄執行configure.sh
sudo ./configure.sh xingtong-pyboard/nsh
- 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刷入到開發板
- 短接BOOT和3.3V (這樣啓動纔會進入dfu模式)
- 開發板通過ST-Link連接到電腦上
- 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控制檯
- USB轉串口連接到UART3上(RX3, TX3),因爲在
nah/defconfig
中配置了一項CONFIG_USART3_SERIAL_CONSOLE=y
意思就是串口3上配置控制檯,也就是shell。 - 連接串口
- Mac系統下:picocom /dev/tty.usbserial-1410 -b 115200 (picocom也需要安裝不是系統自帶的)
- Linux和Mac一樣,只需要去安裝picocom即可,Ubuntu直接
sudo apt-get install picocom
命令安裝。 - Windows下我不知道,可以自行百度