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采集目的。
你确定 "Data Width "选项是Word?我AD一直选的HalfWord nasty-2024300 发表于 2019-4-9 17:45
你确定 "Data Width "选项是Word?我AD一直选的HalfWord
标准套路应该选HalfWord。
但是用Word也不见得有问题,F466的ADC_DR寄存器高16位无效,只低16位有用。
本来外设和内存都用一个HalfWord就够了,用Word无非是浪费一点点内存资源。 toofree 发表于 2019-4-9 18:51
标准套路应该选HalfWord。
但是用Word也不见得有问题,F466的ADC_DR寄存器高16位无效,只低16位有用。
本 ...
哈哈,你只考虑了AD长度,在我这个工程里用Word肯定没错,half Word倒是不一定没错。关于这个参数,论坛说的很多了,其实到底怎么选,是由库决定的,借用别人总结的一句话“你只需要关心数据要存放的起始地址、自己每次搬运数据的宽度、单轮循环搬运的次数”就够了 nasty-2024300 发表于 2019-4-9 17:45
你确定 "Data Width "选项是Word?我AD一直选的HalfWord
我不确定,你只要确定你的最后结果是对的就行了,如果参数唯一的,CubeMX就不用让你选择了 楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circular 模式有什么区别。我昨天测试ADC单通道+DMA采集用的是Normal模式,看了一下AD采集的波形是正确的 nasty-2024300 发表于 2019-4-10 10:20
楼主有没有PWM 控制采样频率,ADC双通道+DMA传输模式的Demo?有的话可以共享一下吗?还有 Normal 和 Circula ...
多看手册,每个参数都有很详细的描述。并且也是最准确和正确的来源。简单来说,Normal模式下,接收满了,就停止,不再搬运,下次要接收,就得继续调用;而Circular模式下,会一直搬运下去。既然你都确定波形是对的,那就不要怀疑你的对错了。还有看来手册也不太懂参数什么意义的时候,可以自己测试看看啊,改改参数跑一跑,只要没不是最后的产品烧写版本,你都可以随便试,试了更加加深印象:D:D:D
受教了,谢谢楼主!:handshake 感谢分享 收藏,多谢楼主,一直没搞清楚
页:
[1]