设置¶
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