梁山派开发板之串口通信

串口通信原理简介

  1. 串口是指外设和处理器之间通过数据信号线、地线和控制线等,按位进行传输数据的一种通讯方式。尽管传输速度比并行传输低。但串口可以在使用一根线发送数据的同时用另一根线接收数据。 这种通信方式使用的数据线少,在远距离通信中可以节约通信成本。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验位,这些参数在两个通信端口之间必须一致。
    1. 波特率:衡量通信速度的参数,它表示每秒钟传送的 bit 的个数。
    2. 数据位:衡量通信中实际数据位的参数,表示一个信息包里包含的数据位的个数。
    3. 停止位:用于表示单个信息包的最后位,典型值为 1、1.5 和 2 位。由于数据是在传输线上传输的,每个设备都有自己的时钟,很有可能在通信过程中出现不同步,停止位不仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也越慢。
    4. 奇偶检验位:表示一种简单的检查错误的方式。是一个表示给定位数的二进制数中1的个数是奇数或者偶数的二进制数,奇偶校验位是最简单的错误检测码。 如果传输过程中包括校验位在内的奇数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生。
    奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
    偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。
    6. 空闲位: 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。
  2. 串口的工作模式
    1. 单工:在通信的任意时刻,信息只能由 A 传到 B。
    2. 半双工:在通信的任意时刻,信息即可由 A 传到 B,又能由 B 传到 A,但同时只能有一个方向 上的传输存在。
    3. 全双工:在通信的任意时刻,通信线路上存在 A 到 B 和 B 到 A 的双向信号传输
    在这里插入图片描述

GD32F4xx的串口通信接口

GD32F4xx的串口通信接口有两种 UART(通用异步收发器)、USART(通用同步异步收发器),其中UART有4个分别为UART3、UART4、UART6、UART7。USART有4个,分别为USART0、USART1、USART2、USART5。

GD32F4xx的串口通信配置流程

一般我们使用串口,都需要有以下几个步骤。

  1. 开启时钟(包括串口时钟和 GPIO 时钟)
  2. 配置 GPIO 复用模式
  3. 配置 GPIO 的模式
  4. 配置 GPIO 的输出
  5. 配置串口(配置一些参数)
  6. 使能串口(串口使能和发送使能)

开启GPIO时钟

在这里我们以开启USART0为例。由于USART0使用的是PA9与PA10两个管脚。(梁山派开发板使用的管脚)

  1. 首先开启GPIOA的时钟。
rcu_periph_clock_enable(RCU_GPIOA);//开启GPIOA的端口时钟
  1. 开启USART0串口时钟
rcu_periph_clock_enable(RCU_USART0); // 开启串口时钟
  1. 由于我们串口的使用占用了PA9与PA10两个管脚,所以我们要进行管脚模式的复用。
    在这里插入图片描述
    由图可以知道,其管脚复用模式为AF7,所以我们可以进行模式复用,
gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_9);
gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_10);
  1. 配置GPIO的输出
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,  GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,  GPIO_PIN_10);
gpio_output_options_set( GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
gpio_output_options_set( GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
  1. 进行串口参数的一些设置
    其中大致包括复位串口、设置波特率、设置校验位、设置串口的停止位、设置串口的长度等。
    1. 串口复位
usart_deinit(USART0);//复位串口
  1. 设置波特率(我设置为9600)
usart_baudrate_set(USART0,9600U);
  1. 配置校验位(这里我设置为无校验)
usart_parity_config(USART0, USART_PM_NONE);//配置校验位
  1. 配置串口的停止位(一般设置为1)
usart_stop_bit_set(USART0,USART_STB_1BIT);//配置串口的停止位
  1. 设置串口的数据长度(一般设置为8bit)
usart_word_length_set(USART0,USART_WL_8BIT);//配置串口的数据长度

至此,我们基本完成了串口的参数配置

使用串口发送信息

首先我们先使能串口,并且打开串口的数据发送功能

usart_enable(USART0);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//打开串口的发送功能

之后我们就可以调用’’‘usart_data_transmit’’‘函数来发送信息了,但是需要注意的是这个函数一次只能发送一个字节。为了发送的稳定性,我们还需要使用’’‘usart_flag_get’’'函数来获取状态寄存器标志位来判断数据缓存区数据是否发送完成,从而进行下一次发送。

void usart_send_data(uint8_t ucch)
{
	usart_data_transmit(USART0,(uint8_t)ucch);							 // 发送数据
	while(RESET == usart_flag_get(USART0,USART_FLAG_TBE));  // 等待发送数据缓冲区标志置位
}

这样我们就可以实现一个字符的发送。但是我们还可以再封装一层,实现一个字符串的发送。

void usart_send_string(uint8_t *data)
{
	while(data && *data)
	{
		usart_send_data(*data++);
	}
}

但是每次发送都要调用这个函数,非常麻烦,这时候我们就可以对串口重定向至printf函数,发送。

int fputc(int ch, FILE *f)
{ 
	usart_data_transmit(USART0, (uint8_t)ch); 
	while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); // 等待发送数据缓冲 区标志置位
	return ch; 
}

至此我们就完成了整个串口函数的配置以及调用
bsp_usart.c

/*
 *  Author: carpe diem  2116815480@qq.com
 *  Date: 2023-03-26 18:28:58
 *  LastEditTime: 2023-04-04 23:51:40
 *  FilePath: \Projectf:\Desktop\file\KEIL CODE\梁山派开发板\005串口通信\Hardware\usart\bsp_uasrt.c
 *  Description: 串口通信
 * 
 * Copyright (c) 2023 by carpe diem, All Rights Reserved. 
 */

#include "bsp_usart.h"
#include <stdio.h>
void usart_gpio_config(int baud_rate)
{
//配置GPIO
//开启时钟
	rcu_periph_clock_enable(RCU_USART0); // 开启串口时钟
	rcu_periph_clock_enable(RCU_GPIOA); // 开启端口时钟 
	rcu_periph_clock_enable(RCU_GPIOA); // 开启端口时钟
//配置GPIO复用模式
	gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_9);
	gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_10);
	//配置GPIO输出模式

	gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,  GPIO_PIN_9);
	gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,  GPIO_PIN_10);
	//配置GPIO的输出
	gpio_output_options_set( GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
	gpio_output_options_set( GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
	//配置串口
	usart_deinit(USART0);//复位串口
	usart_baudrate_set(USART0,baud_rate);//配置波特率
	usart_parity_config(USART0, USART_PM_NONE);//配置校验位
	usart_stop_bit_set(USART0,USART_STB_1BIT);//配置串口的停止位
	usart_word_length_set(USART0,USART_WL_8BIT);//配置串口的数据长度
	//使能串口
	usart_enable(USART0);
	usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//打开串口的发送功能
}

void usart_send_data(uint8_t ucch)
{
	usart_data_transmit(USART0,(uint8_t)ucch);							 // 发送数据
	while(RESET == usart_flag_get(USART0,USART_FLAG_TBE));  // 等待发送数据缓冲区标志置位
}

//串口发送字符串 

void usart_send_string(uint8_t *data)
{
	while(data && *data)
	{
		usart_send_data(*data++);
	}
}
int fputc(int ch, FILE *f)
{ 
	usart_data_transmit(USART0, (uint8_t)ch); 
	while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); // 等待发送数据缓冲 区标志置位
	return ch; 
}

bsp_usart.h

#ifndef _USART_H
#define _USART_H

#include "gd32f4xx.h"
#include "systick.h"

void usart_gpio_config(int baud_rate);
void usart_send_data(uint8_t ucch);
void usart_send_string(uint8_t *data);


#endif

main.c

/*!
    \file    main.c
    \brief   led spark with systick

    \version 2016-08-15, V1.0.0, firmware for GD32F4xx
    \version 2018-12-12, V2.0.0, firmware for GD32F4xx
    \version 2020-09-30, V2.1.0, firmware for GD32F4xx
    \version 2022-03-09, V3.0.0, firmware for GD32F4xx
*/

/*
    Copyright (c) 2022, GigaDevice Semiconductor Inc.

    Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this
       list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright notice,
       this list of conditions and the following disclaimer in the documentation
       and/or other materials provided with the distribution.
    3. Neither the name of the copyright holder nor the names of its contributors
       may be used to endorse or promote products derived from this software without
       specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_led.h"
#include "sys.h"
#include "bsp_usart.h"

/*!
    \brief    main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
 
    systick_config();
	led_gpio_config();//led的初始化
	usart_gpio_config(9600);
	
    while(1)
{
	printf("6272215A\n");
	delay_1ms(1000);
}


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值