OpenEdv-开源电子网

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

想用TIM2触发DMA实现GPIO口的快速存储

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-1-13
在线时间
0 小时
发表于 2015-3-9 15:10:10 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]//定时器2通道2输入捕获配置 //arr:自动重装值(TIM2,TIM5是32位的!!) //psc:时钟预分频数 TIM_ICInitTypeDef TIM2_ICInitStructure; void TIM2_CH2_Cap_Init(u32 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM2时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTA时钟 TIM_DeInit(TIM2); //数据总线使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //GPIOB GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA1 //产生捕获源 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0 //时钟脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIOA1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2); //PA1复用位定时器2 TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //初始化TIM2输入捕获参数 TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC2S=01 选择输入端 IC1映射到TI1上 TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕获 TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波 TIM_ICInit(TIM2, &TIM2_ICInitStructure); //产生DMA请求信号 TIM_DMACmd(TIM2, TIM_DMA_CC2, ENABLE); //打开定时器 TIM_Cmd(TIM2, ENABLE); } unsigned short SendBuff[1024]; void MYDMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能 DMA_DeInit(DMA1_Stream6); while (DMA_GetCmdStatus(DMA1_Stream6) != DISABLE){}//等待DMA可配置 /* 配置 DMA Stream */ DMA_InitStructure.DMA_Channel = DMA_Channel_3; //通道选择 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&GPIOB->IDR;//DMA外设地址 DMA_InitStructure.DMA_Memory0BaseAddr = (u32)SendBuff;//DMA 存储器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设模式到存储器 DMA_InitStructure.DMA_BufferSize = 1;//数据传输量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//中等优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输 DMA_Init(DMA1_Stream6, &DMA_InitStructure);//初始化DMA Stream DMA_Cmd(DMA1_Stream6,ENABLE); } int main(void) { delay_init(168); //初始化延时函数 uart_init(115200);//初始化串口波特率为115200 TIM2_CH2_Cap_Init(256,0); //以xMhz的频率计数 MYDMA_Config();//DMA1,STEAM6,CH3,外设为TIM2,存储器为 SendBuff,长度为:1 while(1) { //捕获源 delay_us(100); GPIO_ResetBits(GPIOA, GPIO_Pin_3); delay_us(100); GPIO_SetBits(GPIOA, GPIO_Pin_3); } } [/mw_shl_code]
请问大家这段代码哪还有问题,我用KEIL调试,watch窗口监视SendBuff,没数据搬用进来

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-9 22:56:42 | 显示全部楼层
说明你的配置还有问题,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-1-13
在线时间
0 小时
 楼主| 发表于 2015-3-10 09:24:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
 _ _# DMA实在不好调试,很不直观。请问原子哥 ,GPIO的IDR寄存器是属于外设还是内存 ?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-10 23:00:27 | 显示全部楼层
回复【3楼】江湖小小酥:
---------------------------------
可以当内存用.实际上是外设,但是DMA没有单独考虑GPIO.所以按内存处理.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-3-14 19:04:16 | 显示全部楼层
我現在也遇到這個問題...
使用TIM2_UP當DMA請求 想直接丟資料到GPIO->ODR
可是DMA1外設地址是否沒法設定成儲存器地址(GPIO->ODR算存儲地址?)

這要怎麼搞...
回复

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2013-5-14
在线时间
3 小时
发表于 2016-6-8 08:51:09 | 显示全部楼层
civic7366 发表于 2016-3-14 19:04
我現在也遇到這個問題...
使用TIM2_UP當DMA請求 想直接丟資料到GPIO->ODR
可是DMA1外設地址是否沒法設定 ...

解决了没?
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-9-18
在线时间
13 小时
发表于 2016-10-25 18:15:54 | 显示全部楼层
正点原子 发表于 2015-3-10 23:00
回复【3楼】江湖小小酥:
---------------------------------
可以当内存用.实际上是外设,但是DMA没有单独考 ...

我现在正在STM32F407上做这类似的工作。就是想通过DMA来实现对GPIO引脚电平高低的控制 。这方面的代码也看了几个了。但是却没有行的通的。最终也没能在引脚上看到波形的出现。 头要炸了。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2016-8-28
在线时间
20 小时
发表于 2016-10-25 18:57:25 | 显示全部楼层
lh8008 发表于 2016-10-25 18:15
我现在正在STM32F407上做这类似的工作。就是想通过DMA来实现对GPIO引脚电平高低的控制 。这方面的代码也 ...

我有TIM1触发的,TIM1触发读摄像头的
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-9-18
在线时间
13 小时
发表于 2016-10-26 10:13:22 | 显示全部楼层
爬上阁楼的鱼 发表于 2016-10-25 18:57
我有TIM1触发的,TIM1触发读摄像头的

请教一下,通过DMA 来访问普通GPIO的数据,是并行访问还是串行访问?
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-3-16
在线时间
4 小时
发表于 2017-5-7 09:15:49 | 显示全部楼层
爬上阁楼的鱼 发表于 2016-10-25 18:57
我有TIM1触发的,TIM1触发读摄像头的

你好,程序能让我看下吗
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2017-7-31 16:42:58 | 显示全部楼层
楼主有解决吗,我现在也想间接io触发dma实现摄像头数据读取。。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-12-21
在线时间
5 小时
发表于 2019-2-23 16:19:29 | 显示全部楼层
lh8008 发表于 2016-10-26 10:13
请教一下,通过DMA 来访问普通GPIO的数据,是并行访问还是串行访问?

你好,请问问题解决了吗?可以分享一下思路吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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