【实验箱已收到】何老师 《STC32位8051单片机原理及应用-STC32G12K128》,打卡
本帖最后由 gentleman 于 2023-8-16 16:39 编辑陈老师的课另开新帖 https://www.stcaimcu.com/forum.p ... 3620&extra=page%3D1
本贴依旧会持续更新。
2023/7/25 第一课(1,2,3 课时)
听了何老师的课,收获很大,以前听过几位老师讲单片机,这次听到了以前没接触过的知识。
许多都是特别底层的东西,以前都是直接调用高级函数库,操作一下寄存器都觉着是高端操作。今日听了何老师的课,有了新的认知。
由于对汇编不熟悉,讲解机器指令那里,理解起来比较吃力。但也大致听懂了。
明白了32位对比8位,究竟快在哪里,以长整型求和为例,8位要把长整型分成4份,存在4个寄存器里,分别求和。
而32位cpu可以将长整型放在4字节的段寄存器里(这里理解的不是很清晰,要补一下汇编知识),进行一次求和,减少操作指令,进而提升速度。
简单笔记
单片机和桌面系统的基本架构
单片机是一个芯片,内部集成cpu与 osc,flash,sram等各种外设。
桌面系统中 cpu是但单独的,还要外接ssd(hdd),ddr5(4)ram,及io。
处理器的和指令集类型
stc32g是80251,之前的产品是8051。
arm芯片的是另外一类。
以前intel搞得80251,96年就搞出来了,80251指令集支持8/16/32 位操作,但intel搞不出来32位的单片机,搞出的还是8位的单片机,然后stc搞出来了。(是这么理解的吧)
嵌入式系统的硬件和软件
芯片外设越来越多,原来是在pcb上接各种芯片实现功能,现在跑的芯片里面去了。
pcb设计越来越简单,制作芯片越来越复杂(好像程序也会复杂一些,要配置一堆寄存器,开发时看不到芯片,变黑盒)。
单片机的设计语言
c--汇编--机器指令--机器码(好像是这个)
汇编语言很重要,可以更好的理解机器指令。
定义2个变量,去看反编译的汇编代码,去看寄存器里的值,可以更好的理解单片机的运行。
单片机的性能评价
在上面提到了,使用2个长整型求和,配合汇编可以很清晰的得到结论,80251 的stc32g的性能远高于8051的stc 增强型单片机。
本帖最后由 gentleman 于 2023-8-4 10:52 编辑
2023/7/28 第二课(4,5,6课时)
心得:依旧有很多收获,意识到自己数电不懂不行,很难理解几种io模式的应用。IAP挺有意思,以前一直在用isp下载程序,从来没接触过IAP(IAP 写eeprom算吗)。
stc32g 外设多,功能多,硬件强大,公司历史悠久,电路设计巧妙。
简单笔记:
stc的发展历史
STC89-STC12-STC15-STC8-STC32G
stc单片机的IAP和ISP
ISP 离线固化程序,stc32g 通过usb 固化
IAP 在线固化程序,理解为两块flash空间,一块是运行中的flash,一块是等待固化烧录
的空间,固化成功后再释放前者。
STC32G系列单片机的功能
这个忘了什么内容,看完回访再补,先放着。
pwm canram 及拓展ram等
stc32单片机命名的规则及封装
以stc32g128k-bate-PDIP40-XXXXXXXXX为例
stc32g 32为8051通用
128k 128k内存空间
bate 测试板,正式没有
PDIP40 封装为40pin引脚
xxxxxxx 生成日期地点等
stc32g系列单片机引脚驱动原理
这部分需要一定的数电基础,本人数电比较薄弱,听不太懂。
可以看出来是通过一系列的逻辑门,来实现不同的功能。
就是没提具体的应用,如果每种模式搭配一个应用的电路图感觉会更好理
解。
stc的硬件下载电路
usb直接下载 d+ d-加上个小保护电阻
输入那里加上保险和稳压二极管,
断电电路也很精妙。采用8a大功率三极管,基本无压降。
环境配置
这个就没啥说的了,下载c251 一路next,把头文件什么的通过stc-isp添加到keil中。
新建项目,把目标编译器设为stc32g,把兼容模式改为c251。然后就可以开发了,
后面似乎有个点灯的例子,时间不够了,就没讲
本帖最后由 gentleman 于 2023-8-12 09:38 编辑
2023/7/29实战课(1-4课时)
心得:了解了数码管的驱动方式, 与以往直接驱动io不同,这节课采用给寄存器赋值的方法,通过硬件驱动数码管。感觉基本能替代额外的数码管驱动芯片,甚至可能更好用。
触摸按键,以前在电磁炉等地方见过。相比传统机械按键,有很多优势,比如防水,安全。
rtc时钟,可以做万年历,桌面时钟等应用,要外部晶振,和电池。不知道以后能不能把晶振搞到内部去,这样外部就更简单了
简单笔记:
数码管驱动:
驱动数码管要先打开特殊寄存器开关;
设置好io的工作模式
数码管分共阴 共阳数码管。也要在寄存器中写好。
设置数码管的刷新频率,最好大于50hz,不然人眼看着晃。
把要显示的数值送到寄存器中。记得定义一个数组存放段码。
驱动成功
触摸按键
手指在触摸时,电容发生改变
---------------- ------------------
\ /
--------------------
使用方式类似与按键。 判断当电容值小于某个值的时候,就说明按键被触摸了
可以使用串口绘图器验证。
RTC 时钟
记得电池和电源使用二极管隔离。
其他需要供电的器件同样使用二极管隔离。
寄存器里有很多值,如年月日等,取出需要的,结合第一部分数码管的驱动内容,把时间显示在数码管上面
2023/8/1 第三课(7,8,9课时)
这节课通过一个简单的实例,来了解整个开发过程。
本以为应该很简单,但是实际的内容非常多。
何老师通过汇编语言,分析了tiny xsmall large等不同的内存模式。
效果很清晰,直接看到tinny 模式下定义的变量a,被搬到了 0x08 地址。
而Xtinny 的变量a 被搬到了0x0008地址。
前者是data 数据区域,而后者是edata区域。区域大小不同。
large模式下的变量通过DPTR 0x0000 放到了外部拓展的ram中。
对于指针的不同,程序似乎没提到? 是不是只有定义指针变量如 int *i; 才可以验证不同模式下指针变量的长度。还是说0x08 与0x0008 就已经说明了不同模式下分别为2字节(16位)与4字节的大小。
手册上建议使用xsmall的内存模式, 该模式默认变量类型为edata ,指针类型 4字节,速度快,大小一般够用。
large模式虽然大,但访问速度慢。(以前遇到过这个问题。在某个速度比较快的协议中,数据比较多, 我用xdata 数组存放的数据,结果由于xdata读取慢,导致协议不能正常通讯。)
tiny 模式data 区域太小 只有128k。
课程中提到了 试验箱的跑马灯不是直接上拉的,而是通过一个三极管上拉。 这样的好处是,由于试验箱上面跑马灯的引脚是与数码管的引脚是复用的。这样做可以在驱动数码管的时候把三极管基极拉高,就不会在驱动数码管时导致跑马灯亮了
编译器优化,默认7级,最高9级。
可以手动在代码中指定某一块的优化等级。
这里有个疑问,为啥不直接用9级的而用7级。9级的不好吗。
c251 编译生成obj 目标文件相对地址
链接生成map 绝对地址
hex 要烧录到单片机里面的机器码。
楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12K128实验箱 或 STC8H8K64U实验箱
=====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载
【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ:2593903262;微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外) STC芯 发表于 2023-8-5 10:59
楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12 ...
谢谢{:4_183:} 本帖最后由 gentleman 于 2023-8-11 06:46 编辑
2023/8/4第10 集
数制
十进制转二进制
长除法 除以2 把余数连起来
比较法 与2^n 比较 获得对应的二进制值
写了个小程序
定义两个 unsinged char a=170 ,b = 90;
定义变量 unsinged char c;
c=a+b;
通过软仿 得出一个有意思的结果
没有进位溢出。
分析汇编代码发现 a 与b 变量
被搬到了 wr4 与wr6 两个16位寄存器 做的 ADD
所以没有溢出
WR6 是r6 r7 拼出来的
最后把r7 取出来 得到结果 c=4;
数制
十进制转小数
长乘法
比较法
负数
符号幅度 有2个0 不适用
补码 msb 符号位-128~127
负数 对应正数原码取反+1 是补码
此处可以参考加法器理解
程序2
定义变量 char a=170 ,b=90;
char c;
c=a+b
a赋值170 但单片机会理解为-86 内存中是0xAA
使用的MOVS 指令 当作有符号的变量
WR6中 FFAA 进行了符号拓展
结果式-86+90 = 4
定点数 小数点固定 Qm.n m+n 为定值
浮点数32位保存 s + 8位e +无尾数m
X=(-1)^S x 1.m x 2 ^(e-bias) bias = 127
会有很小的误差
floatdouble(64)
二进制错误值
nan +inf -inf
程序
定义变量float a=100,b=100;
float c;
c=a+b;
通过汇编 看得到 变量a b 放到了 WR 中
然后搬到了 DR 中
LCALL 调用了一个很复杂的 浮点运算函数
存储器内核 和存储空间映射
不知道多少课时了,按照回放的集数标注吧。
2023/08/08 第十一集
堆栈及指针
跳转指令吧pc的吓一条指令地址保存在堆栈中 ,
跳转指令执行后 再恢复。
建议把edata 区域都给堆栈,用户变量放在xdata中,避免程序出问题
入栈 先入后出 SP总是指向堆顶的位置
复位后 SP 默认0x07
0x08~0x1F 也不能用 是工作寄存器组1~3的地址
keil 建议0x80以上
运算器
ALU
加减乘除
递增递减 BCD
与或取反等
按位运算
cpu取址和译码 生成微控制序列获得功能码
ALU 根据功能码执行不同功能,参考《硬件描述语言》
累加器
A SFR 0xE0
B寄存器
乘除用 乘法保存 积的高8位 (A保存积的低8位)
除法保存余数 (A 保存商)
程序状态字
SFR 0xD0
进位 辅助进位
RS1 RS0 寄存器相关 R0~R7 8个寄存器一组一个地址 配合RS0 RS1 形成32个位 按需使用避免浪费大量寄存器空间
OV溢出标志 RSV 保留
P 奇偶检验位
SFR
与RAM 高128位具有相同的的地址空间
集成大量的外设状态集成器和控制寄存器
CPU --->SFR------> 外设
XSFR
STC 技术创新
在没用到的xdata地址空间 放XSFR的地址空间(编译器其实不知道)
P_SW2 中
EAXSFR 位管访问的是RAM(置0) 还是XSFR (置1)
本帖最后由 gentleman 于 2023-8-11 10:12 编辑
2023/08/08 第十二集
字节存储顺序
小端模式
先存低位
0x1234
0x00x34
0x10x12
大端模式
先存高位
0x00x12
0x10x34
8051 LCALL 小端
其他大端
程序存储器空间映射
0x0000~0xFFFF
MOVC 读flash 数据
复位从0x0000开始
超不过64k 指令集架构限制 做大了也访问不到 就16位指针
中断向量放低地址空间(相当于教室的前门)
flash 特点
10万次
低压禁止操作
不能读
数据flash
IAP/ISP 访问 当eeprom (取替24cxx?)
flash特殊寄存器
IAP_DATA SFR 0xC2
读出来的数据
IAP_ADDRH/L SFR 0XC3/4
操作flash 的高/低8位地址
RS1 RS0
控制读/写指令
IAP_TRIG SFR 0XC6
发0x5a 0xa5 才能操作 有特殊含义
IAP_CONTR SFR 0XC7
IAPEN 开关 1 打开
SWBS 1 从isp监控程序区启动
0 从用户应用程序区启动 有swrst 一起用
SWRST 复位
CMD_FAIL 失败软件清初该位
WT2~WT0 等待时间 根据系统时钟跳转
cpu太快了,要等flash反应一会
PCON SFR 0X87
LVDF位重要 低电压不操作flash
内部RAM
data 128
edata 3840
__________________________________________
FF| | |
| 高128 | 特殊功能寄存器 |
| 内部RAM | SFR |
80|__________________________________________|
7F| | |
| 低128 | |
| | |
00|__________________________________________|
高128RAM 使用 直接寻址访问SFR
SFR 使用 间接寻址访问RAM
这个设计有个问题,是在程序设计中 无法采用间接寻址的模式来访问SFR.比如我想在函数中定义个形式参数 位指针 指向某个IO口 ,想通过指针的方式来操作IO,就不可行,不知道有有没有其他的好办法解决。
片内拓展RAM
edata 0x0000~0xeff
EXTRAM =1 访问
MOVX @DPTR
或 MOVX @Ri
外部拓展存储器
这部分应该用不到,简单了解一下
通过8位3态锁存器 进行IO复用
时序图
存在一定的建立时间与保持时间
本帖最后由 gentleman 于 2023-8-15 13:51 编辑
2023/8/08 第十三集
32位 mcs-251 指令集
24bit 地址总线3个字节
寻址范围大了 原来2个字节16位
xxxx xxxx(段) :yyyy yyyy yyyy yyyy(具体存储单元)
不用MOV MOVC MOVX 这样区分了
类似8086
32/16/8 bit 兼容8位数据总线
EDATA(4K) ————> 原来的256k RAM
如果把程序不放在flash 放在RAM 速度会快,想象空间
24bit地址总线 访问难度减小
flash 128k edata 4kxdata 8k
还没用完,寻址空间大得多 能寻16M
外设拓展很多
DMA 不通过cpu 直接把存储器数据给外设
MDU32 专用乘除法单元
寄存器
保留RS1 RS0
增加1倍可以访问16寄存器
但可以拼 ,依旧不浪费
R0 R1 -> WR0
WR0 WR2 -> DR0
RISC 架构直接简单粗暴的放了 32位寄存器
低16位寄存器支持 位寻址
R11 等效 A
R10 等效 B
兼容原来的8051
DR56 DPX
DR60 SPX
充分兼顾8/16/32位操作