Free Master 串口驱动代码移植到GD32F303

FreeMASTER是一种用户友好的实时调试监视器和数据可视化工具,可用于运行时配置和调试嵌入式软件应用。因为Free Master在实际使用中可以大大简化调试过程,可实时观测与改变、记录调试过程中的运行数据,所以准备将其移植至GD32F303的开发平台上,方便后续调试工作的进展。

在此记录下对FreeMASTER的串口通讯驱动移植的过程。

1.准备

1.1 首先去NXP官网FreeMASTER Run-Time Debugging Tool | NXP Semiconductors下载Free Master的两个安装包,并安装

FMASTERSW25.exe (Free Master上位机程序)

FMASTERSCIDRV.exe(Free Master 通讯驱动,包含串口驱动的源代码)

其次还需要移植目标板的可正常收发数据的串口例程(我这里用的是GD32F303CCT6的串口例程),编译器是KEIL5(526)

1.2  首先将Free Master的串口驱动源码文件夹src_common 拷贝到事先准备的工程目录之下

串口驱动源码默认的路径如下图

其次将src_platforms 文件夹下的Kxx中的4个文件文件复制到刚刚已经拷贝到工程目录下的src_common文件夹中去

 

如果在安装通讯驱动程序的时候选择安装在其他盘请去对应的位置寻找相应的文件。

src_common中的文件主要是Free Master的一些通信驱动程序,src_platforms中的文件是NXP针对自己的处理器做出的一些配置文件。我就是在此基础上进行移植工作。

2.开始移植

2.1 配置工程文件

打开工程 并且将src_common文件夹下的所有文件添加进工程

 并在编译器中添加

 2.2

main函数中包含#include "freemaster.h"

 

在初始化中添加Free Master初始化函数 FMSTR_Init();

在主循环中添加FMSTR_Poll();
        FMSTR_Recorder();

 在串口中断函数中添加  FMSTR_Isr();    用来设置好准备接受并处理从上位机传来的数据

 2.3移植串口驱动

打开初始化FMSRT_Init 函数中的  static void FMSTR_Listen(void)  函数,这个函数是初始化串口状态用来准备接受上位机发送的数据。这个函数的作用是设置好相关的工作条件,并且关闭串口发送,使能接受,就是一个准备好接受上位机数据的状态。

函数中两处设置串口的状态需要根据处理器的相关驱动来修改,具体如下所示

将 
   FMSTR_SCI_TD();
   FMSTR_SCI_RE();

替换成
    /*取消串口发送完成中断*/
    usart_interrupt_disable(USART0, USART_INT_TC); 
    /*开启串口接受*/
     usart_interrupt_enable(USART0, USART_INT_RBNE);
  
将
    FMSTR_SCI_DTXI();   /* disable SCI transmit interrupt */
    FMSTR_SCI_ERXI();   /* enable SCI receive interrupt */

  替换成  	

	/* disable transmit*/
	usart_transmit_config(USART0, USART_TRANSMIT_DISABLE);
		/*enable receive interrupts*/
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);

打开主循环中的    FMSTR_Poll(); 函数 在其中找到FMSTR_RxDequeue(); 函数并打开,

在FMSTR_RxDequeue();中找到(void)FMSTR_Rx(nChar); 函数并打开,

在FMSTR_Rx(nChar);中找到 FMSTR_ProtocolDecoder(pcm_pCommBuffer);并打开

在FMSTR_ProtocolDecoder(pcm_pCommBuffer);找到FMSTR_SendResponse(pMessageIO, nSize);并打开

需要对FMSTR_SendResponse(pMessageIO, nSize);中的相关的串口驱动进行修改。对应上文的接受,这边需要关闭接受,打开发送

将
FMSTR_SCI_RD();
FMSTR_SCI_TE();
替换成
		/* disable transmit*/
usart_transmit_config(FMSTR_COM, USART_TRANSMIT_ENABLE);
		/*enable receive interrupts*/
usart_receive_config(FMSTR_COM, USART_RECEIVE_DISABLE );

将
FMSTR_SCI_DRXI()
FMSTR_SCI_ETXI();

替换成
usart_interrupt_disable(FMSTR_COM,USART_INT_RBNE);
usart_interrupt_enable(FMSTR_COM,USART_INT_TC);

还有个发送函数

 将
FMSTR_SCI_PUTCHAR(FMSTR_SOB);
替换成
usart_data_transmit(FMSTR_COM, FMSTR_SOB);

删除 
dummySR = FMSTR_SCI_GETSR();
FMSTR_UNUSED(dummySR);
因为此部分在程序中并无实质作用,但是不注释的话会影响整体运行, 所以这边做删除处理

最后打开串口中断函数中的 void FMSTR_ProcessSCI(void)具体代码我直接贴在下面

void FMSTR_ProcessSCI(void)
{
   
	
	/* transmitter active and empty? */	
	if(USART_CTL0(FMSTR_COM) &USART_CTL0_TEN )//判断USART0串口发送是否使能
	{
		/* able to accept another character? */		
		if(usart_flag_get(FMSTR_COM,USART_FLAG_TBE))	/* if(wSciSR & FMSTR_SCISR_TDRE)*///判断是否可以发送数据
		{
			FMSTR_U8 ch;			
			/* just put the byte into the SCI transmit buffer */
			if(!FMSTR_Tx(&ch))
				/***FMSTR_SCI_PUTCHAR((FMSTR_U8) ch);***/
			
					 usart_data_transmit(USART0,ch);//发送数据
		}
        
#if FMSTR_SCI_HAS_TXQUEUE
        /* waiting for transmission complete flag? */
        if(USART_GetFlagStatus(FMSTR_COM,USART_FLAG_TC))	/* if(pcm_wFlags.flg.bTxWaitTC && (wSciSR & FMSTR_SCISR_TC))*/
        {
            /* after TC, we can switch to listen mode safely */
            FMSTR_Listen();
        }
#endif


#if !FMSTR_SCI_TWOWIRE_ONLY
        /* read-out and ignore any received character (loopback) */     
        if(usart_flag_get(FMSTR_COM,USART_FLAG_RBNE))//如果接受数据寄存器非空---接收到数据
        {
            /*lint -esym(550, nRxChar) */
            volatile FMSTR_U16 nRxChar;           
            nRxChar =  usart_data_receive(FMSTR_COM);	//接受到的数据存入数组
        }
#endif
    }
    /* transmitter not active, able to receive */
    else
    {
        /* data byte received? */
        /*if (wSciSR & FMSTR_SCISR_RDRF)*/
        if(usart_flag_get(FMSTR_COM,USART_FLAG_RBNE))//接受寄存器非空,接收到数据
        {
            FMSTR_BCHR nRxChar = 0U;
            nRxChar = usart_data_receive(FMSTR_COM);//接收数据
            FMSTR_RxQueue(nRxChar);//发送数据
         
        }
    }
}

最后在fremaster_serial.c 文件中包含 gd32f30x.h的头文件

#include "gd32f30x.h"

2.4 添加目标变量

为了验证驱动移植是否成功,在主循环中加上  用来观测的变量,以此来确认。


    

 2.5编译

编译生成.axf 文件之后 ,下载到目标板,并复位目标板

3配置Free Master

3.1硬件配置

因为本次移植的是串口驱动程序,所以需要在上位机上外接一个USB TO TTL 的串口,

根据配置的串口驱动PB7为输入 PB6为输出,

所以PB7连接串口的TX脚 PB6连接串口的RX脚

3.2Free Master上位机配置

打开之前安装的FreeMASTER 2.5,(因为此版本的功能足够使用,并且3.1版本的安装包太大,综合考虑选择的2.5版本)

3.2.1 配置通讯

在project 选项中 选择Options

选择使用的串口,并且选择根据程序中配置的串口波特率进行选择,我这里是用的COM5

波特率选择的是9600。

 

然后在 MAP Flies 选项中的 Default Symbol 中选择刚刚目标工程编译工程生成的. axf文件,

在Form format中选择第一个选项之后点击确定。

3.2.2配置变量

在project 选项中 选择 Variables

 

 在弹出的Variables  List界面中点击 Generate

在弹出的界面中选择 需要观测的变量,之后选择 Generate single variables,选择完成之后一开始选择的变量前面就会打勾,说明生成完成。点击Close.

在弹出的 Variables  List 界面中中可以看到已经生成的变量,点击close

 

 3.2.3配置OScilloscope(示波器)

OScilloscope:功能类似示波器,实时刷新变量,以变量(Y轴)-时间(X轴)或变量(Y轴)-变量(X轴)的方式将变量变化图形化显示。由于其刷新速率受通信速率的限制,最短刷新时间为 10ms。

在工程中使用 OScilloscope 需要我们新建示波器并且添加到工程中,具体操作如下

1.右击工程,点击Create Oscillscope

2.在 Oscillscope  Properties 界面中选择Setup ,选择上文中添加的需要观测的变量TIMES之后点击确定。(main 选项中是示波器的一些设定)

 3.点击确定后可以看到已经生成了示波器

 3.2.4 配置 观察视窗

 Free Master的观察视窗中可以观察任意多个变量,并且可以在线修改变量,同样这个功能因为是需要手动添加进工程:

1.右键图中的Variable Watch 的NAME下的空白窗口 选择弹出的 Watch Properities

2.在弹出的 Project Block Properties 窗口中选择 WATCH ,选中需要观测的变量,点击Add-> 

将其添加到Watched Variables  窗口中 最后点击确定

3. 此时变量已经添加成功,但是还没办法直接修改,需要右击观测变量同行的单元格之后选择 ,

Edit variable

4. 在弹出的 Variable 窗口中选择 Modyfying 选项卡,在Modyfying mode 中选择 Anybody value within proper limits  ,最后点击确定 即可。就可以在线修改芯片中变量了。

5.在Variable Watch 窗口中找到自己添加观测的变量后的对应的Value列下如果出现一个下拉选项框,就是配置完成,可以在线修改所观测的变量了。

 3.2.4 配置Recorder

Recorder:不断记录数据,在需要时调出所有数据进行观察的工具。每调用一次 FMSTR_Recorder() 函数,就进行一次数据的记录,故可根据需要安排 FMSTR_Recorder() 函数的位置。该函数会在每次被调用时将需要观察的变量值储存在一个 buffer 中,buffer 被填充到设定的长度后,收集到的数据会传给 PC 端的 FreeMASTER 上位机,并可以以图形化的方式显示出来。其优点是使采样周期大大缩短,而缺点是不能实时观察数据,即观察到的数据由于定时批量传输存在一定的延时。当然,其可观察到的点数受所设置 buffer 大小的限制。

配置如下:

1.右键新建的工程,在弹出的窗口中选择 Create Recorder

2.在弹出的 Recorder Properties 窗口中选择 Recorder samples 选择一次记录的数据数量是多少

3.接下来在Setup窗口中选择变量,可以进行相关设置

 4. 在Trigger 的Trigger variable 中选择需要记录的变量 并且选择触发值,最后点击确定即可

5.设置完成之后左下角会显示Recorder is idle

 4.FreeMaster 的使用

Free Master已经配置完成,直接运行查看变量,点击图中的 G0即开始运行

4.1OScilloscope(示波器)

Free Master运行之后的times变量如图所示,与程序逻辑一致

4.2观察视窗

 1.可以看到框选区域的数值一直在变化,与上面波形一致

2. 在VALUE中输入想要调整的数值,可以看到波形随之变化(我输入的是0)

 

 4.3 Recorder

1. 打开recorder可以看到已经将触发的值记录下来了

2.如果需要将数值以TXT文件形势下载下来的话需要提前选中下图中框选出来的按钮,这样记录数据的同时就会生成对应的TXT文件

3.设置文件路径,或者查找文件保存路径需要选择 Recorder 中的 Data Capture Setup

下图中红色框框框选出来的就是TXT文件的保存路径。

PS:重新下载程序之后可能会导致Recorder在记录数据的时候产生 Response Timeout的错误,此时需要重新拔插一下串口即可正常使用Recorder进行数据的下载。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用GD32F303芯片的ADC代码示例: ```c #include "gd32f30x.h" void ADC_Configuration(void) { /* 使能 ADC0 时钟 */ rcu_periph_clock_enable(RCU_ADC0); /* 配置 ADC0 工作模式为单次转换模式 */ adc_mode_config(ADC_MODE_FREE); /* 配置 ADC0 外部触发源为软件触发 */ adc_external_trigger_source_config(ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_NONE); /* 配置 ADC0 触发通道为 ADC_CHANNEL_0 */ adc_channel_length_config(ADC_INSERTED_CHANNEL, 1); adc_inserted_channel_config(0, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5); /* 配置 ADC0 转换个数为1 */ adc_special_function_config(ADC_INSERTED_CHANNEL, ADC_SCAN_MODE, DISABLE); adc_special_function_config(ADC_INSERTED_CHANNEL, ADC_CONTINUOUS_MODE, DISABLE); adc_special_function_config(ADC_INSERTED_CHANNEL, ADC_INSERTED_SCAN, DISABLE); /* 使能 ADC0 */ adc_enable(ADC_INSERTED_CHANNEL); /* ADC0 开始转换 */ adc_calibration_enable(ADC_INSERTED_CHANNEL); } int main(void) { /* ADC 配置 */ ADC_Configuration(); while (1) { /* ADC0 开始转换 */ adc_software_trigger_enable(ADC_INSERTED_CHANNEL); /* 等待 ADC0 转换完成 */ while (RESET == adc_flag_get(ADC_INSERTED_CHANNEL, ADC_FLAG_EOC)); /* 读取 ADC0 转换结果 */ uint16_t adc_value = adc_injected_data_read(ADC_INSERTED_CHANNEL, 0); /* 处理 ADC0 转换结果 */ // TODO } } ``` 此代码使用单次转换模式进行 ADC0 转换,触发通道为 ADC_CHANNEL_0,转换结果存储在插入通道的第一个转换结果中。ADC0 的转换结果可以通过调用 `adc_injected_data_read` 函数来读取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值