韋東山ARM第一期作業(六)NorFlash
阿新 • • 發佈:2019-01-13
文章目錄
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;
}