首先感谢极术社区、安谋科技学堂以及兆易创新给与的评测机会!
一、目标简介
(一)《GD32微控制器原理与应用》
GD32F3苹果派开发板配套的微机原理教程,通过15个实验分别介绍汇编语言基础、基于汇编的数据处理、程序流控制、存储器访问、函数封装、GPIO与流水灯、GPIO与独立按键、外部中断、定时器、SysTick、RCU、串口通信、ADC和DAC的原理与应用。全书程序代码的编写均遵循统一规范,且各实验采用模块化设计,以便将各模块应用于实际项目和产品中。
(二)GD32F3苹果派开发板
GD32F3苹果派开发板(主控芯片为GD32F303ZET6),开发板围绕 GD32F303ZET6 搭建 GD32 微控制器电路,此外,还集成了以下经典模块电路: 电源转换电路、通信-下载模块电路、GD-Link调试下载电路、LED电路、蜂鸣器电路、独立按键电路、触摸按键电路、外部温湿度电路、SPI Flash电路、EEPROM电路、外部SRAM电路、NAND Flash电路、音频电路、以太网电路、RS485电路、RS232电路、CAN电路、SD Card电路、USB SLAVE电路、摄像头接口电路、LCD 接口电路、外扩引脚电路、外扩接口电路。
二、温湿度监视仪设计与实现
(一)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顺利启动。
(二)OLED驱动
OLED使用SPI接口,直接插在GD32F3苹果派开发板的EMC插座上。
具体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总线上。
从官方原理图上可以看出使用了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电源,开机。
可以看出设备都正常工作,再看看内存,64K的ram看起来处理绰绰有余。
此时可以查看OLED显示:
因为屏幕比较小,近距离观看:
现在室内12.8摄氏度,湿度76.9%,估计我呆在桌前太久:)
四、一点感想
1、基于兆易创新完整的驱动和支持材料,开发者可以很方便的为GD32系列开发板移植各类RTOS;
2、GD32F3苹果派开发板做的很漂亮,一眼看来爱不释手,相关材料包括《GD32微控制器原理与应用》中规中矩,条理清晰;
3、第一次使用GD32的M4系列MCU,本次试用测试了GPIO、SPI、I2C、USART等接口功能,用起来很顺手,挺多惊喜的。
<感谢阅读>