📄 f500_flash_test.c
字号:
//-----------------------------------------------------------------------------
// F500_Flash_Test.c
//-----------------------------------------------------------------------------
// Copyright 2008 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This program tests all the functions available in F500_FlashPrimitives.c
// and F500_FlashUtils.c. It uses a test data array to mimic the changes
// made to the Flash and test for correctness. While the test is running, the
// LED is on. If the test fails, the LED will turn off. If the test passes,
// the LED will blink.
//
// Pinout:
//
// P1.3 -> LED
//
// all other port pins unused
//
// How To Test:
//
// Option 1:
// 1) Load the F500_Flash_test.c, F500_FlashPrimitives.c, and F500_FlashUtils.c
// files in the Silicon Labs IDE.
// 2) Compile and download code to a 'F50x device.
// 3) Verify the LED pin of J13 are populated on the 'F36x TB.
// 4) Run the code
// 5) Check that the LED is blinking, indicating a passing test.
//
// Option 2:
// 1) Load the F500_Flash_Test.c, F500_FlashPrimitives.c, and F500_FlashUtils.c
// files in the Silicon Labs IDE.
// 2) Compile and download code to a 'F500 device.
// 3) Open the Code window in the IDE and verify the following data at
// address <start_address>:
//
// 48 49 4A 44 45 46
// 47 00 48 49 4A 44
// 45 46 47 00 5A 5A
// 5A 5A 5A 5A 5A 5A
//
// Target: C8051F50x
// Tool chain: KEIL C51 7.20 / KEIL EVAL C51
// Command Line: None
//
// Release 1.1 / 10 JUN 2008 (ADT)
// -Edited formatting
//
// Release 1.0 / 08 APR 2008 (GP)
// -Initial Revision
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <compiler_defs.h>
#include <C8051F500_defs.h> // SFR declarations
#include "F500_FlashPrimitives.h"
#include "F500_FlashUtils.h"
//-----------------------------------------------------------------------------
// Pin Declarations
//-----------------------------------------------------------------------------
SBIT (LED, SFR_P1, 3); // LED == 1 means ON
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void); // Oscillator initialization routine
void VDDMon_Init (void); // VDD Monitor initialization routine
void PORT_Init (void); // Port initialization routine
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
U8 temp_byte = 0x00;
FLADDR start_address = 0x5FFE;
U8 test_write_buff[8] = "ABCDEFG";
U8 test_write_buff2[3] = "HIJ";
U8 test_read_buff[8] = {0};
U8 test_compare_buff[8] = "ABCDEFG";
U8 i, j;
bit error_flag = 0;
SFRPAGE = ACTIVE_PAGE; // Set for PCA0MD and RSTSRC
PCA0MD &= ~0x40; // Disable the watchdog timer
if ((RSTSRC & 0x02) != 0x02)
{
if ((RSTSRC & 0x40) == 0x40)
{
LED = 0;
while (1); // Last reset was caused by a Flash
// Error Device Reset
// LED is off and loop forever to
// indicate error
}
}
OSCILLATOR_Init (); // Initialize the internal oscillator
VDDMon_Init (); // Initialize the VDD monitor
PORT_Init (); // Initialize the crossbar
LED = 1;
// Initially erase the test pages of Flash
FLASH_PageErase (start_address);
FLASH_PageErase (start_address + 2);
//BEGIN TEST================================================================
// Check if able to Write and Read the Flash--------------------------------
FLASH_ByteWrite (start_address, 0xA5);
temp_byte = FLASH_ByteRead (start_address);
if (temp_byte != 0xA5)
{
error_flag = 1;
}
//--------------------------------------------------------------------------
// Check if able to Erase a page of the Flash-------------------------------
FLASH_PageErase (start_address);
temp_byte = FLASH_ByteRead (start_address);
if (temp_byte != 0xFF)
{
error_flag = 1;
}
//--------------------------------------------------------------------------
// Check if able to write and read a series of bytes------------------------
FLASH_Write (start_address, test_write_buff, sizeof(test_write_buff));
FLASH_Read (test_read_buff, start_address, sizeof(test_write_buff));
for (i = 0; i < sizeof(test_write_buff); i++)
{
if (test_read_buff[i] != test_write_buff[i])
{
error_flag = 1;
}
}
//--------------------------------------------------------------------------
// Check if able to Erase a few bytes---------------------------------------
FLASH_Clear (start_address, 2);
FLASH_Read (test_read_buff, start_address, sizeof(test_write_buff));
// Simulate the same changes to a data array for comparison
test_compare_buff[0] = 0xFF;
test_compare_buff[1] = 0xFF;
for (i = 0; i < sizeof(test_compare_buff); i++)
{
if (test_read_buff[i] != test_compare_buff[i])
{
error_flag = 1;
}
}
//--------------------------------------------------------------------------
// Check if able to "update" (erase then re-write) a few bytes--------------
FLASH_Update (start_address, test_write_buff2, 3);
FLASH_Read (test_read_buff, start_address, sizeof(test_write_buff));
// Simulate the same changes to a data array for comparison
test_compare_buff[0] = test_write_buff2[0];
test_compare_buff[1] = test_write_buff2[1];
test_compare_buff[2] = test_write_buff2[2];
for (i = 0; i < sizeof(test_compare_buff); i++)
{
if (test_read_buff[i] != test_compare_buff[i])
{
error_flag = 1;
}
}
//--------------------------------------------------------------------------
// Check if able to copy data in the Flash----------------------------------
FLASH_Copy (start_address + sizeof(test_write_buff), start_address,
sizeof(test_write_buff));
FLASH_Read (test_read_buff, start_address + sizeof(test_write_buff),
sizeof(test_read_buff));
for (i = 0; i < sizeof(test_write_buff); i++)
{
if (test_read_buff[i] != test_compare_buff[i])
{
error_flag = 1;
}
}
//--------------------------------------------------------------------------
// FLASH test routines------------------------------------------------------
FLASH_Fill (start_address + sizeof(test_write_buff) * 2,
sizeof(test_write_buff), 0x5A);
FLASH_Read(test_read_buff, start_address + sizeof(test_write_buff) * 2,
sizeof(test_write_buff));
for (i = 0; i < sizeof(test_write_buff); i++)
{
if (test_read_buff[i] != 0x5A)
{
error_flag = 1;
}
}
//--------------------------------------------------------------------------
//END OF TEST===============================================================
while (1) // Loop forever
{
// Blink LED to indicate success
if (error_flag == 0)
{
LED = !LED;
// Simple delay loop
for (i = 65000; i > 0; i--)
{
for (j = 65000; j > 0; j--)
{
}
}
}
else
{
LED = 0;
}
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the system clock to use the internal oscillator
// at its maximum frequency / 8.
//
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x84; // Configure internal oscillator for
// 24 MHz / 8
SFRPAGE = SFRPAGE_save;
}
//-----------------------------------------------------------------------------
// VDDMon_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the VDD Monitor and enables it as a reset source.
// The VDD Monitor is enabled following a power-on reset, but this routine
// explicitly enables the VDD Monitor.
//
// Note: If the VDD Monitor is not enabled or not enabled as a reset source,
// any attempt to write or erase Flash will cause a Flash Error Device Reset.
//-----------------------------------------------------------------------------
void VDDMon_Init(void)
{
U8 SFRPAGE_save = SFRPAGE;
SFRPAGE = ACTIVE_PAGE;
// Step 1. Enable the VDD Monitor and set it to the high threshold
VDM0CN = 0xA0;
// Step 2. Wait for the VDD Monitor to stabilize (approximately 5 祍).
// Note: This delay should be omitted if software contains routines which
// erase or write Flash memory.
// Omitted in this code
// Step 3. Select the VDD Monitor as a reset source (PORSF bit in
// RSTSRC =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -