我发现GD32很多接口都需要冲映射,刚开始还是不习惯,还要打开要选打开AFIO时钟。算了,直接看代码:
1,usart.c
#include <stdio.h>
#include "gd32f10x.h"
#include "usart.h"
/*********************************************************************
* PUBLIC FUNCTIONS
*/
/**
@brief 串口驱动初始化
@param 无
@return 无
*/
void USART_Init(void)
{
/*要选打开AFIO时钟,然后再打开GPIO时钟,然后再重映射GPIO,然后再使能UART0时钟,最后再配置 UART0参数。*/
rcu_periph_clock_enable(RCU_AF);//Need!!!!
rcu_periph_clock_enable(RCU_GPIOB);
gpio_pin_remap_config(GPIO_USART0_REMAP,ENABLE);
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* connect port to USARTx_Tx */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
/* connect port to USARTx_Rx */
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_pin_remap_config(GPIO_USART0_REMAP,ENABLE);
/* USART configure */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
//usart_parity_config(USART0,USART_PM_EVEN);
//usart_word_length_set(USART0,USART_WL_8BIT);
//usart_stop_bit_set(USART0,USART_STB_1BIT);
usart_enable(USART0);
//nvic_irq_enable(USART0_IRQn, 3U, 3U);
//usart_interrupt_enable(USART0,USART_INT_RBNE);
}
/**
@brief 串口写入数据
@param pData -[in] 写入数据
@param dataLen -[in] 写入数据长度
@return 无
*/
void UART_Write(uint8_t *pData, uint32_t dataLen)
{
uint8_t i;
for(i = 0; i < dataLen; i++)
{
usart_data_transmit(USART0, pData[i]); // 发送一个字节数据
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); // 发送完成判断
}
}
/**
* @brief 重定向c库函数printf到USARTx
* @retval None
*/
int fputc(int ch, FILE *f)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
return ch;
}
/**
* @brief 重定向c库函数getchar,scanf到USARTx
* @retval None
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
ch = usart_data_receive(USART0);
return ch;
}
/****************************************************END OF FILE****************************************************/
2,main.c
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32f10x_eval.h"
#include "led.h"
#include "usart.h"
void delay(void)
{
uint16_t i=0,j=0;
for(i=0;i<0xffff;i++)
for(j=0;j<30;j++);
}
int main(void)
{
LedGPIO_init();
USART_Init();
printf("usart1_test\r\n");
while(1)
{
printf("usart1_test\r\n");
delay();
}
}
3,实验结果
本文主要记录代码,不讲原理。