STC15F2K60S2-28 與 STC15W4K56S4-30 使用ISP設定內部XTAL頻率的程式分享
跨別半年乾眼症發作後,無法壓抑內心想將苦心研究的MCU程式,只藏在內心之中,只好重新提筆將這個月研究的部份,再次發表之,敬告各位,未來有機會與尚有能力時,仍會發表新作,但是次數將大幅減才少,還請見諒。
本次發表之主題"STC15F2K60S2-28 與 STC15W4K56S4-30 使用ISP設定內部XTAL頻率的程式",主要是針對之前使用這兩款STC系列中的51強化版的特性,期望再提升其運算速率至最頂峰,一方面STC在再兩款內部提供了在ISP下載程式時,可以設定運作的頻率,但是過去使用外部XTAL時,往往常用的兩個選擇是11。0592Mhz與22。000Mhz,因為此兩個頻率可配合UART的BAUDRATE 9600與115200,所以當同時有用到UART,就會被限定在那兩個XTAL的頻率,所以才在構思如何突破此限制,而且能維持使用115200 BAUDRATE的環境。
發表重點:
1)XTAL頻率依ISP選擇可使用之最高頻率。
2)UART使用的BAUDRATE為115200bps
一) STC—ISP於燒錄時之設定選項
以上圖示中,分別標示了3個選擇的重點,此為使用STC15F2K60S2—28的機型,勾選為使用內部RC頻率為27。000Mhz,與松型。
下圖則是另一款STC15W系列的設定,XTAL頻率是選擇了30MHZ,
機型是STC15W$K56S4—30,BAUDRATE為115200。
二)程式部份
程式方面在 STC15F 與 STC15W 兩種不同的MCU機型在TIMER 2的有些暫存器設定丘會不同
#define BAUDRATE 115200
#define XTAL 27000000 // FOR STC15F2K60S2-28系列
sfr AUXR = 0x8e; //輔助寄存器
sfr T2H = 0xd6; //定時器2高8位
sfr T2L = 0xd7; //定時器2低8位
sfr P_SW1 = 0xA2; //外設功能切換寄存器1
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
void main()
{
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
..........................
PCON2 &= 0xf8; //only for STC15F2K60S2
Init_Timer2(); // UART 1
.........................
}
/*------------------------------------------------
計時器 2 的初始化 for UART 115200,8,n,1 ( STC15F2K60S2適用)
------------------------------------------------*/
void Init_Timer2(void) // 計數器 2 的初始化
{
SCON = 0x50; //8bits,n,1p Baudrate changeble
AUXR = 0x94; // Timer 2 開始計時
AUXR |= 0x01;
T2H=(65536-XTAL/4/BAUDRATE)>>8;
T2L=(65536-XTAL/4/BAUDRATE);
IE2 = 1; //
ET2 = 1;
}
===========================================
另外使用ST15W4K56S4-30的機型之程式如下:
#define BAUDRATE 115200
#define XTAL 30000000 // FOR STC15W4K56S4-30系列
void main()
{
PCON2 &= 0xf8; //only for STC15W4K32S4
P_SW1 &= ~S1_S0; //S1_S0=0 S1_S1=0
P_SW2 &= ~S1_S1; //(P3.0/RxD, P3.1/TxD)
P_SW2 &= ~S2_S; //S2_S=0x01 (P1.0/RxD2, P1.1/TxD2)
P_SW1 &= ~SPI_S0; //SPI_S0=0 SPI_S1=0
P_SW2 &= ~SPI_S1; //(P1.2/SS, P1.3/MOSI, P1.4/MISO, P1.5/SCLK)
P_SW2 &= ~S3_S; //S3_S(P0.0/RxD3, P0.1/TxDS3)
P_SW2 &= ~S4_S; //S4_S(P0.2/RxD4, P0.3/TxDS4)
P0M1=0;P0M0=0;
P1M1=1;P1M0=1;
P2M1=0;P2M0=0;P3M1=0;P3M0=0;P4M1=0;P4M0=0; //for STC15W4K56S4 I/O setting
P5M1=0;P5M0=0;P6M1=0;P6M0=0;P7M1=0;P7M0=0; //初始化 I/O PORT
Init_Timer2(); // UART 1
...................
}
/*------------------------------------------------
計時器 2 的初始化 for UART 115200,8,n,1 @30Mhz
------------------------------------------------*/
void Init_Timer2(void) // 計數器 2 的初始化
{
S2CON = 0x53; //8bits,n,1p Baudrate changeble
AUXR = 0xf5; // Timer 2 開始計時
T2H=(65536-XTAL/4/BAUDRATE)>>8;
T2L=(65536-XTAL/4/BAUDRATE);
IE2 = 1; //
ET2 = 1;
}
三) 測試結果
在實測時,這兩款MCU的頻率不同下,雖然用邏輯分析儀量測每個bit的時間數與原先使用XTAL=22。1184Mhz時略為不同,但是誤差很小,仍在可控制範圍,實際傳輸時,都能完整收發訊息無誤。
各位來訪的同好,敬請原諒,過往沒有乾眼症問題時,可以盡其所能將文章登打的愈詳細愈好,但是如今愈來愈吃力,往後就只能提重點,請自行各位再自行深入了解。
PS:乾眼症之問題,從新聞中,已有醫生表示患者愈來愈多,有些與3C重度使用者有關,大家不要忽視,必竟發生時,是非常辛苦,影響生活甚巨,個人在此期間醫生有交代,要勤於點人工淚液以緩和乾澀與酸累的感覺,夜間睡前更是不能忘了點藥膏,再者就是要多熱敷眼睛,因此在PCHOME購得一只"USB定時調溫遠紅外線草本熱敷眼罩",使用上很方便,可供各位參考。