一.串口的文件创建
首先,先创建usart.c和usart.h文件。
然后把Firmware导入gd32f4xx-usart.c文件
然后就开始写我们的串口文件配置了
1.在创建好的usart.h引入usart.h的头文件
#include "Usart.h"
2.在usart.h文件中引用gd32f4xx.h和systick.h文件
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
#endif
二.串口的配置
3.在usart.c文件写串口的配置
(1)开启时钟
首先开启时钟 rcu_periph_clock_enable();
然后我们转跳这个函数的定义,看这个函数的注释,
参数注释:
\param[in] periph: RCU peripherals, refer to rcu_periph_enum
only one parameter can be selected which is shown as below:
\arg RCU_GPIOx (x = A, B, C, D, E, F, G, H, I): GPIO ports clock
开启GPIO几的时钟,这里我们开启的是GPIOA,
我们要用的usart0这个串口,也就是我们下载器链接连接的串口,TX0:PA9,RX0:PA10
开启TX和RX的GPIO的时钟
片段代码:
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
然后接着往下划
看到这个串口的时钟注释
参数注释:
\arg RCU_USARTx (x = 0, 1, 2, 5): USART clock
然后开启串口的时钟
片段代码:
rcu_periph_clock_enable(RCU_UASRT);
#define RCU_UASRT RCU_USART0
完整代码片段:
usart.c
#include "Usart.h"
void Usart_Init(void)
{
/*开启时钟 */
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
rcu_periph_clock_enable(RCU_UASRT);
}
usart.h的宏定义
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
/*开启时钟的宏定义*/
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
#define RCU_UASRT RCU_USART0
#endif
(2)GPIO复用
第一
调用GPIO的复用函数:gpio_af_set();
然后我们也是转到定义看
参数注释:
\param[in] gpio_periph: GPIO port
only one parameter can be selected which is shown as below:
\arg GPIOx(x = A,B,C,D,E,F,G,H,I)
第一个参数我们是是GPIOA
参数注释:
\arg GPIO_AF_7: USART0, USART1, USART2, SPI1, SPI2
然后第二个参数我们复用GPIO_AF_7,这里注释也写着,复用串口的
参数注释:
\param[in] pin: GPIO pin
one or more parameters can be selected which are shown as below:
\arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
第四个参数是GPIO_PIN_9和GPIO_PIN_10 ,TX:PA9,RX:PA10
片段代码:
gpio_af_set(USART_TX_RORT,USART_AF,USART_TX_PIN);
gpio_af_set(USART_RX_RORT,USART_AF,USART_RX_PIN);
/*GPIO配置宏定义*/
#define USART_TX_RORT GPIOA
#define USART_RX_RORT GPIOA
#define USART_AF GPIO_AF_7
#define USART_TX_PIN GPIO_PIN_9
#define USART_RX_PIN GPIO_PIN_10
第二
设置TX和RX的复用模式gpio_mode_set();我们设置为上拉
参数注释:
\param[in] gpio_periph: GPIO port
only one parameter can be selected which is shown as below:
\arg GPIOx(x = A,B,C,D,E,F,G,H,I)
第一个参数是GPIOA
参数注释:
\param[in] mode: GPIO pin mode
\arg GPIO_MODE_INPUT: input mode
\arg GPIO_MODE_OUTPUT: output mode
\arg GPIO_MODE_AF: alternate function mode
\arg GPIO_MODE_ANALOG: analog mode
第二个参数是GPIO_MODE_AF, 复用模式
参数注释:
\param[in] pull_up_down: GPIO pin with pull-up or pull-down resistor
\arg GPIO_PUPD_NONE: floating mode, no pull-up and pull-down resistors
\arg GPIO_PUPD_PULLUP: with pull-up resistor
\arg GPIO_PUPD_PULLDOWN:with pull-down resistor
第三个参数是GPIO_PUPD_PULLUP ,上拉模式
参数注释:
\param[in] pin: GPIO pin
one or more parameters can be selected which are shown as below:
\arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
第四个参数是GPIO_PIN_9和GPIO_PIN_10
片段代码:
/*配置TX为复用模式 上拉模式*/
gpio_mode_set(USART_TX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_TX_PIN);
/*配置RX为复用模式 上拉模式*/
gpio_mode_set(USART_RX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_RX_PIN);
第三
配置TX和RX为推挽输出 gpio_output_options_set();
参数注释:
\param[in] gpio_periph: GPIO port
only one parameter can be selected which is shown as below:
\arg GPIOx(x = A,B,C,D,E,F,G,H,I)
第一个参数依旧是GPIOA
参数注释:
\param[in] otype: GPIO pin output mode
\arg GPIO_OTYPE_PP: push pull mode
\arg GPIO_OTYPE_OD: open drain mode
第二个参数是 GPIO_OTYPE_PP 推挽输出
参数注释:
\param[in] speed: GPIO pin output max speed
\arg GPIO_OSPEED_2MHZ: output max speed 2MHz
\arg GPIO_OSPEED_25MHZ: output max speed 25MHz
\arg GPIO_OSPEED_50MHZ: output max speed 50MHz
第三个参数是频率 50MHZ
参数注释:
\param[in] pin: GPIO pin
one or more parameters can be selected which are shown as below:
\arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL
第四个参数是GPIO_PIN_9和GPIO_PIN_10
片段代码:
/*配置TX为推挽输出 50MHZ*/
gpio_output_options_set(USART_TX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_TX_PIN);
/*配置RX为推挽输出 50MHZ*/
gpio_output_options_set(USART_RX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_RX_PIN);
完整代码片段:
usart.c
#include "Usart.h"
void Usart_Init(void)
{
/*开启时钟 */
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
rcu_periph_clock_enable(RCU_UASRT);
/*GPIO复用功能*/
gpio_af_set(USART_TX_RORT,USART_AF,USART_TX_PIN);
gpio_af_set(USART_RX_RORT,USART_AF,USART_RX_PIN);
/*配置TX为复用模式 上拉模式*/
gpio_mode_set(USART_TX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_TX_PIN);
/*配置RX为复用模式 上拉模式*/
gpio_mode_set(USART_RX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_RX_PIN);
/*配置TX为推挽输出 50MHZ*/
gpio_output_options_set(USART_TX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_TX_PIN);
/*配置RX为推挽输出 50MHZ*/
gpio_output_options_set(USART_RX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_RX_PIN);
}
usart.h的宏定义
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
/*开启时钟的宏定义*/
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
#define RCU_UASRT RCU_USART0
/*GPIO配置宏定义*/
#define USART_TX_RORT GPIOA
#define USART_RX_RORT GPIOA
#define USART_AF GPIO_AF_7
#define USART_TX_PIN GPIO_PIN_9
#define USART_RX_PIN GPIO_PIN_10
#endif
(3)配置串口参数
第一
复位串口 usart_deinit();
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
这里看注销信息,这个参数是要传的调用那个串口,我们调用的是串口0,所以这个参数填写USART0
片段代码:
usart_deinit(USART);
#define USART USART0
第二
配置串口的波特率 usart_baudrate_set();
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
第一个参数是USART0
参数注释:
\param[in] baudval: baud rate value
第二个参数是波特率,这里我们设置为115200
片段代码:
usart_baudrate_set(USART,USART_BAUDRATE);
/*串口宏定义*/
#define USART USART0
/*串口波特率*/
#define USART_BAUDRATE 112500
第三
配置串口校验位 usart_parity_config();
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
第一个参数 USART0
参数注释:
\param[in] paritycfg: configure USART parity
only one parameter can be selected which is shown as below:
\arg USART_PM_NONE: no parity
\arg USART_PM_EVEN: even parity
\arg USART_PM_ODD: odd parity
/*配置串口校验位
USART_PM_NONE : 没有校验位
USART_PM_EVEN : 奇校验
USART_PM_ODD : 偶校验
*/
第二个参数 USART_PM_NONE 没有校验位
片段代码:
/*配置串口校验位
USART_PM_NONE : 没有校验位
USART_PM_EVEN : 奇校验
USART_PM_ODD : 偶校验
*/
usart_parity_config(USART,USART_PM_NONE);
第四
配置串口数据位 usart_word_length_set(); 一般设置为八位
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
\param[in] wlen: USART word length configure
only one parameter can be selected which is shown as below:
\arg USART_WL_8BIT: 8 bits
\arg USART_WL_9BIT: 9 bits
第一个参数 USART0
第二个参数 USART_WL_8BIT
片段代码:
/*配置串口数据位 一般设置为八位*/
usart_word_length_set(USART,USART_WL_8BIT);
第五
配置串口停止位 usart_stop_bit_set(); 我们设置为一位
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
\param[in] stblen: USART stop bit configure
only one parameter can be selected which is shown as below:
\arg USART_STB_1BIT: 1 bit
\arg USART_STB_0_5BIT: 0.5 bit(not available for UARTx(x=3,4,6,7))
\arg USART_STB_2BIT: 2 bits
\arg USART_STB_1_5BIT: 1.5 bits(not available for UARTx(x=3,4,6,7))
第一个参数 USART0
第二个参数 USART_STB_1BIT
片段代码:
/*配置串口的停止位 设置为一位*/
usart_stop_bit_set(USART,USART_STB_1BIT);
完整代码片段:
usart.c
#include "Usart.h"
/*
串口Usart0的引脚 TX0 PA9 ,
RX0 PA10
*/
void Usart_Init(void)
{
/*开启时钟 */
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
rcu_periph_clock_enable(RCU_UASRT);
/*GPIO复用功能*/
gpio_af_set(USART_TX_RORT,USART_AF,USART_TX_PIN);
gpio_af_set(USART_RX_RORT,USART_AF,USART_RX_PIN);
/*配置TX为复用模式 上拉模式*/
gpio_mode_set(USART_TX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_TX_PIN);
/*配置RX为复用模式 上拉模式*/
gpio_mode_set(USART_RX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_RX_PIN);
/*配置TX为推挽输出 50MHZ*/
gpio_output_options_set(USART_TX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_TX_PIN);
/*配置RX为推挽输出 50MHZ*/
gpio_output_options_set(USART_RX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_RX_PIN);
/*配置串口参数
一.复位串口
二.配置波特率
三.配置校验位
四.配置数据位
五.配置停止位
*/
/*复位串口*/
usart_deinit(USART);
/*配置串口波特率*/
usart_baudrate_set(USART,USART_BAUDRATE);
/*配置串口校验位
USART_PM_NONE : 没有校验位
USART_PM_EVEN : 奇校验
USART_PM_ODD : 偶校验
*/
usart_parity_config(USART,USART_PM_NONE);
/*配置串口数据位 一般设置为八位*/
usart_word_length_set(USART,USART_WL_8BIT);
/*配置串口的停止位 设置为一位*/
usart_stop_bit_set(USART,USART_STB_1BIT);
}
usart.h
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
/*开启时钟的宏定义*/
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
#define RCU_UASRT RCU_USART0
/*GPIO配置宏定义*/
#define USART_TX_RORT GPIOA
#define USART_RX_RORT GPIOA
#define USART_AF GPIO_AF_7
#define USART_TX_PIN GPIO_PIN_9
#define USART_RX_PIN GPIO_PIN_10
/*串口宏定义*/
#define USART USART0
/*串口波特率*/
#define USART_BAUDRATE 112500
#endif
(4)打开串口
第一
使能串口 usart_enable();
参数是 USART0
代码片段:
/*使能串口*/
usart_enable(USART);
第二
设置串口发送 usart_transmit_config();
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
\param[in] txconfig: enable or disable USART transmitter
only one parameter can be selected which is shown as below:
\arg USART_TRANSMIT_ENABLE: enable USART transmission
\arg USART_TRANSMIT_DISABLE: enable USART transmission
第一个参数 是 USART0
第二个参数 是 USART_TRANSMIT_ENABLE
片段代码:
/*配置串口发送*/
usart_transmit_config(USART,USART_TRANSMIT_ENABLE);
第三
串口接收 sart_receive_config();
参数注释:
\param[in] usart_periph: USARTx(x=0,1,2,5)/UARTx(x=3,4,6,7)
\param[in] rxconfig: enable or disable USART receiver
only one parameter can be selected which is shown as below:
\arg USART_RECEIVE_ENABLE: enable USART reception
\arg USART_RECEIVE_DISABLE: disable USART reception
第一个参数是USART0
第二个参数是 USART_RECEIVE_ENABLE
片段代码:
/*配置串口接收*/
usart_receive_config(USART,USART_RECEIVE_ENABLE);
完整代码片段:
usart.c
#include "Usart.h"
/*
串口Usart0的引脚 TX0 PA9 ,
RX0 PA10
*/
void Usart_Init(void)
{
/*开启时钟 */
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
rcu_periph_clock_enable(RCU_UASRT);
/*GPIO复用功能*/
gpio_af_set(USART_TX_RORT,USART_AF,USART_TX_PIN);
gpio_af_set(USART_RX_RORT,USART_AF,USART_RX_PIN);
/*配置TX为复用模式 上拉模式*/
gpio_mode_set(USART_TX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_TX_PIN);
/*配置RX为复用模式 上拉模式*/
gpio_mode_set(USART_RX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_RX_PIN);
/*配置TX为推挽输出 50MHZ*/
gpio_output_options_set(USART_TX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_TX_PIN);
/*配置RX为推挽输出 50MHZ*/
gpio_output_options_set(USART_RX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_RX_PIN);
/*配置串口参数
一.复位串口
二.配置波特率
三.配置校验位
四.配置数据位
五.配置停止位
*/
/*复位串口*/
usart_deinit(USART);
/*配置串口波特率*/
usart_baudrate_set(USART,USART_BAUDRATE);
/*配置串口校验位
USART_PM_NONE : 没有校验位
USART_PM_EVEN : 奇校验
USART_PM_ODD : 偶校验
*/
usart_parity_config(USART,USART_PM_NONE);
/*配置串口数据位 一般设置为八位*/
usart_word_length_set(USART,USART_WL_8BIT);
/*配置串口的停止位 设置为一位*/
usart_stop_bit_set(USART,USART_STB_1BIT);
/*打开串口
一.使能串口
二.配置串口发送
三.配置串口接收
*/
/*使能串口*/
usart_enable(USART);
/*配置串口发送*/
usart_transmit_config(USART,USART_TRANSMIT_ENABLE);
/*配置串口接收*/
usart_receive_config(USART,USART_RECEIVE_ENABLE);
}
usart.h
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
/*开启时钟的宏定义*/
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
#define RCU_UASRT RCU_USART0
/*GPIO配置宏定义*/
#define USART_TX_RORT GPIOA
#define USART_RX_RORT GPIOA
#define USART_AF GPIO_AF_7
#define USART_TX_PIN GPIO_PIN_9
#define USART_RX_PIN GPIO_PIN_10
/*串口宏定义*/
#define USART USART0
/*串口波特率*/
#define USART_BAUDRATE 112500
#endif
到这里我们的基本配置就已经配置好了
然后我们就开始串口的发送函数了
三.串口的信息打印发送
首先c语音的printf函数中不断循环调用fputc函数,所以我们使用printf打印信息到串口的时候在这个地方,是需要重新写fputc函数,这个函数的功能就是打印输出一个字符。
代码片段:
/*重写printf函数*/
int fputc(int ch,FILE *f)
{
usart_data_transmit(USART,(uint8_t)ch);
while(RESET == usart_flag_get(USART0,USART_FLAG_TBE));
// 等待发送数据缓存区标志位
return ch;
}
这时候会报错找不到FILE;我们只需要在上面再添加stdio.h这个头文件即可
四,完整代码演示
main.c
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "LED.h"
#include "sys.h"
#include "Usart.h"
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
systick_config();
// led_gpio_config();
Usart_Init();
// usart_send_String("hello\r\n");
while(1) {
// PDout(7) = 1;
// delay_1ms(500);
// PDout(7) = 0;
// delay_1ms(500);
printf("hello\r\n");
}
}
usart.c
#include "Usart.h"
#include "stdio.h"
/*
串口Usart0的引脚 TX0 PA9 ,
RX0 PA10
*/
void Usart_Init(void)
{
/*开启时钟 */
rcu_periph_clock_enable(RCU_USART_TX);
rcu_periph_clock_enable(RCU_USART_RX);
rcu_periph_clock_enable(RCU_UASRT);
/*GPIO复用功能*/
gpio_af_set(USART_TX_RORT,USART_AF,USART_TX_PIN);
gpio_af_set(USART_RX_RORT,USART_AF,USART_RX_PIN);
/*配置TX为复用模式 上拉模式*/
gpio_mode_set(USART_TX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_TX_PIN);
/*配置RX为复用模式 上拉模式*/
gpio_mode_set(USART_RX_RORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,USART_RX_PIN);
/*配置TX为推挽输出 50MHZ*/
gpio_output_options_set(USART_TX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_TX_PIN);
/*配置RX为推挽输出 50MHZ*/
gpio_output_options_set(USART_RX_RORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,USART_RX_PIN);
/*配置串口参数
一.复位串口
二.配置波特率
三.配置校验位
四.配置数据位
五.配置停止位
*/
/*复位串口*/
usart_deinit(USART);
/*配置串口波特率*/
usart_baudrate_set(USART,USART_BAUDRATE);
/*配置串口校验位
USART_PM_NONE : 没有校验位
USART_PM_EVEN : 奇校验
USART_PM_ODD : 偶校验
*/
usart_parity_config(USART,USART_PM_NONE);
/*配置串口数据位 一般设置为八位*/
usart_word_length_set(USART,USART_WL_8BIT);
/*配置串口的停止位 设置为一位*/
usart_stop_bit_set(USART,USART_STB_1BIT);
/*打开串口
一.使能串口
二.配置串口发送
三.配置串口接收
*/
/*使能串口*/
usart_enable(USART);
/*配置串口发送*/
usart_transmit_config(USART,USART_TRANSMIT_ENABLE);
/*配置串口接收*/
usart_receive_config(USART,USART_RECEIVE_ENABLE);
}
/*重写printf函数*/
int fputc(int ch,FILE *f)
{
usart_data_transmit(USART,(uint8_t)ch);
while(RESET == usart_flag_get(USART0,USART_FLAG_TBE));
// 等待发送数据缓存区标志位
return ch;
}
usart.h
#ifndef _USART_H_
#define _USART_H_
#include "gd32f4xx.h"
#include "systick.h"
/*开启时钟的宏定义*/
#define RCU_USART_TX RCU_GPIOA
#define RCU_USART_RX RCU_GPIOA
#define RCU_UASRT RCU_USART0
/*GPIO配置宏定义*/
#define USART_TX_RORT GPIOA
#define USART_RX_RORT GPIOA
#define USART_AF GPIO_AF_7
#define USART_TX_PIN GPIO_PIN_9
#define USART_RX_PIN GPIO_PIN_10
/*串口宏定义*/
#define USART USART0
/*串口波特率*/
#define USART_BAUDRATE 112500
/*串口初始化*/
void Usart_Init(void);
/*发送函数*/
void usart_send_data(uint8_t ucch);
/*发送函数 发送一个字符串*/
void usart_send_String(uint8_t *ucstr);
#endif
五.效果演示
这里我用VSCode进行演示
需要keil代码的话私我