数码小叶 发表于 2018-11-12 10:59:43

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

本帖最后由 数码小叶 于 2018-11-12 10:58 编辑

      因为最近的项目要采集调制解调的IQ两路信号,并且进行FFT处理,刚好手边有块NUCELO F446RE,看了下配置180 MHz主频、512 KB闪存、128 KB的SRAM,有FPU单元,可以更好的进行FFT运算,于是就拿这块板子来开发。
中间走了很多弯路,不过最后还是顺利搞定了,所以还是写个贴子,免得以后再走弯路。
      首先,打开cubeMAX先建工程,选择对应板卡,这里点选yes

会自动配置好nucleo板子的串口、LED、按键、调试口,这样可以直接使用板载资源了。
然后进时钟,直接跑到最高频率,180MHz



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



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



这里主要注意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中断




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


到此为止,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;
}推荐后者,前者需要使用微库,不然会循环卡死


最后启动AD
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 240);因为实际需要240个采样点,所以参数是240。最后串口打印结果



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

nasty-2024300 发表于 2019-4-9 17:45:49

你确定 "Data Width "选项是Word?我AD一直选的HalfWord

toofree 发表于 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无非是浪费一点点内存资源。

数码小叶 发表于 2019-4-9 21:07:45

toofree 发表于 2019-4-9 18:51
标准套路应该选HalfWord。
但是用Word也不见得有问题,F466的ADC_DR寄存器高16位无效,只低16位有用。
本 ...

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

数码小叶 发表于 2019-4-9 21:10:58

nasty-2024300 发表于 2019-4-9 17:45
你确定 "Data Width "选项是Word?我AD一直选的HalfWord

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

nasty-2024300 发表于 2019-4-10 10:20:56

楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circular 模式有什么区别。我昨天测试ADC单通道+DMA采集用的是Normal模式,看了一下AD采集的波形是正确的

数码小叶 发表于 2019-4-10 21:20:14

nasty-2024300 发表于 2019-4-10 10:20
楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circula ...



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

nasty-2024300 发表于 2019-4-11 14:49:17

受教了,谢谢楼主!:handshake

zxcv1ddd 发表于 2019-4-18 01:17:11

感谢分享

Kevin201707 发表于 2019-4-18 10:19:34

收藏,多谢楼主,一直没搞清楚
页: [1]
查看完整版本: cubeMAX配置双通道ADC+dma(一)