寒冰1988 · 2022年12月21日 · 北京市

【GD32F427开发板试用】基于蓝牙模块的远程点灯演示

一. 前言

感谢极术社区联合兆易创新组织的本次活动,很荣幸能够中签本次的试用机会,结合手里的外围模块,本次试用打算分两次进行,先打通蓝牙模块,通过一个简单的点灯来验证蓝牙通路的连通性,然后调通步进电机,最后将蓝牙和步进电机结合起来实现远程电机的控制。本文即使第一步,利用蓝牙实现远程点灯。

二. 硬件环境

2.1 主控板介绍

本次实验采用的主控板为GD32F427V-START,其引脚已经全部引出,焊接插针以后就可以直接试用,可以充分的利用板子的各种外设控制器资源,遗憾的是板子上仅提供一路3.3V的输出,不利于外围的扩展,而且没有集成USB2UART模块,需要单独的USB2TTL模块才能实现调试信息的输出。
image.png

2.2 蓝牙模块

蓝牙模块选用的是DX-BT04-E,支持BLE4.2+SPP3.0,电源电压支持3.3/5V,可以直接由主控板供电,完全兼容串口操作,仅需4根线即可工作。
image.png
蓝牙模组提供的使用范例如下,通过手机端蓝牙APP即可实现跟MCU的相互通讯,从而实现远程的控制。
image.png

2.3 设备连接

由GD32F427V-START板的原理图可知,USART0的PA9和PA10两个管脚已被占用,通过查阅GD32F427xxDatasheet可知PB6和PB7也可以用来配置为USART0的数据管脚。
image.png
查清楚各管脚的分配后,MCU主控板和BT模组的连接如下所示。
image.png

三. 软件实现

3.1 串口驱动

采用USART0来驱动蓝牙模块,配置PB6和PB7的功能为AF_7(将TX和RX路由到PB6和PB7),看了几篇串口文章的实现,代码中遗漏了要使能对应管脚的时钟,如下代码开启相应时钟:

/* enable USART clock */
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_USART0);

3.2 蓝牙控制规则

当前串口的实现单次只能获得一个字符,简化起见,发送“0”字符(对应ASII码0x30)关闭LED灯,发送“1”字符(对应ASII码0x31)开启LED灯。上位机采用蓝牙厂家的蓝牙调试工具,或者自己安装串口蓝牙调试APP也可以。

3.3 LED控制逻辑

GD32F427V-START板提供了一个LED供用户测试使用,通过控制GPIOC_6就可以实现LED的亮灭,代码如下:

/* turn off LED2 */
gpio_bit_reset(GPIOC, GPIO_PIN_6);
/* turn on LED2 */
gpio_bit_set(GPIOC, GPIO_PIN_6);

3.4 代码

整体代码实现如下,主要步骤已添加注释。

#include "gd32f4xx.h"
#include "gd32f427v_start.h"
#include "systick.h"
#include <stdio.h>

void UART0_Transmit(unsigned char *Data,unsigned int Lenth)
{
    int i=0;
    for(i=0;i<Lenth;i++)
    {
        usart_data_transmit(USART0,Data[i]);
        while(RESET == usart_flag_get(USART0, USART_FLAG_TC));
    }
}

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    unsigned char ch = 0;

    /* configure systick */
    systick_config();

    /* enable the LEDs GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOC);
    
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_USART0);

    /* configure LED2 GPIO port */
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* reset LED2 GPIO pin */
    gpio_bit_reset(GPIOC, GPIO_PIN_6);
    
    /* configure the USART0 TX pin and USART0 RX pin */
    gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6);
    gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_7);
    
    /* configure USART0 TX as alternate function push-pull */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);

    /* configure USART0 RX as alternate function push-pull */
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 9600U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);
    
    while(1) {
        while (RESET == usart_flag_get(USART0, USART_FLAG_RBNE));
        ch = usart_data_receive(USART0);
        if (ch == 0x30) {
            /* turn off LED2 */
            gpio_bit_reset(GPIOC, GPIO_PIN_6);
        }
        if (ch == 0x31) {
            /* turn on LED2 */
           gpio_bit_set(GPIOC, GPIO_PIN_6);
        }
    }
}

四. 效果展示

如视频所示,当手机端发送“0”时,LED灯灭,发送“1”时,LED灯亮。

https://www.bilibili.com/vide...

五. 后记

因为快递(重新购置了一些外围模组)和阳的缘故,本次相关实验和试用报告晚了一点,希望相关经验能够打开大家的思路。疫情的阴霾终究会过去,未来充满了希望,祝社区越来越好。

参考资料

  1. GD32F427V-START-V1.0.pdf
  2. GD32F4xx_gujiankushiyongzhinan_V1.0.pdf
  3. GD32F4xx_User_Manual_Rev2.7_CN.pdf
  4. GD32F427xx_Datasheet_Rev1.2.pdf
  5. GD32427V_START_Demo_Suites\Projects\01_GPIO_Running_LED
  6. DX-BT04-E 蓝牙模块技术手册2022.01.07.pdf
推荐阅读
关注数
5
文章数
6
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息