我用官方范例改的,怎么不行?請教一下
- //芯片用STC8H2K17U,外部晶振為24MHz
- sfr PLLCR = 0xdc;
- //測試工作頻率為24MHz
- #include "stc8h.h"
- #include "intrins.h"
- #define FOSC 24000000UL
- #define HSCK_MCLK 0
- #define HSCK_PLL 1
- #define HSCK_SEL HSCK_PLL
- #define PLL_96M 0
- #define PLL_144M 1
- #define PLL_SEL PLL_96M
- #define CKMS 0x80
- #define HSIOCK 0x40
- #define MCK2SEL_MSK 0x0c
- #define MCK2SEL_SEL1 0x00
- #define MCK2SEL_PLLD2 0x04
- #define MCK2SEL_PLLD4 0x08
- #define MCKSEL_MSK 0x03
- #define MCKSEL_HIRC 0x00
- #define MCKSEL_XOSC 0x01
- #define MCKSEL_X32K 0x02
- #define MCKSEL_IRC32K 0x03
- #define ENCKM 0x80
- #define PCKI_MSK 0x60
- #define PCKI_D1 0x00
- #define PCKI_D2 0x20
- #define PCKI_D3 0x40
- #define PCKI_D4 0x60
- void delay()
- {
- int i;
-
- for (i=0; i<100; i++);
- }
- char ReadPWMA(char addr)
- {
- char dat;
-
- while(HSPWMA_ADR & 0x80); //等待前一個異步讀寫完成
- HSPWMA_ADR= addr | 0x80; //設置間接訪問地址,只需要設置原XFR地址的低7位
- //HSPWMA_ADR寄存器的最高位寫1,表示讀數據
- while(HSPWMA_ADR & 0x80); //等待當前異步讀取完成
- dat = HSPWMA_DAT; //讀取異步數據
-
- return dat;
- }
- void WritePWMA(char addr, char dat)
- {
- while(HSPWMA_ADR & 0x80); //等待前一個異步讀寫完成
- HSPWMA_DAT= dat; //準備需要寫入的數據
- HSPWMA_ADR= addr & 0x7f; //設置間接訪問地址,只需要設置原XFR地址的低7位
- //HSPWMA_ADR寄存器的最高位寫0,表示寫數據
- }
- void main()
- {
- P_SW2|= 0x80; //使能訪問XFR
- XOSCCR = 0xc0; // 啟動外部晶振
- while (!(XOSCCR & 1)); // 等待時鐘穩定
- CLKDIV = 0x00; // 時鐘不分頻
- CKSEL = 0x01; // 選擇外部晶振
-
- //選擇PLL輸出時鐘
- #if (PLL_SEL == PLL_96M)
- CLKSEL&= ~CKMS; //選擇PLL的96M作為PLL的輸出時鐘
- #elif (PLL_SEL == PLL_144M)
- CLKSEL|= CKMS; //選擇PLL的144M作為PLL的輸出時鐘
- #else
- CLKSEL&= ~CKMS; //默認選擇PLL的96M作為PLL的輸出時鐘
- #endif
-
- //選擇PLL輸入時鐘分頻,保證輸入時鐘為12M
- PLLCR&= ~PCKI_MSK;
- #if (FOSC == 12000000UL)
- PLLCR|= PCKI_D1; //PLL輸入時鐘1分頻
- #elif (FOSC == 24000000UL)
- PLLCR|= PCKI_D2; //PLL輸入時鐘2分頻
- #elif (FOSC == 36000000UL)
- PLLCR|= PCKI_D3; //PLL輸入時鐘3分頻
- #elif (FOSC == 48000000UL)
- PLLCR|= PCKI_D4; //PLL輸入時鐘4分頻
- #else
- PLLCR|= PCKI_D1; //默認PLL輸入時鐘1分頻
- #endif
- //啟動PLL
- PLLCR|= ENCKM; //使能PLL倍頻
-
- delay(); //等待PLL鎖頻
- //選擇HSPWM/HSSPI時鐘
- #if (HSCK_SEL == HSCK_MCLK)
- CLKSEL&= ~HSIOCK; //HSPWM/HSSPI選擇主時鐘為時鐘源
- #elif (HSCK_SEL == HSCK_PLL)
- CLKSEL|= HSIOCK; //HSPWM/HSSPI選擇PLL輸出時鐘為時鐘源
- #else
- CLKSEL&= ~HSIOCK; //默認HSPWM/HSSPI選擇主時鐘為時鐘源
- #endif
- HSCLKDIV= 0; //HSPWM/HSSPI時鐘源不分頻
-
- HSPWMA_CFG= 0x03; //使能PWMA相關寄存器異步訪問功能
-
- //通過異步方式設置PWMA的相關寄存器
- WritePWMA((char)&PWMA_PSCR,48000 - 1); //分頻(注:自己加的)
- WritePWMA((char)&PWMA_CCER1,0x00);
- WritePWMA((char)&PWMA_CCMR1,0x00); //CC1為輸出模式
- WritePWMA((char)&PWMA_CCMR1,0x60); //OC1REF輸出PWM1(CNT<CCR時輸出有效電平1)
- WritePWMA((char)&PWMA_CCER1,0x05); //使能CC1/CC1N上的輸出功能
- WritePWMA((char)&PWMA_ENO,0x03); //使能PWM信號輸出到端口
- WritePWMA((char)&PWMA_BKR,0x80); //使能主輸出
- WritePWMA((char)&PWMA_CCR1H,200 >> 8); //設置輸出PWM的占空比
- WritePWMA((char)&PWMA_CCR1L,200);
- WritePWMA((char)&PWMA_ARRH,2000 >> 8); //設置輸出PWM的周期(注:原來1000,現改為2000)
- WritePWMA((char)&PWMA_ARRL,2000);
- WritePWMA((char)&PWMA_DTR,10); //設置互補對稱輸出PWM的死區
- WritePWMA((char)&PWMA_CR1,0x01); //開始PWM計數
- WritePWMA((char)&PWMB_IER,0x01); // 使能PWMB中斷
-
-
- P2M0= 0;
- P2M1= 0;
- P3M0= 0;
- P3M1= 0;
-
- // P2= ReadPWMA((char)&PWMA_ARRH); //異步方式讀取寄存器
- // P3= ReadPWMA((char)&PWMA_ARRL);
-
- while(1);
- }
- void PWMA_Isr() interrupt 26 // PWMA中斷處理程序,1秒中斷(注:自己加的)
- {
-
- if (ReadPWMA(((char)&PWMA_SR1) & 0x01))
- {
- WritePWMA((char)&PWMA_IER,0x00); // 清除PWM中斷
- P37=!P37;
- }
- }
復制代碼
|