跳转至

设置

Note

"SETUP" 指代的是配置与初始化这一步骤。 这一部分意在配置硬件的基本信息,功能性模块,总领板级支持包,外设以及其他系统。

如何设置

在文件结构和项目结构中都有一个独立的文件夹名为 'Setup'。要修改节点初始化的配置,只需修改 .h 或 .c 文件中的参数和宏即可。

Setup 作用范围

'Setup' 包含了几乎所有重要的可配置信息、模块、宏和变量。

代码

setup.h

/**
 * @file setup.h
 * @author SHUAIWEN CUI (SHUAIWEN001 AT e DOT ntu DOT edu DOT sg)
 * @brief This file is for MCU node configuration and initialization setup.
 * @version 1.0
 * @date 2024-07-12
 *
 * @copyright Copyright (c) 2024
 *
 */
#ifndef _SETUP_H_
#define _SETUP_H_

/**
 * @name MACROS
 */
#define NODE_SUCCESS 0
#define NODE_FAIL 1

/**
 * @name CONFIGURATION
 * @brief This section is to determine the modules to be included in the project
 * ! This is where you configure the modules to be included in the project
 * @param MODULE_ENABLE_LED //! Enable LED module
 * @param MODULE_ENABLE_USART //! Enable USART
 * @param MODULE_ENABLE_SDRAM //! Enable SDRAM module to use external RAM for computation
 * @param MODULE_ENABLE_MEMORY //! Enable Memory module - for memory management on SDRAM
 * @param MODULE_ENABLE_SDCARD //! Enable SD Card module- for SD Card basic io. !!! This module can not be used together with MODULE_ENABLE_FILE. Better to disable this and use the MODULE_ENABLE_FILE. Enabling FATFS in CubeMX may lead to fail of this option, and you may need to reformat the SD card before using next time.
 * @param MODULE_ENABLE_FILE //! Enable File module - for file operations on SD Card !!! This module can not be used together with MODULE_ENABLE_SDCARD. Better to enable this.
 */
#define MODULE_ENABLE_LED // Enable LED module
#define MODULE_ENABLE_USART // Enable USART module
#define MODULE_ENABLE_SDRAM  // Enable SDRAM module
#define MODULE_ENABLE_MEMORY // Enable Memory module - for memory management on SDRAM
// #define MODULE_ENABLE_SDCARD // Enable SD Card module
#define MODULE_ENABLE_FILE   // Enable File module - for file operations on SD Card

// Necessary Libraries
#include <stdio.h>

// LED for Status Indication
#ifdef MODULE_ENABLE_LED
#include "bsp_led.h"
#endif

#ifdef MODULE_ENABLE_USART //! Note - Do rember to check the MicroLib option in the project settings
#include "bsp_usart.h"
#endif

#ifdef MODULE_ENABLE_SDRAM
#include "bsp_sdram.h"
#endif

#ifdef MODULE_ENABLE_MEMORY
#include "bsp_memory.h"
#endif

#ifdef MODULE_ENABLE_SDCARD
#include "bsp_sdcard.h"
#endif

#ifdef MODULE_ENABLE_FILE
#include "bsp_file.h"
#endif

/**
 * @name NODE INFORMATION
 */

/**
 * @name FUNCTION PROTOTYPING
 */

/**
 * @name Node_Init
 * @brief This function is for board initialization, with configurable initialization test incorporated.
 */
int Node_Init(void);

#ifdef MODULE_ENABLE_USART
// IO retargetting
int fputc(int ch, FILE *f);
int fgetc(FILE *f);
#endif

#endif /* _SETUP_H_ */

setup.c

/**
 * @file setup.c
 * @author SHUAIWEN CUI (SHUAIWEN001 AT e DOT ntu DOT edu DOT sg)
 * @brief This file is for MCU node configuration and initialization setup.
 * @version 1.0
 * @date 2024-07-12
 *
 * @copyright Copyright (c) 2024
 *
 */
#include "setup.h"

/**
 * @name INITIALIZATION TEST
 * @brief This determines whether to conduct test when initializing the node. To disenable, comment it out.
 */
int init_test_mode = 0; // 0 for not, 1 for yes.

/**
 * @name VARIABLES
 *
 */
// The gap between the initialization of each module, in ms.
int Init_Gap = 300;

/**
 * @name Node_Init
 * @brief This function is for board initialization, with configurable initialization test incorporated.
 */
int Node_Init(void)
{
    // Variables
    int i;

    // COMPONNET-LED
#ifdef MODULE_ENABLE_LED
    LED(0);                  // for deployment, switch off the LED to save power
    if (init_test_mode == 1) // for debugging, flash the LED to indicate status
    {
        LED(1);
        HAL_Delay(200);
        LED(0);
        HAL_Delay(200);
        LED(1);
    }
#endif

    // COMPONENT-USART-SERIAL Communication
#ifdef MODULE_ENABLE_USART
    if (init_test_mode == 1)
    {
        for (i = 0; i < 3; i++)
        {
            printf("[NODE INITIALIZATION] Count Down for Upcoming Testing: %d \n\r", 3 - i);
            HAL_Delay(1000);
        }
        printf("\n\r");
    }
    printf("[NODE INITIALIZATION] Serial Communication - SUCCESS.\n\r\n\r");
#endif

    HAL_Delay(Init_Gap); // to give the user enough time to connect to the serial terminal

    // COMPONENT-SDRAM
#ifdef MODULE_ENABLE_SDRAM
    // BSP Initialization - SDRAM
    printf("[NODE INITIALIZATION] SDRAM Initialization - START.\n\r");
    SDRAM_InitSequence();
    printf("[NODE INITIALIZATION] SDRAM Initialization - DONE.\n\r\n\r");
    if (init_test_mode == 1)
    {
        if (SDRAM_Test() == 0)
        {
            printf("[NODE INITIALIZATION] SDRAM TEST - SUCCESS.\n\r\n\r");
        }
        else
        {
            printf("[NODE INITIALIZATION] SDRAM TEST - FAIL.\n\r\n\r");
        }
    }
#endif

    HAL_Delay(Init_Gap);

    // COMPONENT-MEMORY MANAGEMENT - SDRAM
#ifdef MODULE_ENABLE_MEMORY
    printf("[NODE INITIALIZATION] Memory Management Initialization - START.\n\r");
    memory_init();
    printf("[NODE INITIALIZATION] Memory Management Initialization - DONE.\n\r\n\r");
    if (init_test_mode == 1)
    {
        printf("[NODE INITIALIZATION] Memory Management Test - START.\n\r");
        if (memory_management_test() == 0)
        {
            printf("[NODE INITIALIZATION] Memory Management Test - SUCCESS.\n\r\n\r");
        }
        else
        {
            printf("[NODE INITIALIZATION] Memory Management Test - FAIL.\n\r\n\r");
        }
    }
#endif

    HAL_Delay(Init_Gap);

    // COMPONENT-SDCARD (If you use FATFS, don't enable this.)
#ifdef MODULE_ENABLE_SDCARD
    printf("[NODE INITIALIZATION] SD Card Initialization - START.\n\r");
    SD_Init();
    printf("[NODE INITIALIZATION] SD CARD Initialization - DONE.\n\r");
    if (init_test_mode == 1)
    {
        // SD Card Test
        printf("[NODE INITIALIZATION] SD Card Test - START.\n\r");
        SD_Test();
        printf("[NODE INITIALIZATION] SD Card Test - DONE.\n\r");
    }
#endif

    HAL_Delay(Init_Gap);

#ifdef MODULE_ENABLE_FILE // the test is kept outside the test zone, as sd card hard conenction is not quite stable, and we need the test to ensure the connection is okay

    printf("[NODE INITIALIZATION] SD Card File IO Initialization and Test - START.\n\r");
    printf("\n\r");

    // mount the file system
    printf("[NODE INITIALIZATION] Mounting the file system.\n\r");
    Mount_FatFs();
    printf("\n\r");

    // get disk information
    printf("[NODE INITIALIZATION] Getting disk information.\n\r");
    FatFs_GetDiskInfo();
    printf("\n\r");

    if (init_test_mode == 1)
    {
        // scan the directory
        printf("[NODE INITIALIZATION] Scanning the directory.\n\r");
        FatFs_ScanDir("0:/");
        printf("\n\r");

        // write a text file
        printf("[NODE INITIALIZATION] Writing a text file.\n\r");
        FatFs_WriteTXTFile("test.txt", 2016, 11, 15);
        printf("\n\r");

        // read a text file
        printf("[NODE INITIALIZATION] Reading a text file.\n\r");
        FatFs_ReadTXTFile("test.txt");
        printf("\n\r");

        // get file information
        printf("[NODE INITIALIZATION] Getting file information.\n\r");
        FatFs_GetFileInfo("test.txt");
        printf("\n\r");

        // delete a file
        printf("[NODE INITIALIZATION] Deleting a file.\n\r");
        FatFs_DeleteFile("test.txt");
        printf("\n\r");
    }
    printf("[NODE INITIALIZATION] SD Card FATFS File IO Initialization - DONE.\n\r\n\r");
#endif

    return NODE_SUCCESS;
}

#ifdef MODULE_ENABLE_USART
// MicroLib needed for retargetting
// retarget fputc for printf
int fputc(int ch, FILE *f)
{
    uint8_t temp = (uint8_t)ch;
    HAL_UART_Transmit(&huart1, &temp, 1, HAL_MAX_DELAY);
    return ch;
}

// retarget fgetc for scanf
int fgetc(FILE *f)
{
    while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == RESET)
        ;                                      // Wait until the data is received
    return (int)(huart1.Instance->RDR & 0xFF); // Read the received data
}
#endif