lab 5
闪存擦除覆写实验
按压S1键,将stuNum写入主存储器BANK1的29扇区,成功写入则使LED2的绿灯常亮,否则使LED1(红灯)常亮;
启动主存储器的BANK1的29扇区写保护,按压S2键,整体擦除flash,成功擦除则使LED2的蓝灯常亮,否则使LED1(红灯)常亮;
同时按压S1键和S2键,读取主存储器BANK1的29扇区的任意单个字节至变量S29,如果变量S29的值等于strNum,则使得LED2亮白色,否则LED1(红灯)常亮;
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
//延时函数
void MyDelay(unsigned int count)
{
volatile uint32_t i;
for(i=1000*count; i>0; i--);
return ;
}
unsigned char array[8192];
#define BANKl_S29 (0x3D000)
int main(void)
{
//*-----------在此下区域可定义变量-----------*//
volatile unsigned char S29 = 0x00;
int strNum = 0x44;
memset(array, strNum, 8192);
//使LED1初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
//使LED2中绿色灯初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
//设置P1.1(s1按键)为输入模式并拉高
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);
//设置S2也为输入模式
MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN4);
//*-----------在此上区域可定义变量-----------*//
/* 停用看门狗定时器 */
MAP_WDT_A_holdTimer();
/*为了快速编程.设置 MCLK 为 48 MHz*/
MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);
FlashCtl_setWaitState(FLASH_BANK0, 1);
FlashCtl_setWaitState(FLASH_BANK1, 1);
MAP_CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);
MAP_FlashCtl_unprotectSector(FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR29);
MAP_FlashCtl_performMassErase();
//GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0); 红
//GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1); 绿
//GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN2); 蓝
while(1)
{
if (GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1) == GPIO_INPUT_PIN_LOW)
{
if(!MAP_FlashCtl_programMemory(array, (void*)BANKl_S29, 8192))
{
GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN1);
MyDelay(5);
}
else
{
//否则使LED1(红灯)常亮
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
MyDelay(5);
}
}
if (GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4) == GPIO_INPUT_PIN_LOW)
{
goto FLAG;
}
}
//启动主存储器的BANK1的29扇区写保护
//按压S2键,整体擦除flash,成功擦除则使LED2的蓝灯常亮,
//否则使LED1(红灯)常亮;
FLAG:
//使LED1初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
//使LED2中绿色灯初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
MAP_FlashCtl_protectSector(FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR29);
while(1)
{
if (GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4) == GPIO_INPUT_PIN_LOW)
{
if(MAP_FlashCtl_programMemory(array,(void*)BANKl_S29,8192))
{
GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN2);
GPIO_toggleOutputOnPin(GPIO_PORT_P2,GPIO_PIN2);
}
else
{
//否则使LED1(红灯)常亮
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
}
}
if (GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4) == GPIO_INPUT_PIN_LOW &&
GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1) == GPIO_INPUT_PIN_LOW)
goto FLAG1;
}
//同时按压S1键和S2键,读取主存储器BANK1的29扇区的任意单个字节至变量S29
//如果变量S29的值等于strNum,则使得LED2亮白色,否则LED1(红灯)常亮;
FLAG1:
//使LED1初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
//使LED2中绿色灯初始为低电平(常暗)
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
//srand ((unsigned int) time(NULL));
while(1)
{
//int ran = rand() % BANKl_S29 + 0x1000;
//unsigned char cmp = *((unsigned char*)(ran));
unsigned char cmp = *((unsigned char*)(BANKl_S29+0x123));
//cmp = *((unsigned char*)(0x123));
if (GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4) == GPIO_INPUT_PIN_LOW &&
GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1) == GPIO_INPUT_PIN_LOW)
{
if(cmp == strNum)
{
GPIO_setAsOutputPin(GPIO_PORT_P2, 0x7);
}
else
{
GPIO_setAsOutputPin(GPIO_PORT_P2, 0x1);
}
}
}
}