本帖最后由 Paderboy 于 2017-3-26 16:08 编辑 哈哈,大伙周末好。。。 有段时间没露脸了;趁着周末有点时间,撸了一会板子。。。 刚好手上有个DS3231的模块,没事想在STM32上跑跑。。。先在论坛搜索了下,关于DS3231的帖子很少, 也没有使用Cube+HAL的例程。。今天就过程分享给大伙。。。 1.使用Cube配置F446RE 内部时钟:HSI 2.配置I2C1 作为读写DS3231的通讯方式 3.配置串口2,输出调试信息 4.配置串口和I2C通过DMA方式接收数据 好了直接上图。。。 简单暴力。。。。。 主频开到最大。。 配置串口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库让我越来越偷懒了。。。。。 附上整个工程: |
【STM32F429开发日志】汉字显示(取模方式)
【STM32F429开发日志】5.uCOS-ii V2.91 移植OK
图形化玩转Nucleo-STM32F413手机APP远程控制应用开发
【stm32F429开发日志】使用STM32CubeMX配置STM32F429_USB_HID
【STM32F429开发日志】(三)使用STM32Cube开发环境
【STM32F429开发日志】——网络收集的例程分享(包括所有STM32F429Discovery板上外设驱动)
分享个用STM32F429做的网络摄像头
STM32F429UCOS 源代码
【STM32F429开发日志】+hello led(闪烁led灯)
STM32F429DSICOVERY移植到STemWIN(图片+源码)
谢谢你的回复,我又看了一下,发现了一个问题,我之前的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计数器定时清理的机制呢?
这个是我这个帖子的cube工程里NVI I2C的截图,默认是cube自动勾选的,我在cube里无法修改的。。也就是说,我配置了i2c dma接收数据,那么cube就自动帮我开启了对应的dma通道中断。。。
这个是我修改后的 Rx Tx的截图
应该是不同系列的cube的配置方案不同。。如果cube没有自动配置对应的dma通道中断,那只能自己手动打勾。。。
1.用串口中断空闲标志+dma接收(接收数据,但是接收的buff要尽量的大一些,然后自己判断数据是否可用。)
2.串口超时关闭接收(超过设置时间,就关闭接收,复位相关的标志位后继续接收)
多谢支持。。。
无需质疑啊。。。但是还需继续完善啊。。
多谢支持。。
为什么
1,在read i2c的时候用dma,而write i2c是不用dma? 还有,i2c rx 开dma时是否也要在中断页打钩中断。
2,在uart rx 时用dma,而uart tx时不用dma?
我只是没都使用DMA,如果你需要你,可以都用DMA方式去操作。。。你开启DMA,对应的dam中断就会被开启。。但是,这个不是这个外设的中断。。。别混肴了。
串口你也可以使用dma方式。
比如,我在cube里打开i2c的dma。有3个tab页。
i2c setting, i2c nvic, nvic configeration
应该在哪里打钩呢。我在i2c setting 里面打开dma后,没有看到哪个中断被自动 打开了呀? 谢谢