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

STM32F446RE+Cube_I2C_DMA 玩转DS3231

[复制链接]
Paderboy 提问时间:2017-3-26 16:01 /
本帖最后由 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, 下载次数: 338)
收藏 3 评论19 发布时间:2017-3-26 16:01

举报

19个回答
zhang_mike2000 回答时间:2017-3-31 10:46:54
Paderboy 发表于 2017-3-30 18:03
这个是我这个帖子的cube工程里NVI I2C的截图,默认是cube自动勾选的,我在cube里无法修改的。。也就是 ...

谢谢你的回复,我又看了一下,发现了一个问题,我之前的cube版本是4.18,结果配置时就出现了10楼的截屏。后来我把cube升级到最新的4.20 就出现了你在11楼的截屏。
也就是说,4.20把dma的interrupt给打钩了,我们要做的就是把event interrupt打钩。

这样 在i2c的callback里面写回调程序就可以了。

另外还有个问题,就是dma接受时的dma buffer大小和mode中normal circular的问题。
这个问题是由于在uart接收中,比如一帧10bytes,某种原因受到干扰,这着一帧数据有丢失了几个byte,比如受到9bytes,那么是不是dma就是在那里等着,直到下次再来一帧时,凑够10bytes就触发中断?但是问题是下一帧本来的10bytes,被前一次的dma用掉了一个byte,就剩下9个bytes,这就全乱了。这个问题如何解决?是不是有个dma计数器定时清理的机制呢?
Paderboy 回答时间:2017-3-30 18:03:46
zhang_mike2000 发表于 2017-3-30 14:23
我还想请教一下,你说“你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴 ...



这个是我这个帖子的cube工程里NVI I2C的截图,默认是cube自动勾选的,我在cube里无法修改的。。也就是说,我配置了i2c dma接收数据,那么cube就自动帮我开启了对应的dma通道中断。。。

QQ截图20170330175901.png

这个是我修改后的 Rx Tx的截图
QQ截图20170330175924.png


应该是不同系列的cube的配置方案不同。。如果cube没有自动配置对应的dma通道中断,那只能自己手动打勾。。。
Paderboy 回答时间:2017-3-31 12:06:17
本帖最后由 Paderboy 于 2017-3-31 12:07 编辑
zhang_mike2000 发表于 2017-3-31 10:46
谢谢你的回复,我又看了一下,发现了一个问题,我之前的cube版本是4.18,结果配置时就出现了10楼的截屏。 ...


1.用串口中断空闲标志+dma接收(接收数据,但是接收的buff要尽量的大一些,然后自己判断数据是否可用。)

2.串口超时关闭接收(超过设置时间,就关闭接收,复位相关的标志位后继续接收)
戏如人生 回答时间:2017-3-26 19:47:23
赞一个
Paderboy 回答时间:2017-3-26 20:36:15

多谢支持。。。
munsterzl 回答时间:2017-3-27 08:42:21
赞,很详细。。。。多谢分享
creep 回答时间:2017-3-27 09:01:01
CubeMX 真神器啊!
Paderboy 回答时间:2017-3-27 09:57:33
creep 发表于 2017-3-27 09:01
CubeMX 真神器啊!

无需质疑啊。。。但是还需继续完善啊。。
Paderboy 回答时间:2017-3-27 09:57:54
munsterzl 发表于 2017-3-27 08:42
赞,很详细。。。。多谢分享

多谢支持。。
zhang_mike2000 回答时间:2017-3-30 11:18:40
请问LZ,
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断页打钩中断。
2,在uart rx 时用dma,而uart tx时不用dma?
Paderboy 回答时间: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方式。
zhang_mike2000 回答时间: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
阳道爷 回答时间:2017-10-20 22:14:23
很钦佩楼主的开源精神
企鹅不会飞000 回答时间:2017-10-31 14:39:12
谢谢楼主分享,学习了
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版