⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minimon.c

📁 编译后直接运行的MP3播放器全部C语言源代码 一个包含FAT文件系统、系统引导 Boot、FLASH Driver等内容的
💻 C
字号:
// minimalistic monitor// to be loaded with the UART boot feature// capable of reading and writing bytes, commanded by UART#include "sh7034.h"#include "minimon.h"// scalar typestypedef unsigned char  UINT8;typedef unsigned short UINT16;typedef unsigned long  UINT32;typedef void(*tpFunc)(void); // type for exectypedef int(*tpMain)(void); // type for start vector to main()// prototypesint main(void);// our binary has to start with a vector to the entry pointtpMain start_vector[] __attribute__ ((section (".startvector"))) = {main};UINT8 uart_read(void){	UINT8 byte;	while (!(SSR1 & SCI_RDRF)); // wait for char to be available	byte = RDR1;	SSR1 &= ~SCI_RDRF;	return byte;}void uart_write(UINT8 byte){	while (!(SSR1 & SCI_TDRE)); // wait for transmit buffer empty	TDR1 = byte;	SSR1 &= ~SCI_TDRE;}int main(void){	UINT8 cmd;	UINT32 addr;	UINT32 size;	UINT32 content;	volatile UINT8* paddr = 0;	volatile UINT8* pflash; // flash base address	while (1)	{		cmd = uart_read();		switch (cmd)		{		case BAUDRATE:			content = uart_read();			uart_write(cmd); // acknowledge by returning the command value			while (!(SSR1 & SCI_TEND)); // wait for empty shift register, before changing baudrate			BRR1 = content;			break;		case ADDRESS:			addr = (uart_read() << 24) | (uart_read() << 16) | (uart_read() << 8) | uart_read();			paddr = (UINT8*)addr;			pflash = (UINT8*)(addr & 0xFFF80000); // round down to 512k align			uart_write(cmd); // acknowledge by returning the command value			break;		case BYTE_READ:			content = *paddr++;			uart_write(content); // the content is the ack				break;		case BYTE_WRITE:			content = uart_read();			*paddr++ = content;									uart_write(cmd); // acknowledge by returning the command value			break;		case BYTE_READ16:			size = 16;			while (size--)			{				content = *paddr++;				uart_write(content); // the content is the ack					}			break;		case BYTE_WRITE16:			size = 16;			while (size--)			{				content = uart_read();				*paddr++ = content;									}			uart_write(cmd); // acknowledge by returning the command value			break;		case BYTE_FLASH:			content = uart_read();			pflash[0x5555] = 0xAA; // set flash to command mode			pflash[0x2AAA] = 0x55;			pflash[0x5555] = 0xA0; // byte program command			*paddr++ = content;									uart_write(cmd); // acknowledge by returning the command value			break;		case BYTE_FLASH16:			size = 16;			while (size--)			{				content = uart_read();				pflash[0x5555] = 0xAA; // set flash to command mode				pflash[0x2AAA] = 0x55;				pflash[0x5555] = 0xA0; // byte program command				*paddr++ = content;									}			uart_write(cmd); // acknowledge by returning the command value			break;		case HALFWORD_READ:			content = *(UINT16*)paddr;			paddr += 2;			uart_write(content >> 8); // highbyte			uart_write(content & 0xFF); // lowbyte			break;				case HALFWORD_WRITE:			content = uart_read() << 8 | uart_read();			*(UINT16*)paddr = content;			paddr += 2;			uart_write(cmd); // acknowledge by returning the command value			break;				case EXECUTE:			{				tpFunc pFunc = (tpFunc)paddr;				pFunc();				uart_write(cmd); // acknowledge by returning the command value			}			break;		default:			{				volatile UINT16* pPortB = (UINT16*)0x05FFFFC2;				*pPortB |= 1 << 6; // bit 6 is red LED on				uart_write(~cmd); // error acknowledge			}		} // case	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -