OpenEdv-开源电子网

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

我想用DMA不停的给GPIOA5口拉高拉低,可是不知道问题出在哪里

[复制链接]

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
发表于 2016-10-14 12:16:17 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 vention 于 2016-10-14 23:33 编辑

我赋值了数组Buffer; 然后 DMA上地址也是写着 &GPIOA->BSRR 这个寄存器,开启DMA循环给寄存器赋值,这样子做应该没有错吧。可是我看不出哪里有问题,错在了哪里,逻辑分析仪上 PA5端口却不是高低高低 变化,PA9也没有高低变化
{17A10E6A-393B-4B04-A1FF-48C757A68EF4}.png

最佳答案

查看完整内容[请看2#楼]

楼主你程序两个主要问题是: 1. PA5应该设置Out_PP而不是AF_PP。 2. BSRR是个32位寄存器,DMA的DataSize要用Word,同时Buffer数组定义成32位的。 下次贴文本吧不要截图,不然想试一下比较麻烦。 [mw_shl_code=cpp,true] GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; DMA_InitTypeDef DMA_Init ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-14 12:16:18 | 显示全部楼层
楼主你程序两个主要问题是:
1. PA5应该设置Out_PP而不是AF_PP。
2. BSRR是个32位寄存器,DMA的DataSize要用Word,同时Buffer数组定义成32位的。

下次贴文本吧不要截图,不然想试一下比较麻烦。

[mw_shl_code=cpp,true]
GPIO_InitTypeDef            GPIO_InitStructure;
TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;
TIM_OCInitTypeDef           TIM_OCInitStructure;
DMA_InitTypeDef             DMA_InitStructure;

const uint32_t Buffer[] = {1 << (5),
                           1 << (5 + 16),
                           1 << (5 + 16),
                           1 << (5)};

int main (void)
{
    SystemCoreClockConfigure();
    SystemCoreClockUpdate();
   
    GPIO_StructInit(&GPIO_InitStructure);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_OCStructInit(&TIM_OCInitStructure);
    DMA_StructInit(&DMA_InitStructure);
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseStructure.TIM_Period = 100;
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 250) - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
    TIM_OCInitStructure.TIM_Pulse = 1;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);
    TIM_Cmd(TIM1, ENABLE);

    DMA_DeInit(DMA1_Channel2);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(GPIOA->BSRR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = 4;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel2, &DMA_InitStructure);
   
    DMA_Cmd(DMA1_Channel2, ENABLE);

    while(1);
}
[/mw_shl_code]

淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-10-14 13:54:36 | 显示全部楼层
我想回答你的问题,可是不知道你的问题是什么
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2016-8-8
在线时间
101 小时
发表于 2016-10-14 14:16:09 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-10-14 13:54
我想回答你的问题,可是不知道你的问题是什么

这个回答好。
如何拿下蒙住眼的树叶。
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2016-10-14 23:33:06 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-10-14 13:54
我想回答你的问题,可是不知道你的问题是什么

我以为题目说清楚了。  就是我已经 赋值了数值Buffer; 然后 DMA上地址也是写着 &GPIOA->BSRR 这个寄存器,开启DMA循环给寄存器赋值,这样子做应该没有错吧。可是我看不出哪里有问题,错在了哪里,逻辑分析仪上 PA5端口却不是高低高低 变化,PA9也没有高低变化
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-10-15 01:39:31 | 显示全部楼层
vention 发表于 2016-10-14 23:33
我以为题目说清楚了。  就是我已经 赋值了数值Buffer; 然后 DMA上地址也是写着 &GPIOA->BSRR 这个寄存器 ...

你看看BSRR寄存器是干嘛的,你填写的数据是什么,没对比就没有伤害,建议你搬到ODR寄存器去
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
发表于 2016-10-15 09:01:51 | 显示全部楼层
               
              
         
越努力,越优秀;越独立,越自由
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-10-15 09:45:46 | 显示全部楼层
不清楚寄存器就不乱来,哎,BSRR寄存器设置不鸟低电平的,换去ODR十有八九你还设置了别的IO口输出,会影响别的IO口
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-15 09:51:58 | 显示全部楼层
八度空间 发表于 2016-10-15 01:39
你看看BSRR寄存器是干嘛的,你填写的数据是什么,没对比就没有伤害,建议你搬到ODR寄存器去

BSRR写低16位控制高电平,写高16位控制低电平,有什么问题么?
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2016-10-15 09:59:20 | 显示全部楼层
憨厚诚实大叔 发表于 2016-10-15 09:45
不清楚寄存器就不乱来,哎,BSRR寄存器设置不鸟低电平的,换去ODR十有八九你还设置了别的IO口输出,会影响 ...

BSRR 全称叫做 Bit Set/Reset Register……
只是因为有 BRR 了,所以通常不怎么用 BSRR 的高16位……
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2016-10-15 10:00:47 | 显示全部楼层
K.O.Carnivist 发表于 2016-10-15 09:54
楼主你程序两个主要问题是:
1. PA5应该设置Out_PP而不是AF_PP。
2. BSRR是个32位寄存器,DMA的DataSize ...

对哦,大意的直接把PA5 和TIM1的几个口放一起写了 。 还有用了半字,怎么自己没看出来。
回复

使用道具 举报

83

主题

217

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
 楼主| 发表于 2016-10-15 10:03:00 | 显示全部楼层
本帖最后由 vention 于 2016-10-15 10:04 编辑
憨厚诚实大叔 发表于 2016-10-15 09:45
不清楚寄存器就不乱来,哎,BSRR寄存器设置不鸟低电平的,换去ODR十有八九你还设置了别的IO口输出,会影响 ...

手册上写着 BSRR高16位和低16位的用法啊。不会错的啊
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-10-15 10:16:15 | 显示全部楼层
vention 发表于 2016-10-15 10:03
手册上写着 BSRR高16位和低16位的用法啊。不会错的啊

好吧,我也去看了下,高16位不常用,忘记了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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