新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > NEC V850 之 系統時鐘及內部設備時鐘

        NEC V850 之 系統時鐘及內部設備時鐘

        作者: 時間:2016-12-03 來源:網絡 收藏
        首先說明下,之前沒有搞時鐘就開始看I/O口還有外部中斷是不對的。幸好發現的不晚,現在把這必須的一課給補上。如果連時鐘都搞不明白,下面的外設是肯定沒法弄的。另外放棄了原來做一個總體程序包的想法,主要是太浪費時間了,完成一個器件的驅動還要想把他無縫的添加到原來的程序結構里去,現在不是做這個工作的時候,需要快速的把測試完成,然后上系統去調試。

        下面開始正題,V850的時鐘還是比較饒人的,需要仔細的去讀datasheet,另外我到現在還有無法理解的地方在datasheet上面。下圖是系統時鐘框圖:(紅色的圈里就是不理解的地方,不知道在哪個地方設置)

        本文引用地址:http://www.104case.com/article/201612/325099.htm
        下面我會把代碼和示波器測量的截圖發出來。先是代碼:

        代碼出處 system.c

        void SystemClkInit( void )
        {
        unsigned char psval = 0;

        VSWC = CG_VSWC_VALUE; // 設置 內部外圍功能控制寄存器 值為17
        /* Set main system clock */
        OSTS = CG_OSCSTAB_SEL16; // 設置 晶振穩定時間選擇寄存器 值為0x06(2^16/fx),為下面檢測OSTC做準備
        psval = CG_CPUCLK_MAINFEEDBACK | CG_CPUCLK_SUBNOTFEED | CG_CPUCLK_MAINENABLE;
        PRCMD = psval;
        PCC = psval; // 設置 MCU時鐘控制寄存器 值為0x80,禁止子時鐘振蕩器,使能主時鐘振蕩器
        while (!(OSTC || 0x00)) // 檢測 晶振穩定時間狀態寄存器 的最低為是不是為1(晶振震蕩以穩定)
        {
        ;
        }
        PLLS = CG_PLLLOCKUP_SEL1; // 設置 鎖相環鎖定時間規格寄存器 值為0x03(2^13/fX (default value)),為下面檢測LOCKR做準備
        PLLON = 1; // 設置 PLLCTL鎖相環控制寄存器 最低位為1,使能鎖相環啟動
        while (LOCKR && 0x01) // 檢測 鎖相環鎖定狀態寄存器 的最低為是不是為0(鎖相環以鎖定)
        {
        ;
        }
        psval = CG_MAINSYS_MAINOSC;
        PRCMD = psval;
        MCM = psval; // 設置 系統主時鐘方式寄存器 值為0x01(設定主時鐘源非內部高速振蕩源)
        SELPLL = 1; // 設置 PLLCTL鎖相環控制寄存器 的次低位為1,與MCM寄存器配合設置主時鐘通過鎖相環倍頻
        /* Set fCPU */
        psval = PCC | CG_CPUCLK_MAIN0; // 設置 系統主時鐘的分頻系數,對內部設備時鐘沒有任何影響,仍然為32MHz
        PRCMD = psval;
        PCC = psval; // 設置 MCU時鐘控制寄存器 的低4位,設置分頻系數
        RCM = CG_RCM_INITIALVALUE | CG_LOWCLK_STOP | CG_HICLK_STOP;//設置 內部振蕩器模式寄存器 值為0x83,關閉內部高速,低速振蕩源
        /* Set fXP1 */
        SELCNT4 = CG_SELCNT4_FXX; // 設置 選擇控制寄存器4 值為0x00,選擇時鐘源為fxx
        /* Set fBRG */
        PRSM0 = CG_PRESCALER3_DISABLE; // 設置 預分頻3方式寄存器 值為0x00,禁止分頻
        /* WDT2 setting */
        WDTM2 = 0x1F; // 設置 看門狗定時器2方式寄存器 值為0x1F,看門狗停止
        }

        代碼出處 main.c

        void main( void )
        {
        SystemClkInit(); // 初始化系統時鐘為32MHz

        /* CLKOUT pin set */
        PMCCM |= 0x02; // 設置系統時鐘輸出引腳使能,輸出值為系統時鐘(32MHz)

        /* PCL pin set */
        PFC9H &= 0xDF;
        PFCE9H |= 0x20;
        PMC9H |= 0x20; // 設置P9_13腳為第二功能,時鐘輸出功能
        PCLM = CG_PCL_ENABLE | CG_PCL_SEL0;
        // 設置時鐘輸出功能使能,并且設置其分頻系數(這里是進行4分頻,輸出為8MHz)

        while (1);
        }

        代碼出處 system.h

        /* CPU system clock selection (CK3~0) */
        #define CG_CPUCLK 0x07
        #define CG_CPUCLK_MAIN0 0x00 /* fCPU = fXX */
        #define CG_CPUCLK_MAIN1 0x01 /* fCPU = fXX/2 */
        #define CG_CPUCLK_MAIN2 0x02 /* fCPU = fXX/2^2 */
        #define CG_CPUCLK_MAIN3 0x03 /* fCPU = fXX/2^3 */
        #define CG_CPUCLK_MAIN4 0x04 /* fCPU = fXX/2^4 */
        #define CG_CPUCLK_MAIN5 0x05 /* fCPU = fXX/2^5 */
        #define CG_CPUCLK_SUB 0x08 /* fSC (fXT or fRL) */
        /* PCL clock frequency selection (PCK1~0) */
        #define CG_PCL_SEL0 0x00 /* fPCL= fPLLO/4 */
        #define CG_PCL_SEL1 0x01 /* fPCL= fPLLO/8 */
        #define CG_PCL_SEL2 0x02 /* fPCL= fPLLO/16 */
        #define CG_PCL_SEL3 0x03 /* fPCL= fPLLO/32 */

        上面的代碼設置系統主時鐘輸出32MHz可以在第一幅圖的CLKOUT端口測量,在70f3630里是引腳"PCM1",可編程輸出時鐘輸出為8MHz在70f3630里是引腳"P9_13"引腳。下面兩幅圖是用示波器測量的結果作為佐證:
        可以發現波形比較不好,應該是因為頻率高造成的,在負半軸和超出5v的地方都有了比較大的文波,尤其是32MHz的輸出,也有一部分原因是因為,管腳的反轉速率達不到這么高。
        如果我們想修改系統時鐘頻率或者是輸出頻率,可以對照著代碼部分高亮的地方修改,注釋里也有詳細說明。
        下面是修改后的波形圖:
        可以觀察到,在頻率下降后,波形會有不同程度的好轉。

        最后補充一點:
        經過測試,在V850里的系統始終一旦設置為一個數值(比如32MHz),他的內部設備總線時鐘就也同時被設置為相同的頻率,在每個外設的設置里有分配寄存器,但是內部設備總線時鐘是無法變動了。仔細的看第一幅圖就會發現和圖是不一致的,如果有知道的朋友,希望不吝賜教。



        關鍵詞: NECV850系統時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 罗平县| 衡水市| 义乌市| 马公市| 含山县| 乌兰浩特市| 加查县| 堆龙德庆县| 成都市| 泽普县| 兴国县| 宜城市| 阿坝县| 独山县| 博野县| 昌乐县| 南雄市| 钦州市| 得荣县| 泸州市| 浏阳市| 内黄县| 阳新县| 文登市| 大连市| 北票市| 鸡东县| 科技| 云浮市| 邳州市| 新和县| 卫辉市| 北辰区| 澄迈县| 永新县| 延川县| 宁都县| 万盛区| 威宁| 缙云县| 诏安县|