OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4622|回复: 10

利用STM32战舰开发板输出us级可控方波,请问各位有好的现实思路吗?

[复制链接]

26

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2014-2-10
在线时间
67 小时
发表于 2016-4-21 23:06:39 | 显示全部楼层 |阅读模式
最近在弄一个项目,需要输出us级的有规则方波,单纯靠原子哥的delay_us()函数,加上IO口置高低,发现                LED0=0; delay_us(30);        LED0=1;delay_us(30)输出波形与代码所写出入很大,请问实现附件波形图,各位有什么好的思路吗?
捕获1.JPG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2016-5-4 09:10:15 | 显示全部楼层
轩辕zh 发表于 2016-5-3 23:21
你好,按你的方案配置好了,但是自己还是没能掌握要领,修改发送的数组还是没能按自己的要求发数据,找到 ...

你定时1uS就不要用内存到内存的模式,应该用Tim4通道,可以Tim4的Update通道,Tim4更新一次,就触发DMA一次。1uS触发一次,那数据就很好算啊,13us低电平,就13个数据搬到BSRRH,30uS高电平,就再加30个数据搬到BSRRL,2us两个数据,9uS九个数据,算好就可以了
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-4-21 23:56:51 | 显示全部楼层
定时计数器
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-22 09:25:41 | 显示全部楼层
PWM输出
回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2016-4-22 12:28:22 | 显示全部楼层
有没有规律性,如果是有循环规律性,用Timer+DMA+GPIO可以做到非常精准
回复 支持 反对

使用道具 举报

26

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2014-2-10
在线时间
67 小时
 楼主| 发表于 2016-4-22 15:23:59 | 显示全部楼层
本帖最后由 轩辕zh 于 2016-4-22 15:25 编辑
mzwhhwj 发表于 2016-4-22 12:28
有没有规律性,如果是有循环规律性,用Timer+DMA+GPIO可以做到非常精准

嗯,是有规律的,怎么才能做到呢,有没有参考例程,原子哥的代码有符合的吗?还有一点是要实现单线通讯的,谢谢
回复 支持 反对

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2016-4-22 15:28:03 | 显示全部楼层




  离线





94
主题

6146
帖子
12
精华

资深版主

Rank: 8Rank: 8
积分8541金钱8541 注册时间2013-9-10最后登录2016-4-22在线时间57 小时.发消息
.
3#  



发表于 6 小时前 | 只看该作者




PWM输出
回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2016-4-22 15:33:59 | 显示全部楼层
轩辕zh 发表于 2016-4-22 15:23
嗯,是有规律的,怎么才能做到呢,有没有参考例程,原子哥的代码有符合的吗?还有一点是要实现单线通讯的 ...

http://www.openedv.com/thread-46844-1-1.html我这个帖子里有最基本的思路了
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

26

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2014-2-10
在线时间
67 小时
 楼主| 发表于 2016-4-24 21:19:54 | 显示全部楼层
mzwhhwj 发表于 2016-4-22 15:33
http://www.openedv.com/thread-46844-1-1.html我这个帖子里有最基本的思路了

好的
回复 支持 反对

使用道具 举报

26

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2014-2-10
在线时间
67 小时
 楼主| 发表于 2016-5-3 23:21:27 | 显示全部楼层
mzwhhwj 发表于 2016-4-22 15:33
http://www.openedv.com/thread-46844-1-1.html我这个帖子里有最基本的思路了

你好,按你的方案配置好了,但是自己还是没能掌握要领,修改发送的数组还是没能按自己的要求发数据,找到不规律,有些小问题:1.定时器触发DMA后,定时器是不是没有了,DMA在循环不断发数据(因为没有看到你清除DMA传输标志的)
2.DMA发一个数据的时间是多少,怎么算,                      菜鸟一枚,求解惑






#include "sys.h"#include "delay.h"
#include "usart.h"
#include "led.h"

//思想,采用定时器4,定时1us触发DMA,DMA搬数据到IO口,使用的是内存--->内存模式



//驱动GPIOC      PC5
void GPIOC_Init(void)
{

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //PC.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOC.5
GPIO_SetBits(GPIOC,GPIO_Pin_5);                                                 //PC.5 输出高
}





//u32 Gpio_data[4]= {0x0000FFFF,0xFFFF0000,0x0000FFFF,0xFFFF0000};   //待发送的数据
u32 Gpio_data[4]= {0x00000000,0x00000000,0x00000000,0x00000000};   //待发送的数据   弄懂这边的时间
void TMI4_DMA()      //定时器4,与DMA同时配置,当定时器定时到1us触发DMA
{
   DMA_InitTypeDef          DMA_InitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
//   NVIC_InitTypeDef NVIC_InitStructure;
   /* TIMx clock enable */
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
   /* DMAx clock enable */
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   DMA_DeInit(DMA1_Channel7);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(GPIOC->BSRR));           //目标地址
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Gpio_data;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;   //数据传输方向,从内存读取发送到外设
   DMA_InitStructure.DMA_BufferSize = 4;  //DMA通道的DMA缓存的大小
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;     //内存地址寄存器递增
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;   //数据宽度为32位
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;      //数据宽度为32位
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常模式
   DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  //DMA通道 x拥有高优先级
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;          //DMA通道x没有设置为内存到内存传输
   DMA_Init(DMA1_Channel7, &DMA_InitStructure);

//定时器频率为1Mhz   从0定时到1       1us
   TIM_TimeBaseStructure.TIM_Period = 72;         
   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

   TIM_DMACmd(TIM4, TIM_DMA_Update, ENABLE);         //定时器溢出触发DMA
   TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_Update);   //函数配置触发源   定时器更新触发中断
   TIM_Cmd(TIM4, ENABLE);
   DMA_Cmd(DMA1_Channel7, ENABLE);  //使能DMA1 所指示的通道

}















int main(void)
{       
        delay_init();            //延时函数初始化          
        LED_Init();                          //初始化与LED连接的硬件接口         
         GPIOC_Init();  //初始化IO口
         TMI4_DMA();      //配置定时器4与DMA

        while(1)
        {


//if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET)        //判断通道7传输完成
//                                {
//                                        DMA_ClearFlag(DMA1_FLAG_TC7);//清除通道7传输完成标志
//                                        break;

        }
}



问题.png
回复 支持 反对

使用道具 举报

26

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2014-2-10
在线时间
67 小时
 楼主| 发表于 2016-5-7 02:34:52 | 显示全部楼层
mzwhhwj 发表于 2016-5-4 09:10
你定时1uS就不要用内存到内存的模式,应该用Tim4通道,可以Tim4的Update通道,Tim4更新一次,就触发DMA一 ...

好的  谢了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 07:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表