微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA移植ALIENTEK的USMART调试组件

FPGA移植ALIENTEK的USMART调试组件

时间:10-02 整理:3721RD 点击:
     USMART 调试组件由ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。
     USMART 最主要的功能就是通过串口调用单片机里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字 (10/16进制,支持负数)、字符串、函数入口地址等作为参数),单个函数最多支持 10 个输入参数,并支持函数返回值显示,对我们调试代码是很有帮助的。
     USMART是用于STM32上的,由于其方便调试,小编将其移植到FPGA中,当然要首先在FPGA中添加一个CPU核(话说不这样怎么写C语言。)使用的FPGA为SPARTAN6,晶振为50MHZ。在此写下移植过程分享给大家。    先上图,串口调试助手发送函数让LED切换。
   


代码工程结构如下图(感谢原子对我学习stm32的帮助,有些习惯受其影响较大):


第一步:新建delay.c和delay.h文件。
                delay.c里主要为定时器0初始化和中断函数。定时器0主要作USMART的扫描函数的100ms的定时。
                delay.c里还写里一个简单的延时函数。delay.c里的#include "usmart.h"为原子的usmart提供的文件。
                delay.h里主要是函数声明。
                delay.c具体代码如下:

  1. /***************************** Include Files *********************************/
  2. #include "delay.h"
  3. //#include "led.h"

  4. u32 timer0_num=0;
  5. /**********************************************************************
  6. ***********************************************************************/

  7. void timer_int_handler(void * baseaddr_p)
  8. {
  9.         unsigned int csr;
  10.         csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0); // read control/status register
  11.         if(csr &XTC_CSR_INT_OCCURED_MASK) // if interrupt is occurred
  12.         {
  13.             timer0_num++;
  14.             usmart_dev.scan();
  15.             if(timer0_num==1000)
  16.             {
  17.                 timer0_num=0;
  18.             }
  19.         }
  20.         XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR,0, csr); //clear interrupt indication
  21. }

  22. /**********************************************************************
  23. ***********************************************************************/
  24. void Timer0_init()
  25. {
  26.     init_platform();
  27.         XIntc_RegisterHandler(XPAR_INTC_0_BASEADDR,      //register timer0 interrupt and handler process
  28.                                       XPAR_AXI_INTC_0_AXI_TIMER_0_INTERRUPT_INTR,
  29.                                       (XInterruptHandler) timer_int_handler,
  30.                                       (void *)XPAR_AXI_TIMER_0_BASEADDR);

  31.                                                        
  32.         microblaze_enable_interrupts(); //enable microblaze interrupt
  33.         XIntc_MasterEnable(XPAR_INTC_0_BASEADDR); //enable interrupt 0
  34.         XIntc_EnableIntr(XPAR_INTC_0_BASEADDR, XPAR_AXI_TIMER_0_INTERRUPT_MASK); //enable timer0 interrupt
  35.         XTmrCtr_SetLoadReg(XPAR_AXI_TIMER_0_BASEADDR, 0, 10000); //set timer0 reload value 0.2mS
  36.         XTmrCtr_EnableIntr(XPAR_AXI_TIMER_0_BASEADDR, 0); //enable timer0 generate interrupt signal
  37.         //set timer0 work mode and start counter
  38.         XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK |
  39.                                                                                                                                 XTC_CSR_ENABLE_INT_MASK |
  40.                                                                                                                                 XTC_CSR_AUTO_RELOAD_MASK |
  41.                                                                                                                                 XTC_CSR_DOWN_COUNT_MASK);
  42. }
  43. /**********************************************************************
  44. ***********************************************************************/
  45. void delayms(unsigned int x)
  46. {
  47.     unsigned int i,j;   
  48.     while(x--)   
  49.     {   
  50.         for(j = 0;j (UART_REC_LEN-1))UART_RX_STA=0;

  51.                    }                 
  52.               }
  53.          }                                   
  54.     }   
  55. }

复制代码


uart.h具体代码如下:

  1. #ifndef __UART_H__
  2. #define __UART_H__
  3. /***************************** Include Files *********************************/

  4. #include "xparameters.h"
  5. #include "xuartlite.h"
  6. #include "xuartlite_l.h"
  7. //#include "platform.h"
  8. #include "xintc.h"
  9. #include "xil_exception.h"
  10. #include "types.h"

  11. /************************** Constant Definitions *****************************/

  12. /*
  13. * The following constants map to the XPAR parameters created in the
  14. * xparameters.h file. They are defined here such that a user can easily
  15. * change all the needed parameters in one place.
  16. */
  17. #define UARTLITE_DEVICE_ID      XPAR_UARTLITE_0_DEVICE_ID
  18. #define INTC_DEVICE_ID          XPAR_INTC_0_DEVICE_ID
  19. #define UARTLITE_INT_IRQ_ID     XPAR_INTC_0_UARTLITE_0_VEC_ID

  20. /*
  21. * The following constant controls the length of the buffers to be sent
  22. * and received with the UartLite device.
  23. */
  24. #define TEST_BUFFER_SIZE        100
  25. #define UART_REC_LEN            200  

  26. int Uart0_init(void);
  27. int UartLiteIntr(u16 DeviceId);
  28. int SetupInterruptSystem(XUartLite *UartLitePtr);
  29. void uart0_rev_handler(void);
  30. void SendHandler(void *CallBackRef, unsigned int EventData);
  31. void RecvHandler(void *CallBackRef, unsigned int EventData);

  32. #endif


复制代码

第三步:添加usmart源码,原子提供的共有5个文件,分别为usmart.c、usmart.h、usmart_config.c、
              usmart_str.c和usmart_str.h。
              usmart.h、usmart_str.c基本不需要改动。
              usmart_str.h里把#include "stm32f4xx.h"删掉,替换为#include "delay.h"即可。
              usmart_config.c是用户自定义,用户添加自己需要调试的函数。
             重点是对usmart.c的修改。
              1.删掉#include "usart.h"和 #include "sys.h" ,添加#include "uart.h"
              2.添加外部参数声明:
                                               extern u8 UART_RX_BUF[UART_REC_LEN];  
                                               extern u16 UART_RX_STA;           
                                               extern u32 timer0_num;
              3.替换void usmart_reset_runtime(void)函数里的内容
                 替换为:
                                timer0_num=0;
                                usmart_dev.runtime=0;        
              4.替换u32 usmart_get_runtime(void)函数里的内容
                 替换为:
                               usmart_dev.runtime+=timer0_num;
                               return usmart_dev.runtime;                //·μ????êy?μ
              5.删掉void TIM4_IRQHandler(void)函数(usmart_dev.scan();已写在delay.c定时器0中断里),
                 删掉void Timer4_Init(u16 arr,u16 psc)函数。
              6.修改void usmart_init(u8 sysclk)函数,要去掉形参,要记得在h文件函数声明里做对应修改,就是说要改做这样void (*init)(void);//扫描。

  1. void usmart_init(void)
  2. {
  3.         #if USMART_ENTIMX_SCAN==1
  4.                 Timer0_init();
  5.         #endif
  6.                 usmart_dev.sptype=1;        //十六进制显示参数
  7. }       

复制代码

  1. void usmart_reset_runtime(void)
  2. {
  3.         timer0_num=0;
  4.         usmart_dev.runtime=0;       
  5. }

复制代码

至于usmart_config.c的修改我也提供一个范例好了:

  1. #include "usmart.h"
  2. #include "usmart_str.h"
  3. ////////////////////////////用户配置区///////////////////////////////////////////////
  4. //这下面要包含所用到的函数所申明的头文件(用户自己添加)
  5. #include "delay.h"
  6. #include "led.h"
  7. //#include "sys.h"
  8. //#include "lcd.h"
  9.                                                                                                  
  10. //extern void led_set(u8 sta);
  11. //extern void test_fun(void(*ledset)(u8),u8 sta);
  12. //函数名列表初始化(用户自己添加)
  13. //用户直接在这里输入要执行的函数名及其查找串
  14. struct _m_usmart_nametab usmart_nametab[]=
  15. {
  16. /*
  17. #if USMART_USE_WRFUNS==1         //如果使能了读写操作
  18.         (void*)read_addr,"u32 read_addr(u32 addr)",
  19.         (void*)write_addr,"void write_addr(u32 addr,u32 val)",         
  20. #endif                  
  21.         (void*)delay_ms,"void delay_ms(u16 nms)",
  22.         (void*)delay_us,"void delay_us(u32 nus)",         
  23.         (void*)LCD_Clear,"void LCD_Clear(u16 Color)",
  24.         (void*)LCD_Fill,"void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)",
  25.         (void*)LCD_DrawLine,"void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)",
  26.         (void*)LCD_DrawRectangle,"void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)",
  27.         (void*)LCD_Draw_Circle,"void Draw_Circle(u16 x0,u16 y0,u8 r)",
  28.         (void*)LCD_ShowNum,"void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)",
  29.         (void*)LCD_ShowString,"void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)",
  30.         (void*)LCD_Fast_DrawPoint,"void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)",
  31.         (void*)LCD_ReadPoint,"u16 LCD_ReadPoint(u16 x,u16 y)",                                                         
  32.         (void*)LCD_Display_Dir,"void LCD_Display_Dir(u8 dir)",
  33.         (void*)LCD_ShowxNum,"void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)",
  34.         (void*)led_set,"void led_set(u8 sta)",
  35.         (void*)test_fun,"void test_fun(void(*ledset)(u8),u8 sta)",

  36. */
  37.         (void*)delayms,"void delayms(unsigned int x)",
  38.         (void*)led_on,"void led_on(u32 led_num)",
  39.         (void*)led_off,"void led_off(u32 led_num)",

  40. };                                                  
  41. ///////////////////////////////////END///////////////////////////////////////////////
  42. /////////////////////////////////////////////////////////////////////////////////////
  43. //函数控制管理器初始化
  44. //得到各个受控函数的名字
  45. //得到函数总数量
  46. struct _m_usmart_dev usmart_dev=
  47. {
  48.         usmart_nametab,
  49.         usmart_init,
  50.         usmart_cmd_rec,
  51.         usmart_exe,
  52.         usmart_scan,
  53.         sizeof(usmart_nametab)/sizeof(struct _m_usmart_nametab),//函数数量
  54.         0,                  //参数数量
  55.         0,                 //函数ID
  56.         1,                //参数显示类型,0,10进制;1,16进制
  57.         0,                //参数类型.bitx:,0,数字;1,字符串            
  58.         0,                  //每个参数的长度暂存表,需要MAX_PARM个0初始化
  59.         0,                //函数的参数,需要PARM_LEN个0初始化
  60. };   
  61. 总的来说,由于原工程的代码写的实在是精彩,所以移植其实是很顺利的,如果依旧不是很清楚可以去看我师弟的帖子,他的叙述比我的详细得多 51单片机移植ALIENTEK的USMART调试组件

复制代码




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top