GD32 开发中遇到的疑难问题整理(持续更新)

目录

1、关于串口通信中printf重定向输出问题

        1.1 USART0初始化

        1.2 printf重定向函数

        1.3 main函数

2、ADC首次采样数据随机值问题


1、关于串口通信中printf重定向输出问题

        根据其他博主的帖子来编写重定向代码,如下所示:

        1.1 USART0初始化

#include <stdio.h>
#include "gd32f30x.h"
#include "systick.h"

//USART0初始化,使用PB6(TX),PB7(RX)脚,115200波特率,无校验,8位数据,1位停止
void gd_usart0_init(void)
{
    //	使能GPIOB时钟
    rcu_periph_clock_enable(RCU_GPIOB);

    //	使能USART0时钟
    rcu_periph_clock_enable(RCU_USART0);
	
	//	PB6,PB7需要重映射
    gpio_pin_remap_config(GPIO_USART0_REMAP, ENABLE);
		
	//	配置PB6为输出
    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);	

    //	配置PB7为输入
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,GPIO_PIN_7);

	
	//	配置USART
    usart_deinit(USART0);	//	重置USART / UART
    usart_baudrate_set(USART0,115200);	//	配置USART波特率值
	usart_word_length_set(USART0, USART_WL_8BIT);	//	配置USART数据长度
    usart_stop_bit_set(USART0, USART_STB_1BIT);	//	配置USART停止位长度
    usart_parity_config(USART0, USART_PM_NONE);	//	配置USART奇偶校验
	usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);	//	配置硬件流控制RTS
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);	//	配置硬件流控CTS
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);	//	配置USART发送
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);	//	配置USART接收
    usart_enable(USART0);//使能USART0
}

        1.2 printf重定向函数

/**
  * @brief 重定向c库函数printf到USARTx
  * @retval None
  */
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口 */
	usart_data_transmit(USART0, (uint8_t)ch);
	
	/* 等待发送完毕 */
	while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET);		

	return (ch);
}

/**
  * @brief 重定向c库函数getchar,scanf到USARTx
  * @retval None
  */
int fgetc(FILE *f)
{
	/* 等待串口输入数据 */
	while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);

	return (int)usart_data_receive(USART0);
}

        1.3 main函数

#include "gd32f30x.h"
#include "systick.h"
#include <stdio.h>

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    //	设置主频120MHZ -- 分频器选择
    rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);
	
	//	配置系统时钟
	systick_config();

    //	初始化USART0
	gd_usart0_init();

    //	使能AF时钟 -- 开启GPIO复用功能
	rcu_periph_clock_enable(RCU_AF); 
	
	//	延时1s
	delay_1ms(1000);

	//	初始化USART0
	gd_usart0_init();

	while(1)
	{
	    delay_1ms(1000);
		
		printf("a usart transmit test example!\r\n");
	}
}

        理论上来说是编写代码烧录程序之后是没问题的,但是作者发现原原本本写进去,串口调试器还是没有数据,在寻找一番后发现,还需要设置选项,具体操作如下图所示:

         启用 MicroLib 库,点击OK修改即可,重新烧录程序,就会发现串口调试器有数据了!

        如果以上方法还不能解决,可参考以下博主的解决办法,链接如下:

https://blog.csdn.net/weixin_47569031/article/details/124118200https://blog.csdn.net/weixin_47569031/article/details/124118200

2、ADC首次采样数据随机值问题

        

         为了解决这一问题,只需要在启用ADC后延时即可

	//	初始化及配置ADC
	adc_init();
		
	//	启用ADC软件触发
	adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
	
    //  加上此代码
	delay_1ms(1000);

         问题解决!!其原因是当ADC电压未稳定时,对其采样会出现数值随机的情况,需要加上延时等待ADC电压稳定后再对其采样,才会避免首次数值随机问题。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值