打印
[开发板]

【CW32L031CxTx StartKit评估板测评】+一点小制作

[复制链接]
599|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Tristan_C|  楼主 | 2023-10-14 12:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前面我们已经准备好了开发环境,我们就开始做一些简单的有意思的东西吧
一、开发评估
1.GPIO、UART及printf重映射
首先在Example中创建my_code文件夹,用于放置自己的代码

然后拷贝UART文件夹下的UART_Printf到my_code中,后续我们将以此demo做扩展开发

使用keil打开该demo,先编译提示无错误

然后在工程选项中,在Debug选项卡中选择正确的调试工具,这里注意选择DAP

并且可以在配置中将下面的Reset and Run勾选上,这样下载完程序就会自动复位芯片运行了。

接下来就按照下图链接关系将


考虑到接线方便,且WCH-link也具备供电功能,因此直接使用其上面的3.3V,给板子供电,链接到CN24的DCIN中。

而串口则将J3的跳线帽全部去除,再使用条线连接J3上面的PA8到wch-link的RXD引脚,因为考虑到只需要打印,因此TXD就不用连接了。


下载程序就可以看到上位机串口调试工具中打印的内容了。

分析程序可以看出来,主程序也比较简单,初始化时钟,GPIO以及UART,然后就打印信息

对于prinf函数的重映射,也是使用了常规的方法,即定义PUTCHAR_PROTOTYPE为fputc

然后再具体实现PROTOTYPE,主要就是通过串口发送一个ch字符

这样即可实现printf打印数据了。
接下来我们在上面代码的基础上增加一下LED的代码,LED的代码相对是比较基础,只要配置GPIO为输出,并根据LED的电路输出高低电平来控制LED亮灭即可。
首先我们看下原理图,LED分别是PB08和PB09,均为高电平点亮LED,因此将GPIO配置为push-pull输出即可。

首先定义LED的GPIO

然后在函数GPIO_Configuration中初始化两个IO口并亮灭闪烁两次

接下来我们添加按钮功能,从图纸上我们可以看到有两个分别接到PA01和PA02的按钮,外部接上拉。

这样我们考虑用查询法检测GPIO,首先定义按钮的GPIO以及读取状态宏定义

然后同样在GPIO_Configuration函数中做初始化为输入

再定义一个按钮查询函数,返回按钮是否被按下

最后在main函数中查询,当KEY1被按钮下时,LED1亮起,抬起则熄灭,KEY和LED2同理

按钮均未按下

KEI2按下

KEY1按下



2.SHT3x传感器
接下来我们就在上述功能基础上,准备使用I2C驱动SHT30温湿度传感器,来使用一下SDK中的I2C,试用一下相对复杂一些的I2C驱动。
首先我们从SHT30芯片上看,其只要3.3V电源闭关使用I2C接口即可,I2C地址为0x44(ADDR接地)


然后从板子的硬件上可以找到,已经从I2C1上接了一颗EEPROM,那就可以直接使用这一路I2C即可,不用调整IO也方便调试。
e
接下来我们就将SHT的板子使用杜邦线连接到板子,其中,I2C就接到PA06和PA07,分别作为SCL和SDA。而电源就接到CN1中


然后准备软件,首先创建i2c_drv.c文件,及其i2c_drv.h头文件,作为基础驱动,并编写如下代码,主要用于初始化I2C。

然后创建 app_sensor_sht3x.c 和 app_sensor_sht3x.h 文件,主要实现对STH30的初始化、配置和温度获取操作
芯片初始化

读取SN号

读取状态

发送指令与读取数据

下面就是读取温湿度数据了

当然我们还要添加I2C的芯片驱动文件

最终工程结构如下

然后我们在main函数中初始化I2C接口以及sht30芯片,然后读取温度并通过串口打印

接着编译下载运行,就可以在上位机软件看到温湿度信息了

这里遇到一点小坑,不过当然也是我对代码观察不够细心。本来以为需要这样在I2C_MasterSendDataToSlave之前线发送地址

后来发现这个I2C_MasterSendDataToSlave函数里面已经有 I2C_Send7bitAddress,相当于重复发送,并且该函数中使用的从机地址并非需要的SHT3x_I2C_ADDR

而是将从机地址定义在了I2C_SLAVEADDRESS中,

于是将其修改成SHT3x_I2C_ADDR的值

并且去掉sensor_sht3x_write_command和sensor_sht3x_read_nbytes函数中的I2C_Send7bitAddress发送地址操作。变成如下即可



3.OLED显示
完成上面的功能,我们可以再增加一个OLED显示屏,将前面采集到的温湿度显示在其上面。这里选择了下图的0.96寸OLED显示屏模块。模块为128*64点阵分辨率,可3.3V供电,因此可以直接使用板子上的电源。SPI通信接口,驱动芯片为SSD1306。

模块使用2.54间距插针接出,其线序及与芯源芯片的连接关系如下
GND                      地
VCC                       电源
D0                         4 线 SPI 接口模式:时钟线(CLK)   接PA10
D1                         4 线 SPI接口模式:串行数据线(MOSI) 接PA12
RES                        4 线 SPI接口模式:命令/数据标志位(RET复位) 接PB11
DC                        命令/数据标志位   接PB10
CS                        OLED 片选   接PB02

可以使用杜邦线进行连接,实物如下图



接下来就进行程序设计了
首先是添加两个文件,分别是user_spi_drv及其头文件作为spi驱动,以及user_oled_drv及其头文件作为oled驱动,再添加一个芯片spi驱动库文件。

在user_spi_drv头文件中定义如下内容,包括
SPI时钟、IO口以及功能口定义等
并在user_spi_drv文件中实现spi的init函数

以及spi的收发函数,这里需要注意的是,spi最好采用全双工方式,这样在发送必须要等待接收双工完成,要不然发送函数在返回时,有可能数据还没发完,返回之后造成CS脚被提前拉高,造成时序错误的情况。

接着时user_oled_drv,在头文件中,定义oled相关的CS、DC以及RES引脚,还有oled相关的宏定义

而在user_oled_drv.c文件中实现具体的oled基础操作,包括初始化,发送数据,发送命令,显示字符,显示字符串,显示bmp图片等等。
其中硬件初始化如下,主要进行几个控制IO的初始化

在oled初始化函数中,则进行了oled模块的drv初始化以及参数配置。

接下来就在main函数中调用初始化闭关显示

编译下载运行,即可在oled上面看到显示内容了



4.定时采集温湿度并显示
接下来我们就可以定时采集一下温湿度,并更新显示了
定时就得使用一个定时器,本处我们就选用一个特殊的定时其,iwdt看门狗定时器吧,不用复位功能,直接使用定时中断功能
首先仍旧按照前述方法,增加iwdt_drv的头文件和C文件,其中头文件定义如下
主要就是两个部分,一个时定义回调函数,用于处理定时中断回调,另一个就是初始化

而C文件则如下实现
首先是初始化函数,定义了对应的定时周期,并使能中断,注意这里不能使用iwdg的复位功能,只使用超时中断。
然后就是中断处理函数中,调用回调函数了。

回到main文件
定义中断标志 test_flag,再定义回调函数,并在其中置1

然后在main函数中初始化,并需要注意使能全局中断

接着就可以在主循环中判断test_flag标志,当为1时,获取温湿度,并更新oled显示

其中更新显示的函数实现如下

编译下载运行,即可显示更新温湿度信息

可以朝着温湿度传感器哈一口气观察温湿度变化

最后来个一张全家福吧



二、总结
首先芯源的这颗芯片还是不错的,资源很丰富封装比较多,也合适,可以满足不同需求。官方推荐开发工具也符合主流方式,SDK(peripheral libraries)+Keil(IDE)。中间可能是芯源原厂发布的时候疏忽了,sdk中漏了一些文件,需要自己根据经验和其它外设的例程进行编写。总之还是**芯源能快速发展起来,完善整个软硬件生态,争到更多的市场。

使用特权

评论回复
沙发
jf101| | 2023-10-16 13:08 | 只看该作者
楼主 这个是一个集合DEMO样例,涉及知识点非常齐全

使用特权

评论回复
板凳
Tristan_C|  楼主 | 2023-10-16 14:43 | 只看该作者
jf101 发表于 2023-10-16 13:08
楼主 这个是一个集合DEMO样例,涉及知识点非常齐全

一起学习

使用特权

评论回复
地板
chenjun89| | 2023-10-16 22:38 | 只看该作者
楼主写的很详细啊,支持。

使用特权

评论回复
5
Tristan_C|  楼主 | 2023-10-17 08:35 | 只看该作者
chenjun89 发表于 2023-10-16 22:38
楼主写的很详细啊,支持。

一起学习啊

使用特权

评论回复
6
星辰大海不退缩| | 2023-10-25 13:45 | 只看该作者
串口则将J3的跳线帽全部去除,再使用条线连接J3上面的PA8到wch-link的RXD引脚,因为考虑到只需要打印,因此TXD就不用连接了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

113

帖子

0

粉丝