STM32F446RE+Cube_I2C_DMA 玩转DS3231
本帖最后由 Paderboy 于 2017-3-26 16:08 编辑哈哈,大伙周末好。。。
有段时间没露脸了;趁着周末有点时间,撸了一会板子。。。
刚好手上有个DS3231的模块,没事想在STM32上跑跑。。。先在论坛搜索了下,关于DS3231的帖子很少,
也没有使用Cube+HAL的例程。。今天就过程分享给大伙。。。
1.使用Cube配置F446RE 内部时钟:HSI
2.配置I2C1 作为读写DS3231的通讯方式
3.配置串口2,输出调试信息
4.配置串口和I2C通过DMA方式接收数据
好了直接上图。。。:loveliness: 简单暴力。。。。。
主频开到最大。。
配置串口DMA+中断(用到IDLE空闲中断接收数据)
I2C 配置400Khz的
只配置了I2C DMA_Rx的配置
保存工程。。。
下面上些,截图。。。创建 DS3231数据结构
BCD到DEC 和 DEC到BCD的转化函数
I2C读取回调函数,处理接收的数据(以及激活DS3231内部温度转换)
获取DS3231内部温度后处理函数
串口输出时间和温度函数
设置DS3231时间函数(通过串口接收数据转换成BCD后写入DS3231)
串口数据接收函数
好了现在看下调试过程的截图 演示:
调试过程总结:使用Cube+HAL库非常方便建立工程和直接调用HAL库的I2C函数,直接读取DS3231的数据,经过处理后,通过串口输出非常便捷高效。。。
调试过程中,遇到了,些问题(就是对DS3231的时间设定问题,串口接收的数据都准确,但是在写入DS3231的过程中,有时候不能成功设置时间,而且成功几率很低。最后发现了问题所在(就是我在设置I2C NVI 中断优先等级不够优先,所以造成被其他中断抢占了。导致设置时间失败。。)修改中断优先等级解决上述问题。。) 。。
好了再次感谢ST公司的Cube+HAL库让我越来越偷懒了。。。。。
附上整个工程:
DS3231_PDF文件:
赞一个 戏如人生 发表于 2017-3-26 19:47
赞一个
:loveliness:多谢支持。。。 赞,很详细。。。。多谢分享 CubeMX 真神器啊! creep 发表于 2017-3-27 09:01
CubeMX 真神器啊!
:loveliness:无需质疑啊。。。但是还需继续完善啊。。
munsterzl 发表于 2017-3-27 08:42
赞,很详细。。。。多谢分享
:loveliness:多谢支持。。 请问LZ,
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断页打钩中断。
2,在uart rx 时用dma,而uart tx时不用dma?
zhang_mike2000 发表于 2017-3-30 11:18
请问LZ,
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断 ...
我只是没都使用DMA,如果你需要你,可以都用DMA方式去操作。。。你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴了。
串口你也可以使用dma方式。 我还想请教一下,你说“你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴了。”我不明白你的意思。
比如,我在cube里打开i2c的dma。有3个tab页。
i2c setting, i2c nvic, nvic configeration
应该在哪里打钩呢。我在i2c setting 里面打开dma后,没有看到哪个中断被自动 打开了呀? 谢谢
页:
[1]
2