用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;
- }
复制代码
|