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

查看: 3276|回复: 9

[STM32F446] cubeMAX配置双通道ADC+dma(一)

[复制链接]

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2018-11-12 10:59:43 | 显示全部楼层 |阅读模式
本帖最后由 数码小叶 于 2018-11-12 10:58 编辑

      因为最近的项目要采集调制解调的IQ两路信号,并且进行FFT处理,刚好手边有块NUCELO F446RE,看了下配置180 MHz主频、512 KB闪存、128 KB的SRAM,有FPU单元,可以更好的进行FFT运算,于是就拿这块板子来开发。
中间走了很多弯路,不过最后还是顺利搞定了,所以还是写个贴子,免得以后再走弯路。
      首先,打开cubeMAX先建工程,选择对应板卡,这里点选yes
Snipaste_2018-11-10_15-24-01.png
会自动配置好nucleo板子的串口、LED、按键、调试口,这样可以直接使用板载资源了。
然后进时钟,直接跑到最高频率,180MHz
Snipaste_2018-11-10_15-30-20.png


因为需要两路AD,这里选择了AD1的通道10和11,因为刚好对应板子的PC0、PC1,刚好在板载的最左下角。
Snipaste_2018-11-10_15-31-53.png


再配置ADC,需要设置的参数比较多。

Snipaste_2018-11-10_15-51-03.png

这里主要注意Scan Conversion Mode和Continuous Conversion Mode这个组合:
Scan=0,Con=0,是单次单通道转换;
Scan=0,Con=1,是连续单通道转换;
Scan=1,Con=0,是单次序列通道转换;
Scan=1,Con=1,是连续序列通道转换。
STM32的AD组合能说是相当的丰富,这还只是单ADC,这里就不展开了。其它的参数都很好配置,DMA连续请求,配置两个对应通道。配置完成后,使能DMA中断
Snipaste_2018-11-10_15-56-57.png
Snipaste_2018-11-10_15-57-49.png


模式选择循环转换模式,数据类型选字类型。到这就配置完成了,就可以生成工程了。
这里建议把这个勾选上,不然到后面,main文件实在是太大了
Snipaste_2018-11-10_20-22-58.png

到此为止,ADC和DMA就配置好了,不过为了直观的观察结果,还得把串口调通,因为之前cubeMAX已经配置了nucleo默认的串口,所以这里可以直接使用,但是要重定向一下,重定向有两个函数
#ifdef __GNUC__  
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  
#else  
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  
#endif /* __GNUC__ */  

PUTCHAR_PROTOTYPE  
{  
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0x0001);  
  return ch;  
}  
或者
#pragma import(__use_no_semihosting)                             
struct __FILE {
    int handle;
};

FILE __stdout;         
void _sys_exit(int x)
{
        x = x;
}

int fputc(int ch, FILE *f){      
    while((USART2->SR&0X40)==0);
    USART2->DR = (uint8_t) ch;      
    return ch;
}
推荐后者,前者需要使用微库,不然会循环卡死
Snipaste_2018-11-10_20-28-28.png

最后启动AD

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 240);
因为实际需要240个采样点,所以参数是240。最后串口打印结果
Snipaste_2018-11-10_20-33-39.png


到这就实现了最初的ADC采集目的。

回复

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2020-7-22
发表于 2019-4-9 17:45:49 | 显示全部楼层
你确定 "Data Width "选项是Word?我AD一直选的HalfWord
回复 支持 反对

使用道具 举报

48

主题

3559

回帖

429

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2019-4-9 18:51:40 | 显示全部楼层
nasty-2024300 发表于 2019-4-9 17:45
你确定 "Data Width "选项是Word?我AD一直选的HalfWord

标准套路应该选HalfWord。
但是用Word也不见得有问题,F466的ADC_DR寄存器高16位无效,只低16位有用。
本来外设和内存都用一个HalfWord就够了,用Word无非是浪费一点点内存资源。
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2019-4-9 21:07:45 | 显示全部楼层
toofree 发表于 2019-4-9 18:51
标准套路应该选HalfWord。
但是用Word也不见得有问题,F466的ADC_DR寄存器高16位无效,只低16位有用。
本 ...

哈哈,你只考虑了AD长度,在我这个工程里用Word肯定没错,half Word倒是不一定没错。关于这个参数,论坛说的很多了,其实到底怎么选,是由库决定的,借用别人总结的一句话“你只需要关心数据要存放的起始地址、自己每次搬运数据的宽度、单轮循环搬运的次数”就够了
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2019-4-9 21:10:58 | 显示全部楼层
nasty-2024300 发表于 2019-4-9 17:45
你确定 "Data Width "选项是Word?我AD一直选的HalfWord

我不确定,你只要确定你的最后结果是对的就行了,如果参数唯一的,CubeMX就不用让你选择了
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2020-7-22
发表于 2019-4-10 10:20:56 | 显示全部楼层
楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circular 模式有什么区别。我昨天测试ADC单通道+DMA采集用的是Normal模式,看了一下AD采集的波形是正确的
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2019-4-10 21:20:14 | 显示全部楼层
nasty-2024300 发表于 2019-4-10 10:20
楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circula ...

Snipaste_2019-04-10_21-02-12.png

多看手册,每个参数都有很详细的描述。并且也是最准确和正确的来源。简单来说,Normal模式下,接收满了,就停止,不再搬运,下次要接收,就得继续调用;而Circular模式下,会一直搬运下去。既然你都确定波形是对的,那就不要怀疑你的对错了。还有看来手册也不太懂参数什么意义的时候,可以自己测试看看啊,改改参数跑一跑,只要没不是最后的产品烧写版本,你都可以随便试,试了更加加深印象
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2020-7-22
发表于 2019-4-11 14:49:17 | 显示全部楼层
受教了,谢谢楼主!
回复 支持 反对

使用道具 举报

0

主题

87

回帖

0

蝴蝶豆

初级会员

最后登录
2019-12-8
发表于 2019-4-18 01:17:11 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

6

主题

930

回帖

133

蝴蝶豆

金牌会员

最后登录
2020-12-9
发表于 2019-4-18 10:19:34 | 显示全部楼层
收藏,多谢楼主,一直没搞清楚
回复 支持 反对

使用道具 举报

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