嵌入式系统实践 05 ——基于ARM汇编 Keil5 MSP432 P401R开发板

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);
            }
        }
        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值