【GD32L233C-START 评测】-五、GD32移植原子串口调试组件实现串口函数调试
[复制链接]
以前用stm32的时候,对原子的串口调试组件印象比较深刻,因此就移植组件来测试下串口函数调试功能。
原子的组件包含3个文件,只需要在usmart_config.c中加入需要调试的函数就可以实现串口调试
功能实现后的串口窗口
具体实现过程简述
首先改写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, 下载次数: 21)
,需要的小伙伴自取。
|