GD32串口配置

一、gpio 配置

1、按键:上拉输入

2、点亮灯泡:不上不下,推挽输出

PB13、PB14对应按键
PC13、PC14对应灯泡,低电平点亮。

 //使能时钟
    rcu_periph_clock_enable(RCU_GPIOC);
    //使能时钟
    rcu_periph_clock_enable(RCU_GPIOB);
    
    //设置输出模式,不上下拉
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14);
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
    //设置输出模式,上拉
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
    
    //设置输出类型,推挽输出,50Mhz
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);

3、代码说明

按下KEY1,板载LED灯点亮,按下KEY2,板载LED灯熄灭。

此处项目源码中,有一个小细节,当我们检测按键是低电平时,开始延迟10ms进行消抖,随后再次判断,如果还是低电平,那就确定是按键按下,但还会有另外一个问题出现,如果我们一直按着按键,那就会一直是低电平,就会造成反复判断。
所以,加入一个死循环,如果按键一直按下,就一直循环,当按下松手的时候,才算一次完整的按键按下。

二、串口通信

1、 串口通信参数介绍

  • 波特率: 衡量通信速度的参数,它表示每秒钟传送的bit的个数。
  • 数据位: 衡量通信中实际数据位的参数,表示一个信息包里包含的数据位的个数。
  • 停止位: 用于表示单个信息包的最后位,典型值为1、1.5和2位。由于数据是在传输线上传输的,每个设备都有自己的时钟,很有可能在通信过程中出现不同步,停止位不仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也越慢。
  • 奇偶检验位: 表示一种简单的检查错误的方式。

2、串口工作模式

串口可以工作在单工、半双工和全双工模式下。

  • 单工:在通信的任意时刻,信息只能由A传到B。
  • 半双工:在通信的任意时刻,信息即可由A传到B,又能由B传到A,但同时只能有一个方向上的传输存在。
  • 全双工:在通信的任意时刻,通信线路上存在A到B和B到A的双向信号传输。

3、串口通信协议

串口在进行通信的时候会按照数据包的形式进行发送,帧格式如下所示。
在这里插入图片描述
串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由7位数据位组成,接着是一位校验位,最后是停止位。停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。

4、串口接口原理图

在开发板上默认使用的串口是串口0,有两根数据线,也就是USART0_TX和USART0_RX。串口引脚和下载引脚连接在Type-C,插上Type-C就可以进行串口调试。关于串口原理图如下所示。
在这里插入图片描述
GPIO引脚默认是作为普通IO使用,当需要使用外设功能时,需要打开对应的复用模式。

//使能时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);

//复用功能设置
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

//端口模式设置,tx可以使用推挽输出
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);


usart_word_length_set(USART0, USART_WL_8BIT);               //8位数据位宽
usart_stop_bit_set(USART0, USART_STB_1BIT);                 //1位停止位
usart_parity_config(USART0, USART_PM_NONE);                 //无校验位
usart_baudrate_set(USART0, bound);                          //波特率
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);        //发送使能
//使能串口0
usart_enable(USART0)

5、串口发送数据

配置好串口参数后,下一步操作就是要发送数据。
发送数据的流程分三步走:
第一步:调用串口发送函数;
第二步:等待串口发送完成;
第三步:清除串口发送标志位;

void USART0_SendData(char sendData)
{
    //串口发送函数,发送一个字节数据
    usart_data_transmit(USART0, (uint8_t)sendData);
    //等待串口发送完成
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    //清除串口发送标志位
    usart_flag_clear(USART0,USART_FLAG_TC);
}

三级标题

四级标题
五级标题
六级标题
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 确定DMA通道和USART外设 首先,我们需要确定使用的DMA通道和USART外设。在GD32的芯片中,USART有两个DMA通道,分别是DMA1通道4和DMA1通道5。我们需要根据实际情况选择一个可用的DMA通道和USART外设。 2. 配置USART外设 接下来,我们需要配置USART外设。首先,我们需要启用USART外设的DMA发送功能。我们可以使用USART_CTL1_REG的DMAT位来实现这一点。将DMAT位设置为1即可启用DMA发送功能。 另外,我们还需要配置USART的波特率、数据位、停止位等参数。这些参数需要根据实际情况进行配置。 3. 配置DMA传输参数 接下来,我们需要配置DMA传输参数。传输参数包括DMA通道、数据长度、数据方向等。我们需要将DMA的通道设置为之前选择的通道,并将数据长度设置为要发送的数据长度。数据方向需要设置为从内存到外设。 4. 配置DMA中断 最后,我们需要配置DMA中断。我们可以使用DMA_CTL_REG的TCIE位来启用传输完成中断。当DMA传输完成时,将会触发中断,并执行我们事先定义好的中断处理函数。 5. 启动DMA传输 配置完成后,我们可以启动DMA传输。启动传输后,DMA会自动将内存中的数据发送到USART外设。当传输完成时,会触发中断。我们可以在中断处理函数中进行相应的处理,例如关闭DMA传输等。 下面是一个GD32串口DMA发送的示例代码: ``` #include "gd32f10x.h" /* 定义要发送的数据 */ uint8_t data[] = "Hello, World!"; void dma_config(void) { /* 选择DMA通道和USART外设 */ dma_parameter_struct dma_init_struct; dma_deinit(DMA1, DMA_CH4); dma_struct_para_init(&dma_init_struct); dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_addr = (uint32_t)data; dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; dma_init(DMA1, DMA_CH4, &dma_init_struct); /* 配置DMA中断 */ nvic_irq_enable(DMA1_Channel4_IRQn, 0, 0); /* 启用USART外设的DMA发送功能 */ usart_dma_transmit_config(USART0, USART_DENT_ENABLE); } void usart_config(void) { usart_parameter_struct usart_init_struct; usart_struct_para_init(&usart_init_struct); /* 配置USART波特率、数据位、停止位等参数 */ usart_init_struct.baud_rate = 115200; usart_init_struct.word_length = USART_WL_8BIT; usart_init_struct.stop_bits = USART_SB_1BIT; usart_init_struct.parity = USART_PM_NONE; usart_init_struct.flow_control = USART_FC_NONE; usart_init(USART0, &usart_init_struct); } int main(void) { /* 初始化USART和DMA */ usart_config(); dma_config(); /* 启动DMA传输 */ dma_channel_enable(DMA1, DMA_CH4); while(1) { /* 主循环 */ } } void DMA1_Channel4_IRQHandler(void) { if(dma_interrupt_flag_get(DMA1, DMA_CH4, DMA_INT_FLAG_FTF)) { /* 关闭DMA传输 */ dma_channel_disable(DMA1, DMA_CH4); /* 清除中断标志位 */ dma_interrupt_flag_clear(DMA1, DMA_CH4, DMA_INT_FLAG_FTF); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚嵌入式学习同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值