前面我们已经准备好了开发环境,我们就开始做一些简单的有意思的东西吧
一、开发评估
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中漏了一些文件,需要自己根据经验和其它外设的例程进行编写。总之还是**芯源能快速发展起来,完善整个软硬件生态,争到更多的市场。
|