韦东山ARM第一期作业(六)NorFlash


01 - 作业所在路径

  ARM裸机1期加强版\源码文档图片\文档图片\第015课_NOR_Flash

02 - 作业描述

2.1 - 作业1

  实现一个关中断、开中断的函数,在测试NOR FLASH时关中断,测完后开中断。这样就不需要注释掉timer的中断函数了

2.2 - 作业2

  第003节_NorFlash编程_擦写读,这个程序写得不好,应该把nor_read, nor_write, nor_erase单独实现出来,现在都是内嵌在do_read_nor_flash、do_write_nor_flash、do_erase_nor_flash里了。请实现nor_read, nor_write, nor_erase函数,再在do_xxx中调用它们

03 - 作业解答

3.1 - 作业1解答

实现一个关中断、开中断的函数,在测试NOR FLASH时关中断,测完后开中断。这样就不需要注释掉timer的中断函数了

  interrupt.c中定义全局变量EINTMASK_val和INTMSK_val,用于储存上一个值
  再定义函数enable_interrupt()mask_interrupt(),要先使用mask_interrupt(),再使用enable_interrupt()

#define MASK_EINTMASK   0x00FFFFF0
#define MASK_INTMSK     0xFFFFFFFF
unsigned int EINTMASK_val;
unsigned int INTMSK_val;
/**
  * @brief  使能中断,恢复EINTMASK寄存器的值
  * @param  NONE
  * @retval None
  */
void enable_interrupt(void)
{
	//当前不需要修改
    if(MASK_EINTMASK != EINTMASK || MASK_INTMSK != INTMSK)
    {
        printf("[OK] interrupts are already enable\r\n");
        return;
    }
	
    EINTMASK = EINTMASK_val;
    INTMSK = INTMSK_val;
    printf("[OK] enable interrupt\r\n");
}

/**
  * @brief  屏蔽所有中断,先保存原来EINTMASK/INTMSK的值,然后对EINTMASK/INTMSK所有位置1
  * @param  NONE
  * @retval None
  */
void mask_interrupt(void)
{
    if(MASK_EINTMASK == EINTMASK || MASK_INTMSK == INTMSK)
    {
        printf("[OK] interrupts are already masker\r\n");
        return;
    }
    //保存
    EINTMASK_val = EINTMASK;
    INTMSK_val = INTMSK;
    //屏蔽
    EINTMASK = MASK_EINTMASK;
    INTMSK = MASK_INTMSK;
    printf("[OK] mask interrupt\r\n");
}

3.2 - 作业2解答

第003节_NorFlash编程_擦写读,这个程序写得不好,应该把nor_read, nor_write, nor_erase单独实现出来,现在都是内嵌在do_read_nor_flash、do_write_nor_flash、do_erase_nor_flash里了。请实现nor_read, nor_write, nor_erase函数,再在do_xxx中调用它们

  分离出来,再根据函数进行调用即可

void _nor_write(unsigned int addr, unsigned int data)
{
    nor_write_word(0x555,0xaa);         //解锁
    nor_write_word(0x2aa,0x55);
    nor_write_word(0x555,0xa0);         //program命令
    nor_write_word(addr,data);       	//写入
}

void _nor_earse(unsigned int addr)
{
    nor_write_word(0x555,0xaa);         //解锁
    nor_write_word(0x2aa,0x55);
    nor_write_word(0x555,0x80);         //erase命令
    nor_write_word(0x555,0xaa);         //解锁
    nor_write_word(0x2aa,0x55);
    nor_write_word(addr,0x30);          //擦除
}

unsigned char _nor_read(unsigned char *addr)
{
    return *addr;
}

猜你喜欢

转载自blog.csdn.net/Hxj_CSDN/article/details/85782018
今日推荐