找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1879|回复: 1
收起左侧

用python脚本交互式生成STC8单片机初始化代码

[复制链接]
ID:912806 发表于 2021-11-9 16:14 | 显示全部楼层 |阅读模式
用python写了个支持STC8A/8F(stc8a)和STC8A8K64D4(stc8d)的初始化脚本, 可以根据配置生成寄存器的初始化代码.
现在实现了系统时钟, 定时器1,2,3和串口1的初始化配置, 支持任意分频和串口波特率配置
这样的工具会有需求么?

配置
  1. Please choose a MCU type(请选择MCU类型) ['stc8a', 'stc8d']
  2. :stc8a
  3. Select language. Currently [0]:
  4.   0: English
  5.   1: 中文
  6. :1
  7. (Cmd) clock
  8. ==== 系统时钟配置开始 ====
  9. MCU时钟源. 当前选择[0]:
  10.   0: 内置高频震荡器
  11.   1: 外部时钟或外置晶振
  12.   2: 内置32KHz低频晶振
  13. :0
  14. 选择频率. 当前选择[1]:
  15.   0: 22.1184MHz
  16.   1: 24MHz
  17. :1
  18. 频率微调级别. 当前选择[0]:
  19.   0: 无调整
  20.   1: +0.01%
  21.   2: +0.04%
  22.   3: +0.10%
  23. :
  24. 系统时钟 SYSCLK 的分频系数, 取值在[0, 255]区间内, 系统时钟(SYSCLK) = FOSC / 分频系数. 当前选择[0]:
  25. :
  26. 系统时钟输出分频系数. 当前选择[0]:
  27.   0: 不输出
  28.   1: SYSCLK/1
  29.   2: SYSCLK/2
  30.   3: SYSCLK/4
  31.   4: SYSCLK/8
  32.   5: SYSCLK/16
  33.   6: SYSCLK/32
  34.   7: SYSCLK/64
  35.   8: SYSCLK/128
  36. :
  37. ==== 系统时钟配置结束 ====
  38. (Cmd) uart1
  39. ==== 串口1配置开始 ====
  40. 串口计数模式. 当前选择[0]:
  41.   0: Mode 0, 同步移位串行方式
  42.   1: Mode 1, 可变波特率8位数据方式
  43.   2: Mode 2, 固定波特率9位数据方式
  44.   3: Mode 3, 可变波特率9位数据方式
  45. :1
  46. 串口1模式1/2/3 双倍波特率模式. 当前选择[0]:
  47.   0: 不使用
  48.   1: 双倍波特率模式
  49. :1
  50. 串口1波特率来源. 当前选择[1]:
  51.   0: 定时器1
  52.   1: 定时器2
  53. :
  54. 定时器2 1T模式/12T模式). 当前选择[0]:
  55.   0: 12T模式
  56.   1: 1T模式
  57. :1
  58. 请输入频率, 取值于 [91.55,  6000000.00]区间内:
  59. [366.21]:115200
  60. 开启 UART1 接收(RX mode). 当前选择[0]:
  61.   0: RX 关闭
  62.   1: RX 开启
  63. :1
  64. 串口1帧错误检测. 当前选择[0]:
  65.   0: 不作错误检测
  66.   1: 启用错误检测, 此时 SCON 的SM0/FE作为FE使用
  67. :0
  68. ==== 串口1配置结束 ====
  69. (Cmd) timer1
  70. ==== 定时器1 配置开始 ====
  71. 定时器1运行状态. 当前选择[0]:
  72.   0: 停止
  73.   1: 运行
  74. :1
  75. 定时器1 1T模式/12T模式). 当前选择[0]:
  76.   0: 12T模式
  77.   1: 1T模式
  78. :1
  79. 定时器1功能. 当前选择[0]:
  80.   0: 定时
  81.   1: 计数
  82. :0
  83. 定时器1打开条件. 当前选择[0]:
  84.   0: TR1为高即运行定时器/计数器1
  85.   1: 只有在INT1脚为高时, TR1为高才运行定时器/计数器1
  86. :0
  87. 定时器1时钟输出. 当前选择[0]:
  88.   0: 关闭
  89.   1: 输出至P3.4
  90. :0
  91. 定时器1的定时器模式. 当前选择[0]:
  92.   0: 16位自动重载模式, 当[TH1,TL1]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH1,TL1]中
  93.   1: 16位不自动重载模式, 当[TH1,TL1]中的16位计数值溢出时,定时器1将从0开始计数
  94.   2: 8位自动重载模式, 当TL1中的8位计数值溢出时,系统会自动将TH1中的重载值装入TL1中
  95.   3: T1停止工作
  96. :0
  97. 请输入频率, 取值于 [183,  12000000]区间内:
  98. [183]:200
  99. ==== 定时器1 配置结束 ====
  100. (Cmd) timer0
  101. ==== 定时器0 配置开始 ====
  102. 定时器0运行状态. 当前选择[0]:
  103.   0: 停止
  104.   1: 运行
  105. :1
  106. 定时器0 1T模式/12T模式). 当前选择[0]:
  107.   0: 12T模式
  108.   1: 1T模式
  109. :1
  110. 定时器0功能. 当前选择[0]:
  111.   0: 定时
  112.   1: 计数
  113. :0
  114. 定时器0打开条件. 当前选择[0]:
  115.   0: TR0为高即运行定时器/计数器0
  116.   1: 只有在INT0脚为高时, TR0为高才运行定时器/计数器0
  117. :0
  118. 定时器0的定时器模式. 当前选择[0]:
  119.   0: 16位自动重载模式, 当[TH0,TL0]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH0,TL0]中
  120.   1: 16位不自动重载模式, 当[TH0,TL0]中的16位计数值溢出时,定时器将从0开始计数
  121.   2: 8位自动重载模式, 当TL0中的8位计数值溢出时,系统会自动将TH0中的重载值装入TL0中
  122.   3: 不可屏蔽中断的16位自动重载模式, 与模式0相同,不可屏蔽, 中断优先级最高且不可关闭, 可用作操作系统的系统节拍定时器或系统监控定时器
  123. :2
  124. 定时器0时钟输出. 当前选择[0]:
  125.   0: 关闭
  126.   1: 输出至P3.5
  127. :0
  128. 请输入定时器0的频率, 取值于 [46875,  12000000]区间内:
  129. [46875]:50000
  130. ==== 定时器0 配置结束 ====
  131. (Cmd) timer0
  132. ==== 定时器0 配置开始 ====
  133. 定时器0运行状态. 当前选择[1]:
  134.   0: 停止
  135.   1: 运行
  136. :
  137. 定时器0 1T模式/12T模式). 当前选择[1]:
  138.   0: 12T模式
  139.   1: 1T模式
  140. :
  141. 定时器0功能. 当前选择[0]:
  142.   0: 定时
  143.   1: 计数
  144. :
  145. 定时器0打开条件. 当前选择[0]:
  146.   0: TR0为高即运行定时器/计数器0
  147.   1: 只有在INT0脚为高时, TR0为高才运行定时器/计数器0
  148. :
  149. 定时器0的定时器模式. 当前选择[2]:
  150.   0: 16位自动重载模式, 当[TH0,TL0]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH0,TL0]中
  151.   1: 16位不自动重载模式, 当[TH0,TL0]中的16位计数值溢出时,定时器将从0开始计数
  152.   2: 8位自动重载模式, 当TL0中的8位计数值溢出时,系统会自动将TH0中的重载值装入TL0中
  153.   3: 不可屏蔽中断的16位自动重载模式, 与模式0相同,不可屏蔽, 中断优先级最高且不可关闭, 可用作操作系统的系统节拍定时器或系统监控定时器
  154. :0
  155. 定时器0时钟输出. 当前选择[0]:
  156.   0: 关闭
  157.   1: 输出至P3.5
  158. :
  159. 请输入定时器0的频率, 取值于 [183,  12000000]区间内:
  160. [183]:500
  161. ==== 定时器0 配置结束 ====
复制代码

明细
  1. (Cmd) info
  2. MCU时钟源: 内置高频震荡器
  3. 内部24MHz振荡器开关: 开启
  4. 外部时钟源开关: 关闭
  5. 内部32K振荡源开关: 关闭
  6. 选择频率: 24MHz
  7. 振荡源或时钟频率, 值在[16000000, 28000000]区间内: 24000000
  8. 内部时钟振荡器频率调整, 取值范围[0, 255], 每级增加大约0.24%: assigned by T24M
  9. 频率微调级别: 无调整
  10. FOSC: 24.000000MHz
  11. 系统时钟 SYSCLK 的分频系数, 取值在[0, 255]区间内, 系统时钟(SYSCLK) = FOSC / 分频系数: 0x00
  12. SYSCLK: 24.000000MHz
  13. 系统时钟输出分频系数: 不输出

  14. 定时器0运行状态: 运行
  15. 定时器0 1T模式/12T模式): 1T模式
  16. 定时器0功能: 定时
  17. 定时器0打开条件: TR0为高即运行定时器/计数器0
  18. 定时器0的定时器模式: 16位自动重载模式, 当[TH0,TL0]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH0,TL0]中
  19. 定时器0时钟输出: 关闭
  20. TIMER0 Freq: 500

  21. 定时器1运行状态: 运行
  22. 定时器1 1T模式/12T模式): 1T模式
  23. 定时器1功能: 定时
  24. 定时器1打开条件: TR1为高即运行定时器/计数器1
  25. 定时器1时钟输出: 关闭
  26. 定时器1的定时器模式: 16位自动重载模式, 当[TH1,TL1]中的16位计数值溢出时,系统会自动将内部16位重载寄存器中的重载值装入[TH1,TL1]中
  27. TIMER1 Freq: 200

  28. 定时器2运行状态: 运行
  29. 定时器2 1T模式/12T模式): 1T模式
  30. 定时器2功能: 定时
  31. 定时器2时钟输出: 关闭
  32. TIMER2 Freq: 452830

  33. 串口计数模式: Mode 1, 可变波特率8位数据方式
  34. 串口1模式1/2/3 双倍波特率模式: 双倍波特率模式
  35. 串口1波特率来源: 定时器2
  36. UART1 Baud Rate: 113207
  37. 开启 UART1 接收(RX mode): RX 开启
  38. 串口1帧错误检测: 不作错误检测
复制代码

生成寄存器初始值代码
  1. (Cmd) gen
  2. Code for current configuration:
  3. MCU Type: STC8A,STC8C,STC8F Series

  4. #include "stc8.h"

  5. void clock_init()
  6. {
  7.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  8.     P_SW2      = 0x80;
  9.     // [FE01H,1,0x00]: 时钟分频寄存器
  10.     CLKDIV     = 0x00;
  11.     // [  9FH,0,0x00]: IRC频率调整寄存器
  12.     IRTRIM     = T24M;
  13.     // [  9EH,0,0x00]: IRC频率微调寄存器
  14.     LIRTRIM    = 0x00;
  15.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  16.     P_SW2      = 0x00;

  17. }

  18. void timer_init()
  19. {
  20.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  21.     P_SW2      = 0x80;
  22.     // [  D6H,0,0x00]: 定时器2高字节
  23.     T2H        = 0xFF;
  24.     // [  D7H,0,0x00]: 定时器2低字节
  25.     T2L        = 0xCB;
  26.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  27.     P_SW2      = 0x00;
  28.     // [  87H,0,0x30]: 电源控制寄存器
  29.     PCON       = 0xB0;
  30.     // [  8EH,0,0x01]: 辅助寄存器
  31.     AUXR       = 0xD5;
  32.     // [  88H,0,0x00]: 定时器控制寄存器
  33.     TCON       = 0x50;
  34.     // [  8CH,0,0x00]: 定时器0高8位寄存器
  35.     TH0        = 0xA2;
  36.     // [  8AH,0,0x00]: 定时器0低8位寄存器
  37.     TL0        = 0x40;
  38.     // [  8DH,0,0x00]: 定时器1高8位寄存器
  39.     TH1        = 0x15;
  40.     // [  8BH,0,0x00]: 定时器1低8位寄存器
  41.     TL1        = 0xA0;
  42. }

  43. void uart_init()
  44. {
  45.     // [  98H,0,0x00]: 串口1控制寄存器
  46.     SCON       = 0x50;
  47.     // [  87H,0,0x30]: 电源控制寄存器
  48.     PCON       = 0xB0;
  49.     // [  8EH,0,0x01]: 辅助寄存器
  50.     AUXR       = 0xD5;
  51. }

复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:277550 发表于 2021-11-9 17:32 | 显示全部楼层

STC自身的工具,有这样的功能吧,以后的版本,不知道会不会保留这功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表