標(biāo)題:
用python腳本交互式生成STC8單片機(jī)初始化代碼
[打印本頁]
作者:
michaelchain
時間:
2021-11-9 16:14
標(biāo)題:
用python腳本交互式生成STC8單片機(jī)初始化代碼
用python寫了個支持STC8A/8F(stc8a)和STC8A8K64D4(stc8d)的初始化腳本, 可以根據(jù)配置生成寄存器的初始化代碼.
現(xiàn)在實現(xiàn)了系統(tǒng)時鐘, 定時器1,2,3和串口1的初始化配置, 支持任意分頻和串口波特率配置
這樣的工具會有需求么?
配置
Please choose a MCU type(請選擇MCU類型) ['stc8a', 'stc8d']
:stc8a
Select language. Currently [0]:
0: English
1: 中文
:1
(Cmd) clock
==== 系統(tǒng)時鐘配置開始 ====
MCU時鐘源. 當(dāng)前選擇[0]:
0: 內(nèi)置高頻震蕩器
1: 外部時鐘或外置晶振
2: 內(nèi)置32KHz低頻晶振
:0
選擇頻率. 當(dāng)前選擇[1]:
0: 22.1184MHz
1: 24MHz
:1
頻率微調(diào)級別. 當(dāng)前選擇[0]:
0: 無調(diào)整
1: +0.01%
2: +0.04%
3: +0.10%
:
系統(tǒng)時鐘 SYSCLK 的分頻系數(shù), 取值在[0, 255]區(qū)間內(nèi), 系統(tǒng)時鐘(SYSCLK) = FOSC / 分頻系數(shù). 當(dāng)前選擇[0]:
:
系統(tǒng)時鐘輸出分頻系數(shù). 當(dāng)前選擇[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
:
==== 系統(tǒng)時鐘配置結(jié)束 ====
(Cmd) uart1
==== 串口1配置開始 ====
串口計數(shù)模式. 當(dāng)前選擇[0]:
0: Mode 0, 同步移位串行方式
1: Mode 1, 可變波特率8位數(shù)據(jù)方式
2: Mode 2, 固定波特率9位數(shù)據(jù)方式
3: Mode 3, 可變波特率9位數(shù)據(jù)方式
:1
串口1模式1/2/3 雙倍波特率模式. 當(dāng)前選擇[0]:
0: 不使用
1: 雙倍波特率模式
:1
串口1波特率來源. 當(dāng)前選擇[1]:
0: 定時器1
1: 定時器2
:
定時器2 1T模式/12T模式). 當(dāng)前選擇[0]:
0: 12T模式
1: 1T模式
:1
請輸入頻率, 取值于 [91.55, 6000000.00]區(qū)間內(nèi):
[366.21]:115200
開啟 UART1 接收(RX mode). 當(dāng)前選擇[0]:
0: RX 關(guān)閉
1: RX 開啟
:1
串口1幀錯誤檢測. 當(dāng)前選擇[0]:
0: 不作錯誤檢測
1: 啟用錯誤檢測, 此時 SCON 的SM0/FE作為FE使用
:0
==== 串口1配置結(jié)束 ====
(Cmd) timer1
==== 定時器1 配置開始 ====
定時器1運(yùn)行狀態(tài). 當(dāng)前選擇[0]:
0: 停止
1: 運(yùn)行
:1
定時器1 1T模式/12T模式). 當(dāng)前選擇[0]:
0: 12T模式
1: 1T模式
:1
定時器1功能. 當(dāng)前選擇[0]:
0: 定時
1: 計數(shù)
:0
定時器1打開條件. 當(dāng)前選擇[0]:
0: TR1為高即運(yùn)行定時器/計數(shù)器1
1: 只有在INT1腳為高時, TR1為高才運(yùn)行定時器/計數(shù)器1
:0
定時器1時鐘輸出. 當(dāng)前選擇[0]:
0: 關(guān)閉
1: 輸出至P3.4
:0
定時器1的定時器模式. 當(dāng)前選擇[0]:
0: 16位自動重載模式, 當(dāng)[TH1,TL1]中的16位計數(shù)值溢出時,系統(tǒng)會自動將內(nèi)部16位重載寄存器中的重載值裝入[TH1,TL1]中
1: 16位不自動重載模式, 當(dāng)[TH1,TL1]中的16位計數(shù)值溢出時,定時器1將從0開始計數(shù)
2: 8位自動重載模式, 當(dāng)TL1中的8位計數(shù)值溢出時,系統(tǒng)會自動將TH1中的重載值裝入TL1中
3: T1停止工作
:0
請輸入頻率, 取值于 [183, 12000000]區(qū)間內(nèi):
[183]:200
==== 定時器1 配置結(jié)束 ====
(Cmd) timer0
==== 定時器0 配置開始 ====
定時器0運(yùn)行狀態(tài). 當(dāng)前選擇[0]:
0: 停止
1: 運(yùn)行
:1
定時器0 1T模式/12T模式). 當(dāng)前選擇[0]:
0: 12T模式
1: 1T模式
:1
定時器0功能. 當(dāng)前選擇[0]:
0: 定時
1: 計數(shù)
:0
定時器0打開條件. 當(dāng)前選擇[0]:
0: TR0為高即運(yùn)行定時器/計數(shù)器0
1: 只有在INT0腳為高時, TR0為高才運(yùn)行定時器/計數(shù)器0
:0
定時器0的定時器模式. 當(dāng)前選擇[0]:
0: 16位自動重載模式, 當(dāng)[TH0,TL0]中的16位計數(shù)值溢出時,系統(tǒng)會自動將內(nèi)部16位重載寄存器中的重載值裝入[TH0,TL0]中
1: 16位不自動重載模式, 當(dāng)[TH0,TL0]中的16位計數(shù)值溢出時,定時器將從0開始計數(shù)
2: 8位自動重載模式, 當(dāng)TL0中的8位計數(shù)值溢出時,系統(tǒng)會自動將TH0中的重載值裝入TL0中
3: 不可屏蔽中斷的16位自動重載模式, 與模式0相同,不可屏蔽, 中斷優(yōu)先級最高且不可關(guān)閉, 可用作操作系統(tǒng)的系統(tǒng)節(jié)拍定時器或系統(tǒng)監(jiān)控定時器
:2
定時器0時鐘輸出. 當(dāng)前選擇[0]:
0: 關(guān)閉
1: 輸出至P3.5
:0
請輸入定時器0的頻率, 取值于 [46875, 12000000]區(qū)間內(nèi):
[46875]:50000
==== 定時器0 配置結(jié)束 ====
(Cmd) timer0
==== 定時器0 配置開始 ====
定時器0運(yùn)行狀態(tài). 當(dāng)前選擇[1]:
0: 停止
1: 運(yùn)行
:
定時器0 1T模式/12T模式). 當(dāng)前選擇[1]:
0: 12T模式
1: 1T模式
:
定時器0功能. 當(dāng)前選擇[0]:
0: 定時
1: 計數(shù)
:
定時器0打開條件. 當(dāng)前選擇[0]:
0: TR0為高即運(yùn)行定時器/計數(shù)器0
1: 只有在INT0腳為高時, TR0為高才運(yùn)行定時器/計數(shù)器0
:
定時器0的定時器模式. 當(dāng)前選擇[2]:
0: 16位自動重載模式, 當(dāng)[TH0,TL0]中的16位計數(shù)值溢出時,系統(tǒng)會自動將內(nèi)部16位重載寄存器中的重載值裝入[TH0,TL0]中
1: 16位不自動重載模式, 當(dāng)[TH0,TL0]中的16位計數(shù)值溢出時,定時器將從0開始計數(shù)
2: 8位自動重載模式, 當(dāng)TL0中的8位計數(shù)值溢出時,系統(tǒng)會自動將TH0中的重載值裝入TL0中
3: 不可屏蔽中斷的16位自動重載模式, 與模式0相同,不可屏蔽, 中斷優(yōu)先級最高且不可關(guān)閉, 可用作操作系統(tǒng)的系統(tǒng)節(jié)拍定時器或系統(tǒng)監(jiān)控定時器
:0
定時器0時鐘輸出. 當(dāng)前選擇[0]:
0: 關(guān)閉
1: 輸出至P3.5
:
請輸入定時器0的頻率, 取值于 [183, 12000000]區(qū)間內(nèi):
[183]:500
==== 定時器0 配置結(jié)束 ====
復(fù)制代碼
明細(xì)
(Cmd) info
MCU時鐘源: 內(nèi)置高頻震蕩器
內(nèi)部24MHz振蕩器開關(guān): 開啟
外部時鐘源開關(guān): 關(guān)閉
內(nèi)部32K振蕩源開關(guān): 關(guān)閉
選擇頻率: 24MHz
振蕩源或時鐘頻率, 值在[16000000, 28000000]區(qū)間內(nèi): 24000000
內(nèi)部時鐘振蕩器頻率調(diào)整, 取值范圍[0, 255], 每級增加大約0.24%: assigned by T24M
頻率微調(diào)級別: 無調(diào)整
FOSC: 24.000000MHz
系統(tǒng)時鐘 SYSCLK 的分頻系數(shù), 取值在[0, 255]區(qū)間內(nèi), 系統(tǒng)時鐘(SYSCLK) = FOSC / 分頻系數(shù): 0x00
SYSCLK: 24.000000MHz
系統(tǒng)時鐘輸出分頻系數(shù): 不輸出
定時器0運(yùn)行狀態(tài): 運(yùn)行
定時器0 1T模式/12T模式): 1T模式
定時器0功能: 定時
定時器0打開條件: TR0為高即運(yùn)行定時器/計數(shù)器0
定時器0的定時器模式: 16位自動重載模式, 當(dāng)[TH0,TL0]中的16位計數(shù)值溢出時,系統(tǒng)會自動將內(nèi)部16位重載寄存器中的重載值裝入[TH0,TL0]中
定時器0時鐘輸出: 關(guān)閉
TIMER0 Freq: 500
定時器1運(yùn)行狀態(tài): 運(yùn)行
定時器1 1T模式/12T模式): 1T模式
定時器1功能: 定時
定時器1打開條件: TR1為高即運(yùn)行定時器/計數(shù)器1
定時器1時鐘輸出: 關(guān)閉
定時器1的定時器模式: 16位自動重載模式, 當(dāng)[TH1,TL1]中的16位計數(shù)值溢出時,系統(tǒng)會自動將內(nèi)部16位重載寄存器中的重載值裝入[TH1,TL1]中
TIMER1 Freq: 200
定時器2運(yùn)行狀態(tài): 運(yùn)行
定時器2 1T模式/12T模式): 1T模式
定時器2功能: 定時
定時器2時鐘輸出: 關(guān)閉
TIMER2 Freq: 452830
串口計數(shù)模式: Mode 1, 可變波特率8位數(shù)據(jù)方式
串口1模式1/2/3 雙倍波特率模式: 雙倍波特率模式
串口1波特率來源: 定時器2
UART1 Baud Rate: 113207
開啟 UART1 接收(RX mode): RX 開啟
串口1幀錯誤檢測: 不作錯誤檢測
復(fù)制代碼
生成寄存器初始值代碼
(Cmd) gen
Code for current configuration:
MCU Type: STC8A,STC8C,STC8F Series
#include "stc8.h"
void clock_init()
{
// [ BAH,0,0x00]: 外設(shè)端口切換寄存器2
P_SW2 = 0x80;
// [FE01H,1,0x00]: 時鐘分頻寄存器
CLKDIV = 0x00;
// [ 9FH,0,0x00]: IRC頻率調(diào)整寄存器
IRTRIM = T24M;
// [ 9EH,0,0x00]: IRC頻率微調(diào)寄存器
LIRTRIM = 0x00;
// [ BAH,0,0x00]: 外設(shè)端口切換寄存器2
P_SW2 = 0x00;
}
void timer_init()
{
// [ BAH,0,0x00]: 外設(shè)端口切換寄存器2
P_SW2 = 0x80;
// [ D6H,0,0x00]: 定時器2高字節(jié)
T2H = 0xFF;
// [ D7H,0,0x00]: 定時器2低字節(jié)
T2L = 0xCB;
// [ BAH,0,0x00]: 外設(shè)端口切換寄存器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;
}
復(fù)制代碼
作者:
devcang
時間:
2021-11-9 17:32
STC自身的工具,有這樣的功能吧,以后的版本,不知道會不會保留這功能。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1