你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 7009|回复: 19

[STM32F446] STM32F446RE+Cube_I2C_DMA 玩转DS3231

[复制链接]

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2017-3-26 16:01:16 | 显示全部楼层 |阅读模式
本帖最后由 Paderboy 于 2017-3-26 16:08 编辑

哈哈,大伙周末好。。。



有段时间没露脸了;趁着周末有点时间,撸了一会板子。。。
刚好手上有个DS3231的模块,没事想在STM32上跑跑。。。先在论坛搜索了下,关于DS3231的帖子很少,
也没有使用Cube+HAL的例程。。今天就过程分享给大伙。。。



1.使用Cube配置F446RE 内部时钟:HSI
2.配置I2C1 作为读写DS3231的通讯方式
3.配置串口2,输出调试信息
4.配置串口和I2C通过DMA方式接收数据



好了直接上图。。。 简单暴力。。。。。


STM32F446RE_I2C_DS3231-01.png

主频开到最大。。

STM32F446RE_I2C_DS3231-02.png

配置串口DMA+中断(用到IDLE空闲中断接收数据)
STM32F446RE_I2C_DS3231-03.png

I2C 配置400Khz的

STM32F446RE_I2C_DS3231-04.png

只配置了I2C DMA_Rx的配置

STM32F446RE_I2C_DS3231-05.png

保存工程。。。

STM32F446RE_I2C_DS3231-06.png

下面上些,截图。。。创建 DS3231数据结构

STM32F446RE_I2C_DS3231-12.png

BCD到DEC 和 DEC到BCD的转化函数

STM32F446RE_I2C_DS3231-13.png

I2C读取回调函数,处理接收的数据(以及激活DS3231内部温度转换)

STM32F446RE_I2C_DS3231-14.png


获取DS3231内部温度后处理函数
STM32F446RE_I2C_DS3231-15.png


串口输出时间和温度函数

STM32F446RE_I2C_DS3231-16.png


设置DS3231时间函数(通过串口接收数据转换成BCD后写入DS3231)

STM32F446RE_I2C_DS3231-17.png


串口数据接收函数

STM32F446RE_I2C_DS3231-18.png


好了现在看下调试过程的截图 演示:

STM32F446RE_I2C_DS3231-07.png


STM32F446RE_I2C_DS3231-08.png

STM32F446RE_I2C_DS3231-09.png

STM32F446RE_I2C_DS3231-10.png

STM32F446RE_I2C_DS3231-11.png


调试过程总结:使用Cube+HAL库非常方便建立工程和直接调用HAL库的I2C函数,直接读取DS3231的数据,经过处理后,通过串口输出非常便捷高效。。。
调试过程中,遇到了,些问题(就是对DS3231的时间设定问题,串口接收的数据都准确,但是在写入DS3231的过程中,有时候不能成功设置时间,而且成功几率很低。最后发现了问题所在(就是我在设置I2C NVI 中断优先等级不够优先,所以造成被其他中断抢占了。导致设置时间失败。。)修改中断优先等级解决上述问题。。) 。。

好了再次感谢ST公司的Cube+HAL库让我越来越偷懒了。。。。。


附上整个工程: STM32F446RE_I2C_DS3231_DMA.rar (67.53 KB, 下载次数: 306)
回复

使用道具 举报

21

主题

577

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-8-6
发表于 2017-3-26 19:47:23 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
 楼主| 发表于 2017-3-26 20:36:15 | 显示全部楼层

多谢支持。。。
回复 支持 反对

使用道具 举报

1

主题

35

回帖

0

蝴蝶豆

初级会员

最后登录
2020-5-31
发表于 2017-3-27 08:42:21 | 显示全部楼层
赞,很详细。。。。多谢分享
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2017-3-27 09:01:01 | 显示全部楼层
CubeMX 真神器啊!
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
 楼主| 发表于 2017-3-27 09:57:33 | 显示全部楼层
creep 发表于 2017-3-27 09:01
CubeMX 真神器啊!

无需质疑啊。。。但是还需继续完善啊。。
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
 楼主| 发表于 2017-3-27 09:57:54 | 显示全部楼层
munsterzl 发表于 2017-3-27 08:42
赞,很详细。。。。多谢分享

多谢支持。。
回复 支持 反对

使用道具 举报

4

主题

5

回帖

0

蝴蝶豆

中级会员

最后登录
2018-2-25
发表于 2017-3-30 11:18:40 | 显示全部楼层
请问LZ,
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断页打钩中断。
2,在uart rx 时用dma,而uart tx时不用dma?
回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
 楼主| 发表于 2017-3-30 13:12:06 | 显示全部楼层
zhang_mike2000 发表于 2017-3-30 11:18
请问LZ,
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断 ...

我只是没都使用DMA,如果你需要你,可以都用DMA方式去操作。。。你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴了。
串口你也可以使用dma方式。
回复 支持 反对

使用道具 举报

4

主题

5

回帖

0

蝴蝶豆

中级会员

最后登录
2018-2-25
发表于 2017-3-30 14:23:12 | 显示全部楼层
我还想请教一下,你说“你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴了。”  我不明白你的意思。
比如,我在cube里打开i2c的dma。有3个tab页。
i2c setting, i2c nvic, nvic configeration
应该在哪里打钩呢。我在i2c setting 里面打开dma后,没有看到哪个中断被自动 打开了呀? 谢谢

i2csetting.png
i2cnvic.png
nvic conf.png
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版