(14)产生频率可变的正弦波 ——PS端控制频率字 GPIO函数介绍 添加自己的函数

本文介绍了如何通过PS端控制频率字来产生频率可变的正弦波,详细阐述了代码实现、ILA调试过程以及GPIO的相关函数。在Vivado中创建Block Design,使用UART接收频率值,通过GPIO输出频率字,利用ILA验证不同频率下的正弦波形,并讲解了中断初始化、中断连接等API函数的用法。
摘要由CSDN通过智能技术生成

产生频率可变的正弦波——PS控制频率字

1.代码   2.结果  3.步骤  4.函数介绍  5.分析与感想  6.添加自己的函数

一.代码:

#include "xparameters.h"
#include "xgpio.h"
#include "xuartps.h"	// if PS uart is used
XUartPs Uart_PS;		/* Instance of the UART Device */
//====================================================
// 在 UART获取频率值
int GetNum (){
	uint8_t byte;
	uint8_t uartBuffer[16];
	int validNumber;
	int digitIndex;
	int digit, number, sign;
	int c;

	while(1){
		byte = 0x00;
		digit = 0;
		digitIndex = 0;
		number = 0;
		validNumber = TRUE;

		//get bytes from uart until RETURN is entered
		while(byte != 0x0d){
			while (!XUartPs_IsReceiveData(STDIN_BASEADDRESS));
			byte = XUartPs_ReadReg(STDIN_BASEADDRESS,
								    XUARTPS_FIFO_OFFSET);
			uartBuffer[digitIndex] = byte;
			XUartPs_Send(&Uart_PS, &byte, 1);
			digitIndex++;
		}

		//calculate number from string of digits
		for(c = 0; c < (digitIndex - 1); c++){
			if(c == 0){
				//check if first byte is a "-"
				if(uartBuffer[c] == 0x2D){
					sign = -1;
					digit = 0;
				}
				//check if first byte is a digit
				else if((uartBuffer[c] >> 4) == 0x03){
					sign = 1;
					digit = (uartBuffer[c] & 0x0F);
				}
				else
					validNumber = FALSE;
			}
			else{
				//check byte is a digit
				if((uartBuffer[c] >> 4) == 0x03){
					digit = (uartBuffer[c] & 0x0F);
				}
				else
					validNumber = FALSE;
			}
			number = (number * 10) + digit;
		}
		number *= sign;
		if(validNumber == TRUE){
			print("\r\n");
			return number; //number of bytes
		}
		print("This is not a valid number.\n\r");
	}
}

int main (void) 
{

      XGpio freq_inn,sws;
	  int sws_check;
	  unsigned  long int numfreq;  // uart接收的频率值
      unsigned  long int k;        //计算后的频率字

	  // AXI GPIO  Initialization
	  XGpio_Initialize(&sws, XPAR_SWITCHES_DEVICE_ID);
	  XGpio_SetDataDirection(&sws, 1, 0xffffffff);		    //通道1, 0xfff...1为input
	  XGpio_Initialize(&freq_inn, XPAR_FREQWORD_DEVICE_ID);
	  XGpio_SetDataDirection(&freq_inn, 1, 0);				// 0为output
	  // UART initialization
	  int Status;
		XUartPs_Config *Config;
		Config = XUartPs_LookupConfig(XPAR_PS7_UART_0_DEVICE_ID);
			if (NULL == Config) {
				return XST_FAILURE;
			}
			Status = XUartPs_CfgInitialize(&Uart_PS, Config, Config->BaseAddress);
			if (Status != XST_SUCCESS) {
				return XST_FAILURE;
			}
      		xil_printf("等待输入频率值\n 1*10^6:1M\n 1*10^7:10M\n");
功能实现//
      while(1){
    	    int reg01=43; // 2^32--32位计数器
    		int fclk=1;   //时钟频率 上下同除100M
		    do{
		    	numfreq= GetNum();                     // uart 输入的数字为 频率值
		    	k = (numfreq * reg01)/fclk;            //计算频率字
		    }while(numfreq == 0);
		    xil_printf("频率值:%d \n",numfreq);
		    xil_printf("频率字: %d \n",k);

		   XGpio_DiscreteWrite(&freq_inn, 1, numfreq);//将获取的频率字传入freqword对应的GPIO
		    sws_check=XGpio_DiscreteRead(&sws, 1);     //读取按键状态,随时准备跳出循环
		    if((sws_check & 0x03)==0x03){
		      			  break;
		      }
      }
    xil_printf("-- end process --\r\n");
	  return 0;
}

二.结果:

UART串口值:输入频率值,计算出频率字并显示

ILA显示正弦波:输入频率 100M

1M:对应100个采样点(5567-5467)

2M:对应50个采样点(5524-5474)

10M:对应10个采样点(5539-5529)

三.步骤:

(1)创建block design

1.点击create block design

2.添加zynq,然后 Run Block Automation,保留UART 和GPIO的配置

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值