该代码为Xilinx SDK Zynq平台下的裸机程序,使用该程序可以实现通过串口敲指令读写寄存器操作,方便调试使用。
menu.h
//******************************************************************************/
#ifndef XHDMI_MENU_H_
#define XHDMI_MENU_H_ /**< Prevent circular inclusions
* by using protection macros */
#include "xil_types.h"
void MenuProcess();
u8 CharisNum(u8 data);
u32 CalcChar(u8* bufptr);
u8 char_2_hex(u8 src);
#endif /* End of protection macro */
menu.c
#include "menu.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "xuartps.h"
#include "xil_io.h"
#include "xpseudo_asm.h"
void MenuProcess() {
u8 Data;
u8 IsValid = TRUE;
int i;
u8 Addr[8];
u8 Dat[8];
u32 addr_c;
u32 data_c;
// Check if the uart has any data
if (XUartPs_IsReceiveData(STDIN_BASEADDRESS)) {
// Read data from uart
Data = XUartPs_RecvByte(STDIN_BASEADDRESS);
//XUartPs_SendByte(STDOUT_BASEADDRESS, Data);
switch(Data){
case 'W' :
case 'w' :{
xil_printf("Setting Write Addr => 0x");
for(i=0;i<8;i++){
Addr[i] = XUartPs_RecvByte(STDIN_BASEADDRESS);
XUartPs_SendByte(STDOUT_BASEADDRESS, Addr[i]);
if(!CharisNum(Addr[i])){
IsValid = FALSE;
xil_printf("\r\nUnknown Value\r\n");
break;
}
}
if(IsValid == FALSE){
break;
}
xil_printf(" Setting Write Data => 0x");
for(i=0;i<8;i++){
Dat[i] = XUartPs_RecvByte(STDIN_BASEADDRESS);
XUartPs_SendByte(STDOUT_BASEADDRESS, Dat[i]);
if(!CharisNum(Dat[i])){
IsValid = FALSE;
xil_printf("\r\nUnknown Value\r\n");
break;
}
}
if(IsValid == FALSE){
break;
}
addr_c = CalcChar(Addr);
data_c = CalcChar(Dat);
Xil_Out32(addr_c,data_c);
//XStl_RegUpdate(addr_c, data_c);
xil_printf("\n\rwaddr:0x%x wdata:0x%x\n\r",addr_c,data_c);
IsValid = TRUE;
break;
}
case 'R' :
case 'r' :{
xil_printf("Setting Read Addr => 0x");
for(i=0;i<8;i++){
Addr[i] = XUartPs_RecvByte(STDIN_BASEADDRESS);
XUartPs_SendByte(STDOUT_BASEADDRESS, Addr[i]);
if(!CharisNum(Addr[i])){
IsValid = FALSE;
xil_printf("\r\nUnknown Value\r\n");
break;
}
}
if(IsValid == FALSE){
break;
}
addr_c = CalcChar(Addr);
data_c = Xil_In32(addr_c);
xil_printf("\n\rraddr:0x%x rdata:0x%x\n\r",addr_c,data_c);
IsValid = TRUE;
break;
}
case '\r':{//╗╗ллич
XUartPs_SendByte(STDOUT_BASEADDRESS, '\n');
break;
}
default :
xil_printf("Unknown option\r\n");
IsValid = FALSE;
break;
}
}
}
u8 CharisNum(u8 data){
u8 isnum = 0;
if((data >=0x30 && data <= 0x39)||(data >=0x41 && data <= 0x46)||(data >= 0x61 && data <= 0x66)){
isnum = 1;
}
else{
isnum = 0;
}
return isnum;
}
u8 char_2_hex(u8 src)
{
uint8_t desc;
if((src >= '0') && (src <= '9'))
desc = src - 0x30;
else if((src >= 'a') && (src <= 'f'))
desc = src - 0x57;
else if((src >= 'A') && (src <= 'F'))
desc = src - 0x37;
return desc;
}
u32 CalcChar(u8* bufptr){
u8 dstbuf[8];
u32 calcdata = 0;
for(int i=0;i<8;i++){
dstbuf[i] = char_2_hex(bufptr[i]);
}
for(int i=0;i<8;i++){
calcdata = calcdata + (dstbuf[i]<<((7-i)*4));
}
return calcdata;
}