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

软件定时触发USART请求DMA传输数据的一个问题

[复制链接]
你好我好大家好! 提问时间:2014-11-15 20:18 /
       想利用DMA在内存和USART的数据寄存器之间,每隔100毫秒传输一次数据。
       实现方法是:用的SysTickConfig()定时器每隔100毫秒产生一次中断,然后在中断里面应该写一句有关“USART请求DMA传输数据”的语句吧?但是好像找了半天手册都找不到关于这个功能的寄存器,,有没有路过的高手可以指点下啊,谢了


收藏 评论15 发布时间:2014-11-15 20:18

举报

15个回答
小丁^_^ 回答时间:2014-11-15 22:23:41
在STM32 3.5库里面就有关于DMA_Interrupt的例子,可以参考之
你好我好大家好! 回答时间:2014-11-16 09:45:09
小丁^_^ 发表于 2014-11-15 22:23
在STM32 3.5库里面就有关于DMA_Interrupt的例子,可以参考之

谢谢了,我看了看你说的那个例程。和我表达的不是一个意思。我想实现的功能是:用DMA在串口和内存之间,每0.1s传输一次数据,这肯定的用到系统滴答定时器SysTickConfig()吧,然后在SysTickConfig()中断函数里面写一条关于串口请求DMA传输数据的语句,但是我在手册上找了半天还是找不到有关于串口请求DMA传输数据功能的寄存器,望高手指点一下,这个功能在哪里可以配置啊??万分感谢
你好我好大家好! 回答时间:2014-11-16 19:26:06
本帖最后由 你好我好大家好! 于 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
沐紫 回答时间:2014-11-18 14:13:57
加油!楼主自力更生。

也谢谢2楼朋友呢
废鱼 回答时间:2014-11-18 16:43:15
不建议在滴答时钟里面加处理。可以通过在while里面定时器差值判断来发送数据。传输的设置和楼主设置一样就可以了。
你好我好大家好! 回答时间:2014-11-20 12:07:56
安 发表于 2014-11-18 16:43
不建议在滴答时钟里面加处理。可以通过在while里面定时器差值判断来发送数据。传输的设置和楼主设置一样就 ...

您好啊,我是新手,您能不能举个例子啊(就是如何在while里面用定时器差值来判断发送数据),谢谢了
废鱼 回答时间:2014-11-20 14:05:09
比如滴答时钟中断中增加一个32位的变量。直接在中断中执行a++就可以了。再定义一个b,当a-b>规定时间时,发送数据,并且b=a;
你好我好大家好! 回答时间:2014-11-21 20:29:24
安 发表于 2014-11-20 14:05
比如滴答时钟中断中增加一个32位的变量。直接在中断中执行a++就可以了。再定义一个b,当a-b>规定时间时,发 ...

按您说的程序应该是这样吧
    void SysTick_Handler(void)
      {
        a++;
       }
然后再主函数中这样写:while(1)
                                 {        *
                                           *
                                    if(a-b>规定时间)
                                        {
                                            发送数据;
                                            b=a:
                                         }
                                             *
                                             *
                                             *
                                  }
                             
废鱼 回答时间:2014-11-24 09:21:58
是的。这样测试效果如何?
你好我好大家好! 回答时间:2014-11-25 18:03:38
安 发表于 2014-11-24 09:21
是的。这样测试效果如何?

这样可以,但是在主函数中一直在执行while循环,这样会占用内存,不利于电机实时性地传输数据,不如中断好一些。如果说对于要求实时性低的系统来说,这样可以。
废鱼 回答时间:2014-11-26 09:46:21
你的程序中没有while循环吗?可以加一个延时。
你好我好大家好! 回答时间:2014-11-27 10:16:49
安 发表于 2014-11-26 09:46
你的程序中没有while循环吗?可以加一个延时。

昨天是我想错了,这样估计也可以
废鱼 回答时间:2014-11-27 10:49:36
你好我好大家好! 发表于 2014-11-27 10:16
昨天是我想错了,这样估计也可以

嗯。有问题继续讨论就可以了。
你好我好大家好! 回答时间:2014-11-28 22:05:00
安 发表于 2014-11-27 10:49
嗯。有问题继续讨论就可以了。

12下一页

所属标签

相似问题

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