不爱吃胡萝卜 · 2023年12月28日 · 浙江

【GD32微控制器原理与应用+苹果派开发板评测】基于苹果派GD32F303的温湿度监视仪

首先感谢极术社区、安谋科技学堂以及兆易创新给与的评测机会!

一、目标简介

(一)《GD32微控制器原理与应用》

GD32F3苹果派开发板配套的微机原理教程,通过15个实验分别介绍汇编语言基础、基于汇编的数据处理、程序流控制、存储器访问、函数封装、GPIO与流水灯、GPIO与独立按键、外部中断、定时器、SysTick、RCU、串口通信、ADC和DAC的原理与应用。全书程序代码的编写均遵循统一规范,且各实验采用模块化设计,以便将各模块应用于实际项目和产品中。
GD1.jpg

(二)GD32F3苹果派开发板

GD32F3苹果派开发板(主控芯片为GD32F303ZET6),开发板围绕 GD32F303ZET6 搭建 GD32 微控制器电路,此外,还集成了以下经典模块电路: 电源转换电路、通信-下载模块电路、GD-Link调试下载电路、LED电路、蜂鸣器电路、独立按键电路、触摸按键电路、外部温湿度电路、SPI Flash电路、EEPROM电路、外部SRAM电路、NAND Flash电路、音频电路、以太网电路、RS485电路、RS232电路、CAN电路、SD Card电路、USB SLAVE电路、摄像头接口电路、LCD 接口电路、外扩引脚电路、外扩接口电路。
GD2.jpg

二、温湿度监视仪设计与实现

(一)RT-Thread移植

直接gitee下载RT-Thread主线包,按照《GD32_ARM系列BSP制作教程》一步一步完成GD32F3苹果派开发板的RT-Thread移植,rtconfig.h配置如下:

#ifndef RT_CONFIG_H__
#define RT_CONFIG_H__

/* Automatically generated file; DO NOT EDIT. */
/* RT-Thread Configuration */

/* RT-Thread Kernel */
#define RT_NAME_MAX 8
#define RT_ALIGN_SIZE 8
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
#define RT_TICK_PER_SECOND 100
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_HOOK_USING_FUNC_PTR
#define RT_USING_IDLE_HOOK
#define RT_IDLE_HOOK_LIST_SIZE 4
#define IDLE_THREAD_STACK_SIZE 256

/* kservice optimization */
#define RT_DEBUG
#define RT_DEBUG_COLOR

/* Inter-Thread communication */
#define RT_USING_SEMAPHORE
#define RT_USING_MUTEX
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE

/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_SMALL_MEM
#define RT_USING_SMALL_MEM_AS_HEAP
#define RT_USING_HEAP

/* Kernel Device Object */
#define RT_USING_DEVICE
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_VER_NUM 0x50001

/* RT-Thread Components */
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE 2048
#define RT_MAIN_THREAD_PRIORITY 10
#define RT_USING_MSH
#define RT_USING_FINSH
#define FINSH_USING_MSH
#define FINSH_THREAD_NAME "tshell"
#define FINSH_THREAD_PRIORITY 20
#define FINSH_THREAD_STACK_SIZE 4096
#define FINSH_USING_HISTORY
#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#define FINSH_CMD_SIZE 80
#define MSH_USING_BUILT_IN_COMMANDS
#define FINSH_USING_DESCRIPTION
#define FINSH_ARG_MAX 10

/* Device Drivers */
#define RT_USING_DEVICE_IPC
#define RT_UNAMED_PIPE_NUMBER 64
#define RT_USING_SYSTEM_WORKQUEUE
#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048
#define RT_SYSTEM_WORKQUEUE_PRIORITY 23
#define RT_USING_SERIAL
#define RT_USING_SERIAL_V1
#define RT_SERIAL_USING_DMA
#define RT_SERIAL_RB_BUFSZ 64
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
#define RT_USING_PIN
#define RT_USING_SPI

/* C/C++ and POSIX layer */
#define RT_LIBC_DEFAULT_TIMEZONE 8

/* Hardware Drivers Config */
#define SOC_SERIES_GD32F30x
#define SOC_GD32303Z

/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
#define BSP_USING_UART
#define BSP_USING_UART0
#endif

编译完成后,RT-Thread顺利启动。
GD5.png

(二)OLED驱动

OLED使用SPI接口,直接插在GD32F3苹果派开发板的EMC插座上。
GD3.png

具体GPIO pin的配置包括:SCK(GPIOB3)、MISO(GPIOB4)、MOSI(GPIOB5)、CS(GPIOC12)、RES(GPIOC10)。
具体驱动代码如下:

  rcu_periph_clock_enable(RCU_AF);
  gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);    
  
  rcu_periph_clock_enable(RCU_GPIOB); 
  rcu_periph_clock_enable(RCU_GPIOC); 
  
  gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); 
  gpio_bit_set(GPIOC, GPIO_PIN_10);                             
  
  gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);  
  gpio_bit_set(GPIOC, GPIO_PIN_12);                                
  gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);   
  gpio_bit_set(GPIOB, GPIO_PIN_3);                                              
  gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); 
  gpio_bit_set(GPIOB, GPIO_PIN_4);                                               
  gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);   
  gpio_bit_set(GPIOB, GPIO_PIN_5);                                      

因为软SPI,故不需要在RT-Thread scons中配置。

(三)SHT20驱动

GD32F3苹果派开发板板载SHT20温湿度传感器,挂载I2C0总线上。
GD4.png
从官方原理图上可以看出使用了GPIOB6(SCL)和GPIOB7(SDA),需要在RT-Thread scons中打开I2C0总线,同时添加SHT20驱动。
rtconfig.h配置新增如下内容:

#define BSP_USING_I2C0
#define BSP_I2C0_SCL_PIN 22
#define BSP_I2C0_SDA_PIN 23

I2C的驱动如下:

void gd32_i2c_gpio_init(struct gd32_i2c *i2c)
{
    struct gd32_soft_i2c_config* cfg = (struct gd32_soft_i2c_config*)i2c->ops.data;

    rt_pin_mode(cfg->scl, PIN_MODE_OUTPUT_OD);
    rt_pin_mode(cfg->sda, PIN_MODE_OUTPUT_OD);

    rt_pin_write(cfg->scl, PIN_HIGH);
    rt_pin_write(cfg->sda, PIN_HIGH);
}

(四)应用实现

应用的逻辑主要包括启动后初始化GD32F3苹果派开发板的外设,包括SHT20温湿度传感器、OLED屏幕、串口(用于打印log)还有用于跑流水灯LED,之后每隔1s采集一次温湿度数据,显示到OLED屏幕上。

具体实现代码如下:

int main(void)
{
      static sht20_device_t dev = RT_NULL;
      int count = 1;
      float humidity;
      float temperature;
      char humArry[18];
      char tempArry[18];

      SystemInit();
      InitOLED();
      dev = sht20_init("i2c0");

      /* set LED pin mode to output */
      rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
      rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
    
      OLEDShowString(8, 0, (const unsigned char*)"Leyutek ApplePi"); 
      OLEDShowString(24, 48, (const unsigned char*)"2023-12-28");

    while (count++)
    {
        rt_pin_write(LED2_PIN, PIN_HIGH);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(500);
        rt_pin_write(LED2_PIN, PIN_LOW);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
            
        /* read the sensor data */
        humidity = sht20_read_humidity(dev);
        temperature = sht20_read_temperature(dev);
        rt_snprintf(humArry, 18, "humidity:%2d.%d%%", (int)humidity, (int)(humidity*10)%10);
        rt_snprintf(tempArry, 18, "temperture:%2d.%d", (int)temperature, (int)(temperature*10)%10); 
            
        //refresh OLED
        OLEDShowString(8, 16, (const unsigned char*)humArry);
        OLEDShowString(0, 32, (const unsigned char*)tempArry);
        OLEDRefreshGRAM();
   }

    return RT_EOK;
}

三、运行效果

插上OLED模块到EMC接口,然后接上12V电源,开机。
GD7.png
可以看出设备都正常工作,再看看内存,64K的ram看起来处理绰绰有余。

此时可以查看OLED显示:
GD8.jpg

因为屏幕比较小,近距离观看:
GD9.jpg
现在室内12.8摄氏度,湿度76.9%,估计我呆在桌前太久:)

四、一点感想

1、基于兆易创新完整的驱动和支持材料,开发者可以很方便的为GD32系列开发板移植各类RTOS;
2、GD32F3苹果派开发板做的很漂亮,一眼看来爱不释手,相关材料包括《GD32微控制器原理与应用》中规中矩,条理清晰;
3、第一次使用GD32的M4系列MCU,本次试用测试了GPIO、SPI、I2C、USART等接口功能,用起来很顺手,挺多惊喜的。

<感谢阅读>

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息