标题:
用python脚本交互式生成STC8单片机初始化代码
[打印本页]
作者:
michaelchain
时间:
2021-11-9 16:14
标题:
用python脚本交互式生成STC8单片机初始化代码
用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;
}
复制代码
作者:
devcang
时间:
2021-11-9 17:32
STC自身的工具,有这样的功能吧,以后的版本,不知道会不会保留这功能。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1