Xilinx SDK Menu 程序

该代码为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;
}







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值