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

📄 main.lst

📁 avr单片机硬盘控制 (含代码、原理图) avr单片机硬盘控制 (含代码、原理图)
💻 LST
📖 第 1 页 / 共 5 页
字号:
   1               		.file	"main.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  69               	.global	uartdata
  70               	.global	uartdata
  71               		.section .bss
  74               	uartdata:
  75 0000 00        		.skip 1,0
  76               		.text
  78               	.global	__vector_11
  80               	__vector_11:
   1:main.c        **** /*****************************************************
   2:main.c        **** WinAVR
   3:main.c        **** 项目 : 硬盘控制
   4:main.c        **** 版本 : 0.1
   5:main.c        **** 日期 : 2005-1-9
   6:main.c        **** 作者 : 金方剑
   7:main.c        **** 
   8:main.c        **** 
   9:main.c        **** 芯片                : ATmega16L
  10:main.c        **** 时钟                : 8.000000 MHz
  11:main.c        **** *****************************************************/
  12:main.c        **** #include <avr/io.h>
  13:main.c        **** #include <avr/iom16.h>
  14:main.c        **** #include <avr/interrupt.h>
  15:main.c        **** #include <avr/signal.h>
  16:main.c        **** 
  17:main.c        **** #include <avr/pgmspace.h>
  18:main.c        **** #include <avr/eeprom.h>
  19:main.c        **** //******************************************************************************
  20:main.c        **** #define byte						unsigned char
  21:main.c        **** #define uint						unsigned int
  22:main.c        **** #define	ulong						unsigned long
  23:main.c        **** #define nop()						__asm__ __volatile__ ("nop" ::)
  24:main.c        **** #define wdr()						__asm__ __volatile__ ("wdr" ::)
  25:main.c        **** #define Set_Bit(val, bitn)			(val |=(1<<(bitn)))//设置某一位
  26:main.c        **** #define Clr_Bit(val, bitn)			(val&=~(1<<(bitn)))//清除某一位
  27:main.c        **** #define Get_Bit(val, bitn)			(val &(1<<(bitn)))//读取某一位
  28:main.c        **** //******************************************************************************
  29:main.c        **** //线路连接定义。如电路有变直接修改就可以了
  30:main.c        **** #define WDataL 						PORTA
  31:main.c        **** #define WDataH 						PORTB
  32:main.c        **** #define RDataL 						PINA
  33:main.c        **** #define RDataH 	   					PINB
  34:main.c        **** #define CS0	   	   					PC0
  35:main.c        **** #define CS1	   			 			PC1
  36:main.c        **** #define DA0	   	   					PD5
  37:main.c        **** #define DA1	   	   					PD6
  38:main.c        **** #define DA2	   	   					PD7
  39:main.c        **** #define Read						PC6
  40:main.c        **** #define Write 						PC7
  41:main.c        **** #define Rst							PD4
  42:main.c        **** //******************************************************************************
  43:main.c        **** //ATA命令
  44:main.c        **** // CB_ERR ERROR REGISTER BITS 
  45:main.c        **** #define ATA_ER_BBK					0x80    // ATA bad block
  46:main.c        **** #define ATA_ER_UNC					0x40    // ATA uncorrected error
  47:main.c        **** #define ATA_ER_MC					0x20    // ATA media change
  48:main.c        **** #define ATA_ER_IDNF					0x10    // ATA id not found
  49:main.c        **** #define ATA_ER_MCR					0x08    // ATA media change request
  50:main.c        **** #define ATA_ER_ABRT					0x04    // ATA command aborted
  51:main.c        **** #define ATA_ER_NTK0					0x02    // ATA track 0 not found
  52:main.c        **** #define ATA_ER_NDAM					0x01    // ATA address mark not found
  53:main.c        **** // CB_DH bits 7-4 OF THE DEVICE/HEAD REGISTER
  54:main.c        **** #define ATA_DH_DEV0					0xE0    // select device 0 LBA MODE
  55:main.c        **** #define ATA_DH_DEV1					0xF0    // select device 1 LBA MODE
  56:main.c        **** //ATA commands (from ATA-3),
  57:main.c        **** #define CMD_CFA_ERASE_SECTORS            0xC0
  58:main.c        **** #define CMD_CFA_REQUEST_EXT_ERR_CODE     0x03
  59:main.c        **** #define CMD_CFA_TRANSLATE_SECTOR         0x87
  60:main.c        **** #define CMD_CFA_WRITE_MULTIPLE_WO_ERASE  0xCD
  61:main.c        **** #define CMD_CFA_WRITE_SECTORS_WO_ERASE   0x38
  62:main.c        **** #define CMD_CHECK_POWER_MODE1            0xE5
  63:main.c        **** #define CMD_CHECK_POWER_MODE2            0x98
  64:main.c        **** #define CMD_DEVICE_RESET                 0x08
  65:main.c        **** #define CMD_EXECUTE_DEVICE_DIAGNOSTIC    0x90
  66:main.c        **** #define CMD_FLUSH_CACHE                  0xE7
  67:main.c        **** #define CMD_FORMAT_TRACK                 0x50
  68:main.c        **** #define CMD_IDENTIFY_DEVICE              0xEC
  69:main.c        **** #define CMD_IDENTIFY_DEVICE_PACKET       0xA1
  70:main.c        **** #define CMD_IDENTIFY_PACKET_DEVICE       0xA1
  71:main.c        **** #define CMD_IDLE1                        0xE3
  72:main.c        **** #define CMD_IDLE2                        0x97
  73:main.c        **** #define CMD_IDLE_IMMEDIATE1              0xE1
  74:main.c        **** #define CMD_IDLE_IMMEDIATE2              0x95
  75:main.c        **** #define CMD_INITIALIZE_DRIVE_PARAMETERS  0x91
  76:main.c        **** #define CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
  77:main.c        **** #define CMD_NOP                          0x00
  78:main.c        **** #define CMD_PACKET                       0xA0
  79:main.c        **** #define CMD_READ_BUFFER                  0xE4
  80:main.c        **** #define CMD_READ_DMA                     0xC8
  81:main.c        **** #define CMD_READ_DMA_QUEUED              0xC7
  82:main.c        **** #define CMD_READ_MULTIPLE                0xC4
  83:main.c        **** #define CMD_READ_SECTORS                 0x20
  84:main.c        **** #define CMD_READ_VERIFY_SECTORS          0x40
  85:main.c        **** #define CMD_RECALIBRATE                  0x10
  86:main.c        **** #define CMD_SEEK                         0x70
  87:main.c        **** #define CMD_SET_FEATURES                 0xEF
  88:main.c        **** #define CMD_SET_MULTIPLE_MODE            0xC6
  89:main.c        **** #define CMD_SLEEP1                       0xE6
  90:main.c        **** #define CMD_SLEEP2                       0x99
  91:main.c        **** #define CMD_STANDBY1                     0xE2
  92:main.c        **** #define CMD_STANDBY2                     0x96
  93:main.c        **** #define CMD_STANDBY_IMMEDIATE1           0xE0
  94:main.c        **** #define CMD_STANDBY_IMMEDIATE2           0x94
  95:main.c        **** #define CMD_WRITE_BUFFER                 0xE8
  96:main.c        **** #define CMD_WRITE_DMA                    0xCA
  97:main.c        **** #define CMD_WRITE_DMA_QUEUED             0xCC
  98:main.c        **** #define CMD_WRITE_MULTIPLE               0xC5
  99:main.c        **** #define CMD_WRITE_SECTORS                0x30
 100:main.c        **** #define CMD_WRITE_VERIFY                 0x3C
 101:main.c        **** //******************************************************************************
 102:main.c        **** //硬盘状态寄存器地址定义
 103:main.c        **** #define _Data 							0x0
 104:main.c        **** #define _Err_Features 					0x1
 105:main.c        **** #define _SecCount 						0x2
 106:main.c        **** #define _SecNum 						0x3
 107:main.c        **** #define _CylinderL 						0x4
 108:main.c        **** #define _CylinderH 						0x5
 109:main.c        **** #define _DeviceAndHead 					0x6
 110:main.c        **** #define _Status_AND_Command				0x7
 111:main.c        **** //******************************************************************************
 112:main.c        **** /************************************************************
 113:main.c        **** * D7   D6   D5   D4   D3   D2    D1   D0                    *
 114:main.c        ****  BSY  DRDY DWF  DSC  DRQ  CORR  IDX  ERR                    *
 115:main.c        **** BSY:驱动器忙;                                             *
 116:main.c        **** DRDY:驱动器准备好;                                        *
 117:main.c        **** DWF:驱动器写失败;                                         *
 118:main.c        **** DSC:寻道结束;                                              *
 119:main.c        **** DRQ:请求服务,驱动器希望通过数据寄存器与CPU交换一字节数据	*
 120:main.c        **** CORR:当可以纠正的读错误发生时,该位置1,数据传输将继续进行 *
 121:main.c        **** IDX:收到综引信号;                                         *
 122:main.c        **** ERR:命令执行出错。                                         *
 123:main.c        **** *************************************************************/
 124:main.c        **** #define BSY	 						((HDstate&0x80)==0x80)
 125:main.c        **** #define DRDY						((HDstate&0x40)==0x40)
 126:main.c        **** #define DWF							((HDstate&0x20)==0x20)
 127:main.c        **** #define DSC							((HDstate&0x10)==0x10)
 128:main.c        **** #define DRQ							((HDstate&0x08)==0x08)
 129:main.c        **** #define CORR						((HDstate&0x04)==0x04)
 130:main.c        **** #define IDX							((HDstate&0x02)==0x02)
 131:main.c        **** #define ERR							((HDstate&0x01)==0x01)
 132:main.c        **** //******************************************************************************
 133:main.c        **** //主工程的函数
 134:main.c        **** //int		main(void);
 135:main.c        **** void	delay_ms(uint ms);//毫秒级定时
 136:main.c        **** void	delay_us(uint us);//微秒级定时
 137:main.c        **** //******************************************************************************
 138:main.c        **** //ATA的函数
 139:main.c        **** void HDinit(void);//硬盘初始化
 140:main.c        **** byte ReadReg(byte byAddr);//读寄存器
 141:main.c        **** void WriteReg(byte byAddr,byte byData);//写寄存器
 142:main.c        **** byte WaitBSY(void);//等待BSY信号
 143:main.c        **** byte WaitDRQ(void);//等待DRQ信号
 144:main.c        **** void RegAddrChangePhysics(byte byRegAddr);//把寄存器地址转化为物理接口
 145:main.c        **** void Read_HD_ID(void);//读硬盘ID
 146:main.c        **** void HDStop(void);//让硬盘休眠(停转)
 147:main.c        **** void HDRunningActivation(void);//激活硬盘(转动)
 148:main.c        **** void LBA(unsigned long lba);//LBA寻址
 149:main.c        **** void ReadData(void);//读硬盘数据寄存器内容
 150:main.c        **** void WriteData(byte byDataL,byte byDataH);//写硬盘数据寄存器内容
 151:main.c        **** void ReadSectorData(ulong lSectorAdd);//读一个扇区的数据
 152:main.c        **** void WriteSectorData(ulong lSectorAdd);//写一个扇区的数据
 153:main.c        **** void WriteCHS(uint iCylinder,byte byHead,byte bySector,byte byReadcount);//硬盘寻址
 154:main.c        **** byte ReversalData(byte byReversal);//颠倒数据,0位换到7位,7位换到0位
 155:main.c        **** //******************************************************************************
 156:main.c        **** byte	uartdata=0;
 157:main.c        **** byte	HDDATAL,HDDATAH;						//低字节,高字节
 158:main.c        **** byte	HDstate;								//硬盘状态
 159:main.c        **** byte	HDSectorDATA[512];						//硬盘扇区数据
 160:main.c        **** //******************************************************************************
 161:main.c        **** //UART接收中断
 162:main.c        **** SIGNAL(SIG_UART_RECV)
 163:main.c        **** {
  82               	.LM1:
  83               	/* prologue: frame size=0 */
  84 0000 1F92      		push __zero_reg__
  85 0002 0F92      		push __tmp_reg__
  86 0004 0FB6      		in __tmp_reg__,__SREG__
  87 0006 0F92      		push __tmp_reg__
  88 0008 1124      		clr __zero_reg__
  89 000a 8F93      		push r24
  90 000c CF93      		push r28
  91 000e DF93      		push r29
  92 0010 CDB7      		in r28,__SP_L__
  93 0012 DEB7      		in r29,__SP_H__
  94               	/* prologue end (size=10) */
 164:main.c        **** 	uartdata=UDR;//调试用的,不用管它
  96               	.LM2:
  97 0014 8091 2C00 		lds r24,44
  98 0018 8093 0000 		sts uartdata,r24
 165:main.c        **** 	nop();
 100               	.LM3:
 101               	/* #APP */
 102 001c 0000      		nop
 166:main.c        **** 	UDR=uartdata;
 104               	.LM4:
 105               	/* #NOAPP */
 106 001e 8091 0000 		lds r24,uartdata
 107 0022 8093 2C00 		sts 44,r24
 108               	/* epilogue: frame size=0 */
 109 0026 DF91      		pop r29
 110 0028 CF91      		pop r28
 111 002a 8F91      		pop r24
 112 002c 0F90      		pop __tmp_reg__
 113 002e 0FBE      		out __SREG__,__tmp_reg__
 114 0030 0F90      		pop __tmp_reg__
 115 0032 1F90      		pop __zero_reg__
 116 0034 1895      		reti
 117               	/* epilogue end (size=8) */
 118               	/* function __vector_11 size 28 (10) */
 120               	.Lscope0:
 122               	.global	main
 124               	main:
 167:main.c        **** }
 168:main.c        **** //******************************************************************************
 169:main.c        **** int main(void)
 170:main.c        **** {
 126               	.LM5:
 127               	/* prologue: frame size=6 */
 128 0036 C0E0      		ldi r28,lo8(__stack - 6)
 129 0038 D0E0      		ldi r29,hi8(__stack - 6)
 130 003a DEBF      		out __SP_H__,r29
 131 003c CDBF      		out __SP_L__,r28
 132               	/* prologue end (size=4) */
 171:main.c        **** ulong t1=0;
 134               	.LM6:
 135 003e 1982      		std Y+1,__zero_reg__
 136 0040 1A82      		std Y+2,__zero_reg__
 137 0042 1B82      		std Y+3,__zero_reg__
 138 0044 1C82      		std Y+4,__zero_reg__
 172:main.c        **** cli();
 140               	.LM7:
 141               	/* #APP */
 142 0046 F894      		cli
 173:main.c        **** //SP=0x45f;	//WinAVR已经初始化堆栈
 174:main.c        **** DDRC=0xc3;
 144               	.LM8:
 145               	/* #NOAPP */
 146 0048 83EC      		ldi r24,lo8(-61)
 147 004a 8093 3400 		sts 52,r24
 175:main.c        **** PORTD=1<<PD0|1<<PD1;
 149               	.LM9:
 150 004e 83E0      		ldi r24,lo8(3)
 151 0050 8093 3200 		sts 50,r24
 176:main.c        **** DDRD=0xfe;
 153               	.LM10:
 154 0054 8EEF      		ldi r24,lo8(-2)
 155 0056 8093 3100 		sts 49,r24
 177:main.c        **** UCSRA=1<<U2X;
 157               	.LM11:
 158 005a 82E0      		ldi r24,lo8(2)
 159 005c 8093 2B00 		sts 43,r24
 178:main.c        **** UCSRB=1<<RXCIE|1<<RXEN|1<<TXEN;
 161               	.LM12:
 162 0060 88E9      		ldi r24,lo8(-104)
 163 0062 8093 2A00 		sts 42,r24
 179:main.c        **** UBRRL=105;   //f0/9615/8+1,9615
 165               	.LM13:
 166 0066 89E6      		ldi r24,lo8(105)
 167 0068 8093 2900 		sts 41,r24
 180:main.c        **** delay_ms(10);
 169               	.LM14:
 170 006c 8AE0      		ldi r24,lo8(10)
 171 006e 90E0      		ldi r25,hi8(10)
 172 0070 0E94 0000 		call delay_ms
 181:main.c        **** Clr_Bit(PORTD,Rst);  //硬盘复位
 174               	.LM15:
 175 0074 8091 3200 		lds r24,50
 176 0078 8F7E      		andi r24,lo8(-17)
 177 007a 8093 3200 		sts 50,r24
 182:main.c        **** delay_ms(40);
 179               	.LM16:
 180 007e 88E2      		ldi r24,lo8(40)
 181 0080 90E0      		ldi r25,hi8(40)
 182 0082 0E94 0000 		call delay_ms
 183:main.c        **** Set_Bit(PORTD,Rst);
 184               	.LM17:
 185 0086 8091 3200 		lds r24,50
 186 008a 8061      		ori r24,lo8(16)
 187 008c 8093 3200 		sts 50,r24
 184:main.c        **** delay_ms(10);
 189               	.LM18:
 190 0090 8AE0      		ldi r24,lo8(10)
 191 0092 90E0      		ldi r25,hi8(10)
 192 0094 0E94 0000 		call delay_ms
 185:main.c        **** HDinit();
 194               	.LM19:
 195 0098 0E94 0000 		call HDinit
 186:main.c        **** //Read_HD_ID();
 187:main.c        **** sei();
 197               	.LM20:
 198               	/* #APP */
 199 009c 7894      		sei
 200               	/* #NOAPP */
 201               	.L3:
 188:main.c        **** 	while(1)
 189:main.c        **** 	{
 190:main.c        **** 		switch(uartdata)
 203               	.LM21:
 204 009e 8091 0000 		lds r24,uartdata
 205 00a2 282F      		mov r18,r24
 206 00a4 3327      		clr r19
 207 00a6 2D83      		std Y+5,r18
 208 00a8 3E83      		std Y+6,r19
 209 00aa 8D81      		ldd r24,Y+5
 210 00ac 9E81      		ldd r25,Y+6
 211 00ae 8430      		cpi r24,4
 212 00b0 9105      		cpc r25,__zero_reg__

⌨️ 快捷键说明

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