硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4506|回复: 5
收起左侧

ADC+DMA配置时,不懂ST的例子为何要#define一个地址常量。推翻它换个方式写

[复制链接]

760

主题

1052

回帖

3337

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3337
发表于 2015-10-6 16:19:37 | 显示全部楼层 |阅读模式
今天在整理 bsp_adc_dso.c 和 bsp_dac_wave文件。每次做ADC,DAC移植,总是头疼ADC, DAC的数据寄存器地址是多少。
ST固件库中例子是这样定义DMA地址的:
1. 在文件开头 #define ADC1_DR_ADDRESS    ((uint32_t)0x4001204C)  
2. 配置DMA时, DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;

当你知道ADC1是这个数字,能猜到ADC3的吗,几乎不可能,因为整数的写法太不直观了。
初学者如果折腾一个小时能够找出来的话,就算是很不错了。

我们其实可以不用再#define 这个整数了,因为固件库中本来就有定义。
我们这样写: DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
举一反三, ADC2的和ADC3的自然就是 : (uint32_t)&ADC2->DR,  (uint32_t)&ADC3->DR

我们来分析一下为什么这样写就可以。在 stm32f4xx.h文件,几个重要的定义如下:

adc.png

同样的事情,DAC的固件库例子也是同样的问题。
ST的写法:
#define DAC_DHR12R2_ADDRESS    0x40007414
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_ADDRESS ;
我们的写法:(不用define)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R2;
如果是DAC1, 就是 (uint32_t)&DAC->DHR12R1
回复

使用道具 举报

2

主题

76

回帖

82

积分

初级会员

积分
82
发表于 2015-10-8 10:03:34 | 显示全部楼层
貌似不错,赞一个
回复

使用道具 举报

3

主题

54

回帖

63

积分

初级会员

积分
63
发表于 2015-10-8 10:34:00 | 显示全部楼层
不错。[s:141]
回复

使用道具 举报

116

主题

800

回帖

1148

积分

至尊会员

积分
1148
QQ
发表于 2015-10-8 10:44:37 | 显示全部楼层
支持[s:149] [s:149] [s:149] [s:149] [s:149]
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-10-8 11:16:26 | 显示全部楼层
哈哈 早就这么用了  st的库作者怎么就没想到呢嘿嘿嘿
回复

使用道具 举报

1

主题

3

回帖

1

积分

新手上路

积分
1
发表于 2016-7-20 15:54:09 | 显示全部楼层
有帮助,[s:152]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 02:34 , Processed in 0.048951 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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