📄 f36x_flash_test.c
字号:
//-----------------------------------------------------------------------------
// F36x_Flash_Test.c
//-----------------------------------------------------------------------------
// Copyright 2005 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This program tests all the functions available in F360_FlashPrimitives.c
// and F360_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:
//
// P3.2 -> LED
//
// all other port pins unused
//
// How To Test:
//
// Option 1:
// 1) Load the F36x_Flash.c, F360_FlashPrimitives.c, and F360_FlashUtils.c
// files in the Silicon Labs IDE.
// 2) Compile and download code to a 'F36x device.
// 3) Verify the LED pins of J12 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 F36x_Flash.c, F360_FlashPrimitives.c, and F360_FlashUtils.c
// files in the Silicon Labs IDE.
// 2) Compile and download code to a 'F36x 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
//
// FID: 36X000012
// Target: C8051F36x
// Tool chain: KEIL C51 7.20 / KEIL EVAL C51
// Command Line: None
//
// Release 1.0
// -Initial Revision (TP)
// -24 OCT 2006
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <C8051F360.h> // SFR declarations
#include "F360_FlashPrimitives.h"
#include "F360_FlashUtils.h"
//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // SYSCLK in Hz (24.5 MHz internal
// oscillator)
// the internal oscillator has a
// tolerance of +/- 2%
sbit LED = P3^2; // LED
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void Oscillator_Init (void); // Oscillator initialization routine
void VDDMon_Init (void); // VDD Monitor initialization routine
void Port_Init (void); // Port initialization routine
void Timer0_Delay_ms (unsigned int ms);
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
void main (void)
{
unsigned char temp_byte = 0x00;
FLADDR start_address = 0x5FFE;
char test_write_buff[8] = "ABCDEFG";
char test_write_buff2[3] = "HIJ";
char test_read_buff[8] = {0};
char test_compare_buff[8] = "ABCDEFG";
unsigned char i;
bit error_flag = 0;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
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
// to 24.5 MHz
VDDMon_Init();
Port_Init();
LED = 1;
SFRPAGE = LEGACY_PAGE;
// Initially erase the test page of Flash
FLASH_PageErase(start_address);
//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;
Timer0_Delay_ms (100);
}
else
{
LED = 0;
}
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Oscillator_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the internal oscillator to 24.5 MHz.
//-----------------------------------------------------------------------------
void Oscillator_Init(void)
{
unsigned char SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = CONFIG_PAGE; // Switch to the necessary SFRPAGE
OSCICN |= 0x03; // Set the Internal Oscillator to run
// at 24.5 MHz
SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE
}
//-----------------------------------------------------------------------------
// 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)
{
// VDM0CN and RSTSRC are accessible from all SFR pages
// Step 1. Enable the VDD Monitor (VDMEN bit in VDM0CN =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -