742|2

319

帖子

0

资源

一粒金砂(高级)

【GD32L233C-START 评测】-五、GD32移植原子串口调试组件实现串口函数调试 [复制链接]

以前用stm32的时候,对原子的串口调试组件印象比较深刻,因此就移植组件来测试下串口函数调试功能。

image.png  原子的组件包含3个文件,只需要在usmart_config.c中加入需要调试的函数就可以实现串口调试

image.png

 功能实现后的串口窗口

image.png

具体实现过程简述

首先改写usart.c函数,需要配合组件对接收到长度值进行调整

 定义串口缓存,以及长度指示值

u8 USART0_RECEIVE_DATA[USART0_RECV_LEN]; 
u16 USART0_RX_STA=0;

配置串口

void USART_Config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);        //使能GPIOA时钟
    rcu_periph_clock_enable(RCU_USART0);    //使能USART0时钟

    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);//启用PA9端口USART0_TX功能
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);//启用PA10端口USART0_RX功能

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);//推挽输出

    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_10);//使能上拉
    gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_10MHZ, GPIO_PIN_10);

    nvic_irq_enable(USART0_IRQn, 1);
    
    usart_deinit(USART0);//8,1,N; 波特率=115200; 
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_baudrate_set(USART0, 115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//接收使能
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//发送使能

    usart_enable(USART0);
    usart_interrupt_enable(USART0, USART_INT_RBNE);
}

改写串口接收中断函数

void USART0_IRQHandler(void)
{
  
	u8 Res;

		if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) != RESET)  //接收中断
		{
				Res =usart_data_receive(USART0);	//接收读到的数据
				//printf("中断中 \r \n");
				
				if((USART0_RX_STA&0x8000)==0)//接收未完成
				{
						if(USART0_RX_STA&0x4000)//接收到0x0d
						{
								if(Res!=0x0a) USART0_RX_STA=0;//接收错误,重新开始
								else USART0_RX_STA|=0x8000;	//接收完成了
						}
						else //还没收到0x0d
						{	
									if(Res==0x0d) USART0_RX_STA|=0x4000;
									else
									{
											USART0_RECEIVE_DATA[USART0_RX_STA&0X3FFF]=Res ;
											USART0_RX_STA++;
											if(USART0_RX_STA>(USART0_RECV_LEN-1)) USART0_RX_STA=0;//接收数据错误,重新开始接收  
									}		 
						}
				}   		 
		} 
}

串口缓存及接收长度值需要在组件中引用

为了不改写,用了宏定义实现

#define USART_REC_LEN  		USART0_RECV_LEN  	//定义最大接收字节数 256
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
#define	USART_RX_BUF			USART0_RECEIVE_DATA

extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 
extern u16 USART0_RX_STA;         		//接收状态标记	
extern vu8 Task100MS;

#define	USART_RX_STA			USART0_RX_STA

组件中改写了定时器方面的函数,由于没有定时器4,用TIMER5来实现具体的计时。具体就不展开了。

主函数main如下

/*!
    \file    main.c
    \brief   Template

    \version 2021-11-15, V1.0.0, demo for GD32L23x
*/

#include "gd32l23x.h"
#include "systick.h"
#include "usart.h"
#include "led.h"
#include "usmart.h"

vu8 Task100MS=0;	//100ms定时器中断产生,其他用途
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
	systick_config();
	USART_Config();
	LED_Config();
	//组件初始化,64是为了配合实现10Khz定时器分频,计64M/64*100 = 10Khz,每100ms产生一个定时中断
	usmart_init(64);
	
	printf("\r\nGD32L233C_START 原子串口组件测试");
  printf("\r\n利用串口助手通过USART0调试函数");
  printf("\r\n串口参数为 115200 8-N-1 \n");
  printf("list可列出调试函数 \r");

//只需要在usmart_config.c中加入需要调试的函数就可以实现串口调试
	
	while(1) 
	{
			//对接收到的串口信息进行解释和处理
			usmart_scan();
		
  		delay_1ms(100);
	}
}


项目工程文件USMART.rar USMART.rar (369.42 KB, 下载次数: 4)


回复

7106

帖子

0

资源

五彩晶圆(中级)

串口调试是编程的基本功

整的不错

点评

感谢大佬的鼓励  详情 回复 发表于 2022-2-22 09:27

回复

319

帖子

0

资源

一粒金砂(高级)

Jacktang 发表于 2022-2-21 21:05 串口调试是编程的基本功 整的不错

感谢大佬的鼓励


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表