|
本帖最后由 tomzbj 于 2022-6-26 16:20 编辑
前两天试了一下用GD32的一组8位GPIO接成R2R DAC做DDS
https://www.amobbs.com/thread-5767262-1-1.html
之后想到如果只需要方波的话, 用SPI的MOSI就可以了. 256字节的波形表不需要了, 只需要32字节的输出缓冲区, DMA循环输出, 正好是256比特.
DMA的半满和全满中断改成这样, 循环展开是必须的, 否则实在太慢.
- void DS_DMA_FTF(void)
- {
- for(register int i = 0; i < 16; i++) {
- dma_tab[i + 16] = 0;
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 7);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 6);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 5);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 4);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 3);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 2);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 1);
- counter += step;
- dma_tab[i + 16] |= ((counter >> 31) << 0);
- }
- }
- void DS_DMA_HTF(void)
- {
- for(register int i = 0; i < 16; i++) {
- dma_tab[i] = 0;
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 7);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 6);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 5);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 4);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 3);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 2);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 1);
- counter += step;
- dma_tab[i] |= ((counter >> 31) << 0);
- }
- }
复制代码
实测这两个中断子程序需要470个时钟周期左右, SPI时钟用主频的四分频, 128*4=512, 稍微有点紧张, 用8分频就很宽松了.
其他基本不变, 把涉及dac的部分改成spi就完事.
实测在200M左右的GD32上输出几百k的方波, 波形相当稳, 输出几M时就比较抖了.
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|