1. 程式人生 > >韋東山ARM第一期作業(六)NorFlash

韋東山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;
}