LPC4370 ACDHS speed and DMA

LPC4370 ACDHS speed

AHB clock BASE_M4_CLK CLK_M4_ADCHS up to 204 MHz. For register interface.

ADCHS clock BASE_ADCHS_CLK CLK_ADCHS up to 80MHz For conversion rate.

How do I set up the BASE_M4_CLK or the AHB clocks for high speed ADC?

How do I verify the BASE_ADCHS_CLK is running (204Mhz ) fast enough for 80Msample?

But in reality, the HSADC clock structure is very simple and can be setup by directly setting the HSADC base clock with this one function:

Chip_Clock_SetBaseClock(CLK_BASE_ADCHS, BaseClock_XXXX, true, false);

You can attach the HSADC base clock to any of the following clock inputs:

复制代码
/**
 * @brief CGU clock input list
 * These are possible input clocks for the CGU and can come
 * from both external (crystal) and internal (PLL) sources. These
 * clock inputs can be routed to the base clocks (@ref CHIP_CGU_BASE_CLK_T).
 */
typedef enum CHIP_CGU_CLKIN {
    CLKIN_32K,        /*!< External 32KHz input */
    CLKIN_IRC,        /*!< Internal IRC (12MHz) input */
    CLKIN_ENET_RX,    /*!< External ENET_RX pin input */
    CLKIN_ENET_TX,    /*!< External ENET_TX pin input */
    CLKIN_CLKIN,    /*!< External GPCLKIN pin input */
    CLKIN_RESERVED1,
    CLKIN_CRYSTAL,    /*!< External (main) crystal pin input */
    CLKIN_USBPLL,    /*!< Internal USB PLL input */
    CLKIN_AUDIOPLL,    /*!< Internal Audio PLL input */
    CLKIN_MAINPLL,    /*!< Internal Main PLL input */
    CLKIN_RESERVED2,
    CLKIN_RESERVED3,
    CLKIN_IDIVA,    /*!< Internal divider A input */
    CLKIN_IDIVB,    /*!< Internal divider B input */
    CLKIN_IDIVC,    /*!< Internal divider C input */
    CLKIN_IDIVD,    /*!< Internal divider D input */
    CLKIN_IDIVE,    /*!< Internal divider E input */
    CLKINPUT_PD        /*!< External 32KHz input */
} CHIP_CGU_CLKIN_T;
复制代码

Connect the 204MHz main PLL to a divider input, set the divider to 3, and use the divider for the HSADC base clock.

Gives 204 / 3 = 68Mhz. Just make sure you aren't using those dividers for anything else!

Chip_Clock_SetDivider(CLK_IDIV_A, CLKIN_MAINPLL, 3); /* Setup divider A for main PLL rate divided by 3 */
Chip_Clock_SetBaseClock(CLK_BASE_ADCHS, CLKIN_IDIVA, true, false); /* HSADC base clock = divider A input */

 

Use the USB PLL rate (typically 480MHz) with a divide by 6 to get 80MHz. (Note different dividers have different maximum divider values)

Chip_USB0_Init(); /* Sets USB PLL to 480Mhz */
Chip_Clock_SetDivider(CLK_IDIV_D, CLKIN_USBPLL, 6); /* Setup divider D for USB PLL rate divided by 6 */
Chip_Clock_SetBaseClock(CLK_BASE_ADCHS, CLKIN_IDIVD, true, false); /* HSADC base clock = divider D input */

 

I think you might not be getting 20 MHz you will be getting 2MHz, as the only divider that can be sourced from USB0PLL is Divider A

(Max divider value supported by DIV_A is 4), if you attempt to source others [DIV_B to DIV_D] from USB0PLL it will default to IRC (12MHz).

Hence you will get "IRC CLK"/6 as the output. To get 80 MHz you can try the following

Chip_USB0_Init(); /* Initialize the USB0 PLL to 480 MHz */
Chip_Clock_SetDivider(CLK_IDIV_A, CLKIN_USBPLL, 2); /* Source DIV_A from USB0PLL, and set divider to 2 (Max div value supported is 4) [IN 480 MHz; OUT 240 MHz */
Chip_Clock_SetDivider(CLK_IDIV_B, CLKIN_IDIVA, 3); /* Source DIV_B from DIV_A, [IN 240 MHz; OUT 80 MHz */
Chip_Clock_SetBaseClock(CLK_BASE_ADCHS, CLKIN_IDIVB, true, false); /* Source ADHCS base clock from DIV_B */
Chip_Clock_EnableOpts(CLK_ADCHS, true, true, 1); /* Enable the clock */

480MHZ / 2 / 3 = 80 MHZ
Chip_Clock_GetRate(CLK_ADCHS); 

 

Finally I've got some adequate results. ADCHS clock is 80MHz, but sample rate is only 40Msps, not 80Msps as I expected.

Chip_Clock_EnableOpts(CLK_ADCHS, true, true, 1); /* Enable the clock */

 

 

Every time I've tried to set SAMPLERATE to values more than 4000000 - UART stopped working.

Is it real to get 80Msps?

The original hsadc.c file used TIMER1 to trigger a software event to trigger to start the ADC.

In my modification I tried to us the TIMMER1 to stop the ADC sampling but it did not work.

I found that there were too many IRQ events (with higher priority than the UART) causing the UART not to get service

and also the descriptor would not update.

I left the code in and set the SAMPLERATE to 100 which cause TIMER1 to file every 10ms.

I used this to toggle GPIO port 3 bit 7 for testing.

 

 

 

 

 

 

 

 

1111111111111

 

posted @   IAmAProgrammer  阅读(1192)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2014-10-19 How to make a combo box with fulltext search autocomplete support?
2014-10-19 TSearch & TFileSearch Version 2.2 -Boyer-Moore-Horspool search algorithm
2014-10-19 正确使用 C++Builder组件缩写代码
点击右上角即可分享
微信分享提示