用python寫了個支持STC8A/8F(stc8a)和STC8A8K64D4(stc8d)的初始化腳本, 可以根據配置生成寄存器的初始化代碼.
現在實現了系統時鐘, 定時器1,2,3和串口1的初始化配置, 支持任意分頻和串口波特率配置
這樣的工具會有需求么?
配置
- Please choose a MCU type(請選擇MCU類型) ['stc8a', 'stc8d']
- :stc8a
- Select language. Currently [0]:
- 0: English
- 1: 中文
- :1
- (Cmd) clock
- ==== 系統時鐘配置開始 ====
- MCU時鐘源. 當前選擇[0]:
- 0: 內置高頻震蕩器
- 1: 外部時鐘或外置晶振
- 2: 內置32KHz低頻晶振
- :0
- 選擇頻率. 當前選擇[1]:
- 0: 22.1184MHz
- 1: 24MHz
- :1
- 頻率微調級別. 當前選擇[0]:
- 0: 無調整
- 1: +0.01%
- 2: +0.04%
- 3: +0.10%
- :
- 系統時鐘 SYSCLK 的分頻系數, 取值在[0, 255]區間內, 系統時鐘(SYSCLK) = FOSC / 分頻系數. 當前選擇[0]:
- :
- 系統時鐘輸出分頻系數. 當前選擇[0]:
- 0: 不輸出
- 1: SYSCLK/1
- 2: SYSCLK/2
- 3: SYSCLK/4
- 4: SYSCLK/8
- 5: SYSCLK/16
- 6: SYSCLK/32
- 7: SYSCLK/64
- 8: SYSCLK/128
- :
- ==== 系統時鐘配置結束 ====
- (Cmd) uart1
- ==== 串口1配置開始 ====
- 串口計數模式. 當前選擇[0]:
- 0: Mode 0, 同步移位串行方式
- 1: Mode 1, 可變波特率8位數據方式
- 2: Mode 2, 固定波特率9位數據方式
- 3: Mode 3, 可變波特率9位數據方式
- :1
- 串口1模式1/2/3 雙倍波特率模式. 當前選擇[0]:
- 0: 不使用
- 1: 雙倍波特率模式
- :1
- 串口1波特率來源. 當前選擇[1]:
- 0: 定時器1
- 1: 定時器2
- :
- 定時器2 1T模式/12T模式). 當前選擇[0]:
- 0: 12T模式
- 1: 1T模式
- :1
- 請輸入頻率, 取值于 [91.55, 6000000.00]區間內:
- [366.21]:115200
- 開啟 UART1 接收(RX mode). 當前選擇[0]:
- 0: RX 關閉
- 1: RX 開啟
- :1
- 串口1幀錯誤檢測. 當前選擇[0]:
- 0: 不作錯誤檢測
- 1: 啟用錯誤檢測, 此時 SCON 的SM0/FE作為FE使用
- :0
- ==== 串口1配置結束 ====
- (Cmd) timer1
- ==== 定時器1 配置開始 ====
- 定時器1運行狀態. 當前選擇[0]:
- 0: 停止
- 1: 運行
- :1
- 定時器1 1T模式/12T模式). 當前選擇[0]:
- 0: 12T模式
- 1: 1T模式
- :1
- 定時器1功能. 當前選擇[0]:
- 0: 定時
- 1: 計數
- :0
- 定時器1打開條件. 當前選擇[0]:
- 0: TR1為高即運行定時器/計數器1
- 1: 只有在INT1腳為高時, TR1為高才運行定時器/計數器1
- :0
- 定時器1時鐘輸出. 當前選擇[0]:
- 0: 關閉
- 1: 輸出至P3.4
- :0
- 定時器1的定時器模式. 當前選擇[0]:
- 0: 16位自動重載模式, 當[TH1,TL1]中的16位計數值溢出時,系統會自動將內部16位重載寄存器中的重載值裝入[TH1,TL1]中
- 1: 16位不自動重載模式, 當[TH1,TL1]中的16位計數值溢出時,定時器1將從0開始計數
- 2: 8位自動重載模式, 當TL1中的8位計數值溢出時,系統會自動將TH1中的重載值裝入TL1中
- 3: T1停止工作
- :0
- 請輸入頻率, 取值于 [183, 12000000]區間內:
- [183]:200
- ==== 定時器1 配置結束 ====
- (Cmd) timer0
- ==== 定時器0 配置開始 ====
- 定時器0運行狀態. 當前選擇[0]:
- 0: 停止
- 1: 運行
- :1
- 定時器0 1T模式/12T模式). 當前選擇[0]:
- 0: 12T模式
- 1: 1T模式
- :1
- 定時器0功能. 當前選擇[0]:
- 0: 定時
- 1: 計數
- :0
- 定時器0打開條件. 當前選擇[0]:
- 0: TR0為高即運行定時器/計數器0
- 1: 只有在INT0腳為高時, TR0為高才運行定時器/計數器0
- :0
- 定時器0的定時器模式. 當前選擇[0]:
- 0: 16位自動重載模式, 當[TH0,TL0]中的16位計數值溢出時,系統會自動將內部16位重載寄存器中的重載值裝入[TH0,TL0]中
- 1: 16位不自動重載模式, 當[TH0,TL0]中的16位計數值溢出時,定時器將從0開始計數
- 2: 8位自動重載模式, 當TL0中的8位計數值溢出時,系統會自動將TH0中的重載值裝入TL0中
- 3: 不可屏蔽中斷的16位自動重載模式, 與模式0相同,不可屏蔽, 中斷優先級最高且不可關閉, 可用作操作系統的系統節拍定時器或系統監控定時器
- :2
- 定時器0時鐘輸出. 當前選擇[0]:
- 0: 關閉
- 1: 輸出至P3.5
- :0
- 請輸入定時器0的頻率, 取值于 [46875, 12000000]區間內:
- [46875]:50000
- ==== 定時器0 配置結束 ====
- (Cmd) timer0
- ==== 定時器0 配置開始 ====
- 定時器0運行狀態. 當前選擇[1]:
- 0: 停止
- 1: 運行
- :
- 定時器0 1T模式/12T模式). 當前選擇[1]:
- 0: 12T模式
- 1: 1T模式
- :
- 定時器0功能. 當前選擇[0]:
- 0: 定時
- 1: 計數
- :
- 定時器0打開條件. 當前選擇[0]:
- 0: TR0為高即運行定時器/計數器0
- 1: 只有在INT0腳為高時, TR0為高才運行定時器/計數器0
- :
- 定時器0的定時器模式. 當前選擇[2]:
- 0: 16位自動重載模式, 當[TH0,TL0]中的16位計數值溢出時,系統會自動將內部16位重載寄存器中的重載值裝入[TH0,TL0]中
- 1: 16位不自動重載模式, 當[TH0,TL0]中的16位計數值溢出時,定時器將從0開始計數
- 2: 8位自動重載模式, 當TL0中的8位計數值溢出時,系統會自動將TH0中的重載值裝入TL0中
- 3: 不可屏蔽中斷的16位自動重載模式, 與模式0相同,不可屏蔽, 中斷優先級最高且不可關閉, 可用作操作系統的系統節拍定時器或系統監控定時器
- :0
- 定時器0時鐘輸出. 當前選擇[0]:
- 0: 關閉
- 1: 輸出至P3.5
- :
- 請輸入定時器0的頻率, 取值于 [183, 12000000]區間內:
- [183]:500
- ==== 定時器0 配置結束 ====
復制代碼
明細
- (Cmd) info
- MCU時鐘源: 內置高頻震蕩器
- 內部24MHz振蕩器開關: 開啟
- 外部時鐘源開關: 關閉
- 內部32K振蕩源開關: 關閉
- 選擇頻率: 24MHz
- 振蕩源或時鐘頻率, 值在[16000000, 28000000]區間內: 24000000
- 內部時鐘振蕩器頻率調整, 取值范圍[0, 255], 每級增加大約0.24%: assigned by T24M
- 頻率微調級別: 無調整
- FOSC: 24.000000MHz
- 系統時鐘 SYSCLK 的分頻系數, 取值在[0, 255]區間內, 系統時鐘(SYSCLK) = FOSC / 分頻系數: 0x00
- SYSCLK: 24.000000MHz
- 系統時鐘輸出分頻系數: 不輸出
- 定時器0運行狀態: 運行
- 定時器0 1T模式/12T模式): 1T模式
- 定時器0功能: 定時
- 定時器0打開條件: TR0為高即運行定時器/計數器0
- 定時器0的定時器模式: 16位自動重載模式, 當[TH0,TL0]中的16位計數值溢出時,系統會自動將內部16位重載寄存器中的重載值裝入[TH0,TL0]中
- 定時器0時鐘輸出: 關閉
- TIMER0 Freq: 500
- 定時器1運行狀態: 運行
- 定時器1 1T模式/12T模式): 1T模式
- 定時器1功能: 定時
- 定時器1打開條件: TR1為高即運行定時器/計數器1
- 定時器1時鐘輸出: 關閉
- 定時器1的定時器模式: 16位自動重載模式, 當[TH1,TL1]中的16位計數值溢出時,系統會自動將內部16位重載寄存器中的重載值裝入[TH1,TL1]中
- TIMER1 Freq: 200
- 定時器2運行狀態: 運行
- 定時器2 1T模式/12T模式): 1T模式
- 定時器2功能: 定時
- 定時器2時鐘輸出: 關閉
- TIMER2 Freq: 452830
- 串口計數模式: Mode 1, 可變波特率8位數據方式
- 串口1模式1/2/3 雙倍波特率模式: 雙倍波特率模式
- 串口1波特率來源: 定時器2
- UART1 Baud Rate: 113207
- 開啟 UART1 接收(RX mode): RX 開啟
- 串口1幀錯誤檢測: 不作錯誤檢測
復制代碼
生成寄存器初始值代碼
- (Cmd) gen
- Code for current configuration:
- MCU Type: STC8A,STC8C,STC8F Series
- #include "stc8.h"
- void clock_init()
- {
- // [ BAH,0,0x00]: 外設端口切換寄存器2
- P_SW2 = 0x80;
- // [FE01H,1,0x00]: 時鐘分頻寄存器
- CLKDIV = 0x00;
- // [ 9FH,0,0x00]: IRC頻率調整寄存器
- IRTRIM = T24M;
- // [ 9EH,0,0x00]: IRC頻率微調寄存器
- LIRTRIM = 0x00;
- // [ BAH,0,0x00]: 外設端口切換寄存器2
- P_SW2 = 0x00;
- }
- void timer_init()
- {
- // [ BAH,0,0x00]: 外設端口切換寄存器2
- P_SW2 = 0x80;
- // [ D6H,0,0x00]: 定時器2高字節
- T2H = 0xFF;
- // [ D7H,0,0x00]: 定時器2低字節
- T2L = 0xCB;
- // [ BAH,0,0x00]: 外設端口切換寄存器2
- P_SW2 = 0x00;
- // [ 87H,0,0x30]: 電源控制寄存器
- PCON = 0xB0;
- // [ 8EH,0,0x01]: 輔助寄存器
- AUXR = 0xD5;
- // [ 88H,0,0x00]: 定時器控制寄存器
- TCON = 0x50;
- // [ 8CH,0,0x00]: 定時器0高8位寄存器
- TH0 = 0xA2;
- // [ 8AH,0,0x00]: 定時器0低8位寄存器
- TL0 = 0x40;
- // [ 8DH,0,0x00]: 定時器1高8位寄存器
- TH1 = 0x15;
- // [ 8BH,0,0x00]: 定時器1低8位寄存器
- TL1 = 0xA0;
- }
- void uart_init()
- {
- // [ 98H,0,0x00]: 串口1控制寄存器
- SCON = 0x50;
- // [ 87H,0,0x30]: 電源控制寄存器
- PCON = 0xB0;
- // [ 8EH,0,0x01]: 輔助寄存器
- AUXR = 0xD5;
- }
復制代碼
|