⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 AT91RM9260PMC程序,程序和ATMEL9260EK开发板配套
💻 C
字号:
/*-----------------------------------------------------------------------------
 *           ATMEL Microcontroller Software Support  -  ROUSSET  -
 *-----------------------------------------------------------------------------
 * DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *----------------------------------------------------------------------------
 * File Name           : main.c
 * Object              :
 * Creation            : JPP
 *----------------------------------------------------------------------------
*/
#include "project.h"
#include "led.h"
#include "pmc.h"
#include "dbgu.h"
char message[80];
unsigned int MasterClock;

//*----------------------------------------------------------------------------
//* \fn    Read_Pll_Registe
//* \brief Print PLL information
//*----------------------------------------------------------------------------
unsigned int Read_Pll_Registe( unsigned int pll)
{
	unsigned int div,mul;
	unsigned int clock = 0;

        sprintf (message,"PMC_PLL:0x%08X:",pll); AT91F_DBGU_Printk(message);
        div = pll & 0x000000FF;
        sprintf (message," DIV:%2d ",div); AT91F_DBGU_Printk(message);
        mul = (pll & 0x03FF0000)>>16;
        sprintf (message,"MUL:%4d ",mul); AT91F_DBGU_Printk(message);
        if (div !=0 ) {
			clock = AT91B_MAIN_OSC / div;
			clock = clock * (mul+1);
            sprintf (message,"PLL :%9d",clock); AT91F_DBGU_Printk(message);
	    }
	   AT91F_DBGU_Printk("\n\r");
       return  (clock);
}
//*----------------------------------------------------------------------------
//* \fn    Get_MCK_info
//* \brief Print Main PMC information
//*----------------------------------------------------------------------------
unsigned int Get_MCK_info (void)
{
	unsigned int at_reg,clock,mdiv,Processor_Clock,Processor_Clock_pres;
	unsigned int Clock_PllA=0,Clock_PllB=0;

        // Read PLLA Value
        AT91F_DBGU_Printk("PLLA ");
        Clock_PllA = Read_Pll_Registe(*AT91C_PMC_PLLAR);
        AT91F_DBGU_Printk("PLLB ");
        // Read PLLB Value
        Clock_PllB = Read_Pll_Registe(*AT91C_PMC_PLLBR);

        at_reg = *AT91C_PMC_MCKR;
        sprintf (message,"AT91C_PMC_MCKR:(0x%08X)0x%08X: ",AT91C_PMC_MCKR,at_reg); AT91F_DBGU_Printk(message);

        mdiv= (at_reg >> 8) * 2;
        sprintf (message," MDIV:%d",mdiv); AT91F_DBGU_Printk(message);
        if (mdiv == 0) mdiv =1;

        Processor_Clock_pres= (at_reg & AT91C_PMC_PRES) >> 2;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK   ) Processor_Clock_pres= 1;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_2 ) Processor_Clock_pres= 2;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_4 ) Processor_Clock_pres= 4;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_8 ) Processor_Clock_pres= 8;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_16) Processor_Clock_pres= 16;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_32) Processor_Clock_pres= 32;
        if ((at_reg & AT91C_PMC_PRES) == AT91C_PMC_PRES_CLK_64) Processor_Clock_pres= 64;
        sprintf (message," Processor Clock prescaler:%d\n\r",Processor_Clock_pres); AT91F_DBGU_Printk(message);

        if ((at_reg & AT91C_PMC_CSS) == AT91C_PMC_CSS_PLLB_CLK ) {
			AT91F_DBGU_Printk("PLLB");
			Processor_Clock = Clock_PllB /Processor_Clock_pres;
			}
        if ((at_reg & AT91C_PMC_CSS) == AT91C_PMC_CSS_PLLA_CLK ) {
			AT91F_DBGU_Printk("PLLA");

			Processor_Clock = Clock_PllA /Processor_Clock_pres;
			}
        if ((at_reg & AT91C_PMC_CSS) == AT91C_PMC_CSS_MAIN_CLK ) {
			AT91F_DBGU_Printk("Main");
			Processor_Clock = AT91B_MAIN_OSC /Processor_Clock_pres;
			}
        if ((at_reg & AT91C_PMC_CSS) == AT91C_PMC_CSS_SLOW_CLK ) {
			AT91F_DBGU_Printk("Slow");
			Processor_Clock = AT91B_SLOW_OSC /Processor_Clock_pres;
			}

        sprintf (message,"\n\r Processor Clock:%9d\n\r",Processor_Clock); AT91F_DBGU_Printk(message);
        sprintf (message," Master Clock   :%9d\n\r",Processor_Clock / mdiv); AT91F_DBGU_Printk(message);

        at_reg = *AT91C_CKGR_MCFR;
        if ((at_reg & AT91C_CKGR_MAINRDY) == AT91C_CKGR_MAINRDY) {
			at_reg &= AT91C_CKGR_MAINF;
			clock = (at_reg *AT91B_SLOW_OSC) / 16;
            sprintf (message," Ocilator (CKGR):%9d\n\r",clock ); AT91F_DBGU_Printk(message);
        }
        return (Processor_Clock / mdiv);
}
//*----------------------------------------------------------------------------
//* \fn    AT91F_Write_add
//* \brief
//*----------------------------------------------------------------------------
void AT91F_Write_add(void)
{
	unsigned int value;
	unsigned int *add;

    AT91F_DBGU_Printk("Address ?");
	AT91F_DBGU_scanf("%X",&value);
    add = (unsigned int *) value;

    sprintf (message,"old 0x%08X:0x%08X\n\r",add,*add); AT91F_DBGU_Printk(message);
	AT91F_DBGU_scanf("%X",&value);
	*add=value;
    sprintf (message,"New 0x%08X:0x%08X\n\r",add,*add); AT91F_DBGU_Printk(message);
}


//*----------------------------------------------------------------------------
//* \fn    menu
//* \brief Debug menu
//*----------------------------------------------------------------------------
void menu(char val)
{
	unsigned int value;

        AT91F_PIO_InvertLed(AT91B_POWERLED);

        switch (val) {
        case '0': // Info
        MasterClock= Get_MCK_info();
        AT91F_DBGU_Printk("\n\r");
        value = AT91F_PMC_GetProcessorClock(AT91C_BASE_PMC,AT91C_BASE_CKGR,AT91B_SLOW_OSC);
        sprintf (message,"Processor clock AT91: %d\n\r",value); AT91F_DBGU_Printk(message);

        AT91F_DBGU_Printk("\n\r");
        break;

        case '1':
        sprintf (message,"old 0x%08X:0x%08X\n\r",AT91C_PMC_PLLAR,*AT91C_PMC_PLLAR); AT91F_DBGU_Printk(message);
	    AT91F_DBGU_scanf("%X",&value);
        AT91F_PMC_Change_PPLA(value);
        sprintf (message,"New 0x%08X:0x%08X\n\r",AT91C_PMC_PLLAR,*AT91C_PMC_PLLAR); AT91F_DBGU_Printk(message);

        break;
        case '2':
        sprintf (message,"old 0x%08X:0x%08X\n\r",AT91C_PMC_PLLBR,*AT91C_PMC_PLLBR); AT91F_DBGU_Printk(message);
	     AT91F_DBGU_scanf("%X",&value);
        AT91F_PMC_Change_PPLB(value);
        sprintf (message,"New 0x%08X:0x%08X\n\r",AT91C_PMC_PLLBR,*AT91C_PMC_PLLBR); AT91F_DBGU_Printk(message);
        break;
        case '3':
        MasterClock = AT91F_PMC_SwitchMasterClock(AT91C_PMC_CSS_PLLB_CLK);
        AT91F_DBGU_Change_Speed(MasterClock);
        break;
        case '4':
        MasterClock = AT91F_PMC_SwitchMasterClock(AT91C_PMC_CSS_PLLA_CLK);
        AT91F_DBGU_Change_Speed(MasterClock);
        break;
        case '5':
        MasterClock = AT91F_PMC_SwitchMasterClock(AT91C_PMC_CSS_MAIN_CLK);
        AT91F_DBGU_Change_Speed(MasterClock);
        break;
        case '6':
        MasterClock = AT91F_PMC_SwitchMasterClock(AT91C_PMC_CSS_SLOW_CLK);
        break;
        case '7':
        AT91F_Write_add();
        break;

        default:
        break;
	    }// End Switch

    AT91F_DBGU_Printk("Done\n\r");

}

//*----------------------------------------------------------------------------
//* Function Name       : main
//* Object              : Main function
//* Input Parameters    : none
//* Output Parameters   : True
//*----------------------------------------------------------------------------*/
int main(void)
{
	char val;
	unsigned int value;

    // Init DBGU
        AT91F_DBGU_Init();
    // Print to consol
        AT91F_DBGU_Printk("\n\r==============================\n\r");
        AT91F_DBGU_Printk("AT91SAM9260 Data Flash example\n\r");
        AT91F_DBGU_Printk("==============================\n\r");

        AT91F_PMC_Change_PPLB(0x00ACBF20);
    // Init Led AND Switch
        AT91F_PIO_Init();
        MasterClock = Get_MCK_info();

        value = AT91F_PMC_GetProcessorClock(AT91C_BASE_PMC,AT91C_BASE_CKGR,AT91B_SLOW_OSC);
        sprintf (message,"Processor clock: %d\n\r",value); AT91F_DBGU_Printk(message);

        AT91F_DBGU_Printk("\n\r0) Info\n\r1) Write PLLA\n\r2) Write PLLB\n\r3) To PLLB \n\r4) To PLLA \n\r5) To Main\n\r6) Slow \n\rEnter:");


    for (;;)
    {
		if (AT91F_DBGU_Get(&val)) {
                 menu(val);
        }
        AT91F_PIO_InvertLed(AT91B_LED1);

        if (MasterClock >= 50000)
            AT91F_PIO_Wait(AT91B_MASTER_CLOCK/1000);
        else // For slow clock
            AT91F_PIO_Wait(500);

    }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -