完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想利用DMA在内存和USART的数据寄存器之间,每隔100毫秒传输一次数据。
实现方法是:用的SystickConfig()定时器每隔100毫秒产生一次中断,然后在中断里面应该写一句有关“USART请求DMA传输数据”的语句吧?但是好像找了半天手册都找不到关于这个功能的寄存器,,有没有路过的高手可以指点下啊,谢了 |
|
相关推荐
15个回答
|
|
在STM32 3.5库里面就有关于DMA_Interrupt的例子,可以参考之
|
|
|
|
谢谢了,我看了看你说的那个例程。和我表达的不是一个意思。我想实现的功能是:用DMA在串口和内存之间,每0.1s传输一次数据,这肯定的用到系统滴答定时器SysTickConfig()吧,然后在SysTickConfig()中断函数里面写一条关于串口请求DMA传输数据的语句,但是我在手册上找了半天还是找不到有关于串口请求DMA传输数据功能的寄存器,望高手指点一下,这个功能在哪里可以配置啊??万分感谢 |
|
|
|
本帖最后由 你好我好大家好! 于 2014-11-16 19:28 编辑
看来是没有人回答了,还是自己回答一下吧:在SysTickConfig()中断函数服务函数中,只要写入这几句话就可以实现上述功能了:void SysTick_Handler(void) { //Tx通道传输数据量重加载 DMA_Cmd(USARTx_TX_DMA_CHANNEL,DISABLE); DMA1_Channel2->CNDTR=0x0A; DMA_Cmd(USARTx_TX_DMA_CHANNEL,ENABLE); //Rx通道传输数据量重加载 DMA_Cmd(USARTx_RX_DMA_CHANNEL,DISABLE); DMA1_Channel3->CNDTR=0x0A; DMA_Cmd(USARTx_RX_DMA_CHANNEL, ENABLE); } 这个程序是一次要传输10个数据,传输数据量的值为0x0A |
|
|
|
|
|
|
|
不建议在滴答时钟里面加处理。可以通过在while里面定时器差值判断来发送数据。传输的设置和楼主设置一样就可以了。
|
|
|
|
您好啊,我是新手,您能不能举个例子啊(就是如何在while里面用定时器差值来判断发送数据),谢谢了 |
|
|
|
比如滴答时钟中断中增加一个32位的变量。直接在中断中执行a++就可以了。再定义一个b,当a-b>规定时间时,发送数据,并且b=a;
|
|
|
|
按您说的程序应该是这样吧 void SysTick_Handler(void) { a++; } 然后再主函数中这样写:while(1) { * * if(a-b>规定时间) { 发送数据; b=a: } * * * } |
|
|
|
是的。这样测试效果如何?
|
|
|
|
这样可以,但是在主函数中一直在执行while循环,这样会占用内存,不利于电机实时性地传输数据,不如中断好一些。如果说对于要求实时性低的系统来说,这样可以。 |
|
|
|
你的程序中没有while循环吗?可以加一个延时。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
多谢你的宝贵经验,,在库中有这个函数可以更改DMA通道的待发送数据总数
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2078 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1216 浏览 0 评论
2837 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2600 浏览 3 评论
5284 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 02:07 , Processed in 0.962827 second(s), Total 99, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号