发表于
2008-6-29 11:19:10
系统软件的解析:
整体的框架:SF初始化à关中断à发送欢迎信息à{等待XONà等待命令的到来à执行指令} {}内的为循环
cold_start: CALL SF_init ;initialise StrataFLASH controls 复位读写使能信号,清空内容
CALL delay_1s ;delay because UART is fast and JTAG startup sequence can be slow
ENABLE INTERRUPT ;Interrupt is used for XON/XOFF flow control
welcome_start: CALL send_CR
CALL send_welcome ;start up message and version number
;******************************************************************************
; Main menu and command selection
;******************************************************************************
;
;
warm_start: CALL send_Menu ;Menu and command selection
CALL send_CR
;
prompt: CALL send_CR
CALL send_CR
LOAD UART_data, character_greater_than ;prompt for input ;显示'>'等待输入
CALL send_to_UART ;回显
CALL read_upper_case
COMPARE s0, character_E ;test for commands and execute as required比较输入的字幕,并执行相应的命令
JUMP Z, erase_command
COMPARE s0, character_B
JUMP Z, block_erase_command
COMPARE s0, character_P
JUMP Z, program_command
COMPARE s0, character_W
JUMP Z, write_command
COMPARE s0, character_R
JUMP Z, read_command
COMPARE s0, character_I
JUMP Z, SF_information
COMPARE s0, character_H
JUMP Z, welcome_start
COMPARE s0, character_S
JUMP Z, SF_status
CALL send_CR ;no valid command input
LOAD UART_data, character_question ;display ???
CALL send_to_UART
CALL send_to_UART
CALL send_to_UART
JUMP prompt ;Try again!
在读入一般字符前的工作:首先看接收fifo是不是正在接收数据,如果fifo是空的,子程序等待知道有一个数据可以被读取,如果接收的到的数据是一个XOFF,那么子程序就会等待XON的到来。这意味着剩下的程序背悬挂着,因此不能传递数据。一旦收到一个XON,他会等待一个一般的字符到来(在返回之前)
CALL read_upper_case
read_upper_case: CALL read_from_UART ;read command character from UART
CALL send_to_UART ;echo character
LOAD s0, UART_data ;convert to upper case
CALL upper_case
RETURN
read_from_UART: DISABLE INTERRUPT
wait_Rx_character: INPUT s0, status_port ;test Rx_FIFO buffer
TEST s0, rx_data_present ;rx_data_present=08
JUMP NZ, read_character ;判断是否正在接收数据,如果没有那么开始读取数据,否则继续等待
JUMP wait_Rx_character
read_character: INPUT UART_data, UART_read_port ;read from FIFO,从串口输入数据,
COMPARE UART_data, character_XOFF ;test for XOFF
JUMP Z, wait_XON
ENABLE INTERRUPT ;normal finish
RETURN
wait_XON: INPUT s0, status_port ;test Rx_FIFO buffer
TEST s0, rx_data_present
JUMP NZ, read_XON
JUMP wait_XON
read_XON: INPUT UART_data, UART_read_port ;read from FIFO
COMPARE UART_data, character_XON ;test for XON
JUMP Z, wait_Rx_character ;now wait for normal character
JUMP wait_XON ;continue to wait for XON
下面重点介绍一个其中一个命令program_command的执行过程。
先介绍一下MCS文件的格式:
;Store up to one line of an MCS file as bytes
;: Start character which is not stored
;10 Number of data bytes included (16 in this case)
;aaaa Lower 16-bits of the storage address
;00 Record type (data in this case)
;dddd... Data bytes (typically 16 which is the maximum)
;cc Checksum
;CR/LF Line will end in carriage return and/or line feed which is not stored.
CONSTANT line_start, 2B 在scratch pad memory存储的起始地址,一行数据4+16+1供21字节CONSTANT
data_start, 2F 数据开始的地址
program_command: CALL send_CR
CALL send_Waiting_MCS_file
CALL program_MCS
CALL send_OK
JUMP prompt
send_Waiting_MCS_file: LOAD UART_data, character_W 打印等待信息
CALL send_to_UART
……………………………………….
CALL send_to_UART
LOAD UART_data, character_r
CALL send_to_UART
send_MCS_file: CALL send_space
LOAD UART_data, character_M
……………………………………….
CALL send_CR
RETURN
从串口读取MCS文件,并给SF相应的地址写入相应的数据。这个子程序直到文件的的结束符收到后停止,因为MCS每一行的包含地址,那么当前的地址将会被输出(作为写SF的地址)
program_MCS: CALL read_MCS_line ;read line from UART()主要的
CALL MCS_address ;find start address and record type
COMPARE sB, 01 test for end record
RETURN Z ;end of programming
COMPARE sB, 04 ;test for extended address record
JUMP Z, program_MCS; no data with this record and upper address now correct
write_spm_data: CALL send_hex_3bytes ;send address to indicate progress
CALL send_CR
FETCH sA, line_start ;read number of data bytes to program
CALL SF_buffer_write ;write bytes to memory
JUMP program_MCS
读取一行的MCS字符到scratch pad memory。
在接收到'line_start'后开始读。子程序会检测‘:’,忽略前面的所有的数据,包括多有的回车和LF,然后读取相继两个字符,然后把它转换成为真正的16进制,然后存储在scratch pad memory,当有CR或LF的时候,表示这条线结束。上一个返回的寄存器SE的值,将会指向scratch pad memory下一个读取的数据的存储地址。
read_MCS_line: LOAD sE, line_start ;initialise SPM memory pointer
wait_MCS_line_Start: CALL read_from_UART ;read character
COMPARE UART_data, character_colon ;test for start character“:”
JUMP NZ, wait_MCS_line_Start
read_MCS_byte: CALL read_from_UART ;read character
COMPARE UART_data, character_CR ;test for end of line
RETURN Z
COMPARE UART_data, character_LF ;test for end of line
RETURN Z
LOAD s3, UART_data ;upper nibble character高四位
CALL read_from_UART ;read character
LOAD s2, UART_data ;lower nibble character低四位、
CALL ASCII_byte_to_hex ;convert to true hex value把接收到的字符转换成16进制
STORE s0, (sE) ;write to SPM
ADD sE, 01 ;increment pointer
JUMP read_MCS_byte
Determine the current address for the line of an MCS file in scratch pad memory(决定当前的MCS行在scratch pad memory中的地址。)核对保存在scratch pad memory中的起始符号,并决定当前地址。地址保存在[s9,s8,s7] 。
A record type of 04 will update [s9].