目录
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修改即可,重新烧录程序,就会发现串口调试器有数据了!
如果以上方法还不能解决,可参考以下博主的解决办法,链接如下:
2、ADC首次采样数据随机值问题
为了解决这一问题,只需要在启用ADC后延时即可
// 初始化及配置ADC
adc_init();
// 启用ADC软件触发
adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
// 加上此代码
delay_1ms(1000);
问题解决!!其原因是当ADC电压未稳定时,对其采样会出现数值随机的情况,需要加上延时等待ADC电压稳定后再对其采样,才会避免首次数值随机问题。