[开发板] 【CW32L031CxTx StartKit评估板测评】+一点小制作

[复制链接]
1268|5
 楼主| Tristan_C 发表于 2023-10-14 12:32 | 显示全部楼层 |阅读模式
前面我们已经准备好了开发环境,我们就开始做一些简单的有意思的东西吧
一、开发评估
1.GPIO、UART及printf重映射
首先在Example中创建my_code文件夹,用于放置自己的代码
305f000adee09fd759b2fcf4ed2d61f0
然后拷贝UART文件夹下的UART_Printf到my_code中,后续我们将以此demo做扩展开发
21f806d1c86f738f8a6fbcda3761a97f
使用keil打开该demo,先编译提示无错误
e4bbdc06359225591cc199dbcf645be2
然后在工程选项中,在Debug选项卡中选择正确的调试工具,这里注意选择DAP
5268610bde3e1cdca57ca840c141bf71
并且可以在配置中将下面的Reset and Run勾选上,这样下载完程序就会自动复位芯片运行了。
567a02034d4e77c510e66038438e0696
接下来就按照下图链接关系将
1f361b20d9ab07c6c77768d3ca9b32e5
fc11cd5aee834c4d3d8e00c8fec4b14a
考虑到接线方便,且WCH-link也具备供电功能,因此直接使用其上面的3.3V,给板子供电,链接到CN24的DCIN中。
06f77e9d3e7ec18b0214abc1bd875fdb
而串口则将J3的跳线帽全部去除,再使用条线连接J3上面的PA8到wch-link的RXD引脚,因为考虑到只需要打印,因此TXD就不用连接了。
48e654f455c2f3f3e18f2d4e27d8b910
f1751d0f9964b4b6d7738ea8fcb77b9a
下载程序就可以看到上位机串口调试工具中打印的内容了。
708b15a6d217b2b6bc36ef0ddda66843
分析程序可以看出来,主程序也比较简单,初始化时钟,GPIO以及UART,然后就打印信息
3b599ad1923a2b67bb1464059614b747
对于prinf函数的重映射,也是使用了常规的方法,即定义PUTCHAR_PROTOTYPE为fputc
4b676bbf4572018c0d4238e93927f138
然后再具体实现PROTOTYPE,主要就是通过串口发送一个ch字符
b347d2d868ffa9764369e26c06ee2bc2
这样即可实现printf打印数据了。
接下来我们在上面代码的基础上增加一下LED的代码,LED的代码相对是比较基础,只要配置GPIO为输出,并根据LED的电路输出高低电平来控制LED亮灭即可。
首先我们看下原理图,LED分别是PB08和PB09,均为高电平点亮LED,因此将GPIO配置为push-pull输出即可。
699f9a77fb72b687b0efef1e4a772e83
首先定义LED的GPIO
c0807ad45f70ea74f393975c73409d94
然后在函数GPIO_Configuration中初始化两个IO口并亮灭闪烁两次
12419741110e730f7f23cf092f24f738
接下来我们添加按钮功能,从图纸上我们可以看到有两个分别接到PA01和PA02的按钮,外部接上拉。
40967eb1b4cca2abe5af51a451ea63fe
这样我们考虑用查询法检测GPIO,首先定义按钮的GPIO以及读取状态宏定义
50fc1fd437dbbc26be1746901a577387
然后同样在GPIO_Configuration函数中做初始化为输入
bc38334cbdbf1ac7c189cd5827402f91
再定义一个按钮查询函数,返回按钮是否被按下
200482a739a016d83f639717a38ce9b5
最后在main函数中查询,当KEY1被按钮下时,LED1亮起,抬起则熄灭,KEY和LED2同理
302d2953a96a5ed776d74141109c2cd9
按钮均未按下
391be559ad716776f1298d0d006aa473
KEI2按下
584bf711a958718dbf681b60cd8e8b99
KEY1按下
f0a9562dd2a0e9de9d2928a868273709


2.SHT3x传感器
接下来我们就在上述功能基础上,准备使用I2C驱动SHT30温湿度传感器,来使用一下SDK中的I2C,试用一下相对复杂一些的I2C驱动。
首先我们从SHT30芯片上看,其只要3.3V电源闭关使用I2C接口即可,I2C地址为0x44(ADDR接地)
0ee71679ecf877bcbff5fd4f78ef768c
78f8c81296793cb29398fb3d83c6008d
然后从板子的硬件上可以找到,已经从I2C1上接了一颗EEPROM,那就可以直接使用这一路I2C即可,不用调整IO也方便调试。
e 69f967c73a384c4cd71207295c6568fe
接下来我们就将SHT的板子使用杜邦线连接到板子,其中,I2C就接到PA06和PA07,分别作为SCL和SDA。而电源就接到CN1中
301bd89b708df3dc3526ae90e766a3c1
8c5ae806e813f89a3efb60927b2f2b73
然后准备软件,首先创建i2c_drv.c文件,及其i2c_drv.h头文件,作为基础驱动,并编写如下代码,主要用于初始化I2C。
ed5a2c67979e1b1171d78117b8dec20e
然后创建 app_sensor_sht3x.c 和 app_sensor_sht3x.h 文件,主要实现对STH30的初始化、配置和温度获取操作
芯片初始化
b4c0813e863cd40d3a439f45a2f928d9
读取SN号
55f859bbf0aa32501ddb8ad11ac7878f
读取状态
3a210990bdd92b1790ac5918679be307
发送指令与读取数据
26b4fa44ae8c21ca5fd90fba558ec237
下面就是读取温湿度数据了
ef50cc7a256411495c6052d68d52b043
当然我们还要添加I2C的芯片驱动文件
7c1607b09c1ee455d3ae8951432dcf65
最终工程结构如下
9a51c4bad34a29324ef544d21870c568
然后我们在main函数中初始化I2C接口以及sht30芯片,然后读取温度并通过串口打印
d517835a265f4a5a845511e69636a10b
接着编译下载运行,就可以在上位机软件看到温湿度信息了
78072b768e0895bb46ef1ea225b4d7bc
这里遇到一点小坑,不过当然也是我对代码观察不够细心。本来以为需要这样在I2C_MasterSendDataToSlave之前线发送地址
6cd7c9f30e91d04d5233bbbfd3c1914b
后来发现这个I2C_MasterSendDataToSlave函数里面已经有 I2C_Send7bitAddress,相当于重复发送,并且该函数中使用的从机地址并非需要的SHT3x_I2C_ADDR
5eac5e11b16cba0c5da5bf961a1af3f4
而是将从机地址定义在了I2C_SLAVEADDRESS中,
f4e904fbade90e6d5ea4b50211e8cfe7
于是将其修改成SHT3x_I2C_ADDR的值
d50da6bb91d1ae80975af51e0505208d
并且去掉sensor_sht3x_write_command和sensor_sht3x_read_nbytes函数中的I2C_Send7bitAddress发送地址操作。变成如下即可
4c7acbd91420d141e9a8736fc46c99b8


3.OLED显示
完成上面的功能,我们可以再增加一个OLED显示屏,将前面采集到的温湿度显示在其上面。这里选择了下图的0.96寸OLED显示屏模块。模块为128*64点阵分辨率,可3.3V供电,因此可以直接使用板子上的电源。SPI通信接口,驱动芯片为SSD1306。
4eb08813b8d10d9650e6a6218e35b4f0
模块使用2.54间距插针接出,其线序及与芯源芯片的连接关系如下
GND                      地
VCC                       电源
D0                         4 线 SPI 接口模式:时钟线(CLK)   接PA10
D1                         4 线 SPI接口模式:串行数据线(MOSI) 接PA12
RES                        4 线 SPI接口模式:命令/数据标志位(RET复位) 接PB11
DC                        命令/数据标志位   接PB10
CS                        OLED 片选   接PB02
2b665474f65c17aa7e297d57b53b71fb
可以使用杜邦线进行连接,实物如下图
663d63c53565595e679854135d990dd4
0d9ec59806e7b3f18a60ea3fabc4e60f
dbfb906659861ad79e390925bb993d03
接下来就进行程序设计了
首先是添加两个文件,分别是user_spi_drv及其头文件作为spi驱动,以及user_oled_drv及其头文件作为oled驱动,再添加一个芯片spi驱动库文件。
8a2a9020508d8c96f4c1cf9b3df6a894
在user_spi_drv头文件中定义如下内容,包括
SPI时钟、IO口以及功能口定义等 69bcbdbda2ea903fc26d90fab18590e0
并在user_spi_drv文件中实现spi的init函数
768a9dc2bc3c4510c72d21757b8e7e5b
以及spi的收发函数,这里需要注意的是,spi最好采用全双工方式,这样在发送必须要等待接收双工完成,要不然发送函数在返回时,有可能数据还没发完,返回之后造成CS脚被提前拉高,造成时序错误的情况。
c5cc7253e095dee71bc39429ee66fae3
接着时user_oled_drv,在头文件中,定义oled相关的CS、DC以及RES引脚,还有oled相关的宏定义
298eabbd365d252fb8c47c261048dd67
而在user_oled_drv.c文件中实现具体的oled基础操作,包括初始化,发送数据,发送命令,显示字符,显示字符串,显示bmp图片等等。
其中硬件初始化如下,主要进行几个控制IO的初始化
f38d42534f844919b3a6f469496cb74e
在oled初始化函数中,则进行了oled模块的drv初始化以及参数配置。
883b6e37c1162051caa3bc8ef6046722
接下来就在main函数中调用初始化闭关显示
0e74e0a612a26fb64cd975f2bcde8c31
编译下载运行,即可在oled上面看到显示内容了
1252866ace11db6c90cf39565c34cb6b


4.定时采集温湿度并显示
接下来我们就可以定时采集一下温湿度,并更新显示了
定时就得使用一个定时器,本处我们就选用一个特殊的定时其,iwdt看门狗定时器吧,不用复位功能,直接使用定时中断功能
首先仍旧按照前述方法,增加iwdt_drv的头文件和C文件,其中头文件定义如下
主要就是两个部分,一个时定义回调函数,用于处理定时中断回调,另一个就是初始化
127009f4082c890d7621417fd39ce3ab
而C文件则如下实现
首先是初始化函数,定义了对应的定时周期,并使能中断,注意这里不能使用iwdg的复位功能,只使用超时中断。
然后就是中断处理函数中,调用回调函数了。
768a4a0b2b4112ac701f2b4ffc4ec003
回到main文件
定义中断标志 test_flag,再定义回调函数,并在其中置1
875f9f0bf82a0e3514b9c2de4ca3e5cc
然后在main函数中初始化,并需要注意使能全局中断
01ccbb338f4d9045b7bae424cf92565c
接着就可以在主循环中判断test_flag标志,当为1时,获取温湿度,并更新oled显示
ea7d1e9a8fde6eb6d3aa381bb2d9f7e7
其中更新显示的函数实现如下
9048e57b7ea234b4379c0df8badd052a
编译下载运行,即可显示更新温湿度信息
2c28456ebc003abc00ebcfb5467e9066
可以朝着温湿度传感器哈一口气观察温湿度变化
ba50ef7d5de96922303a66d9625cf715
最后来个一张全家福吧
517786aa3f3b66fcae42056e04b48fe4


二、总结
首先芯源的这颗芯片还是不错的,资源很丰富封装比较多,也合适,可以满足不同需求。官方推荐开发工具也符合主流方式,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 来自手机 | 显示全部楼层
楼主写的很详细啊,支持。
 楼主| Tristan_C 发表于 2023-10-17 08:35 | 显示全部楼层
chenjun89 发表于 2023-10-16 22:38
楼主写的很详细啊,支持。

一起学习啊
星辰大海不退缩 发表于 2023-10-25 13:45 | 显示全部楼层
串口则将J3的跳线帽全部去除,再使用条线连接J3上面的PA8到wch-link的RXD引脚,因为考虑到只需要打印,因此TXD就不用连接了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

117

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部