找回密码
 立即注册
查看: 8752|回复: 41

【实验箱已收到】何老师 《STC32位8051单片机原理及应用-STC32G12K128》,打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-7-25 18:45:23 | 显示全部楼层 |阅读模式
本帖最后由 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 增强型单片机。



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-7-28 17:37:12 | 显示全部楼层
本帖最后由 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 can  ram 及拓展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。然后就可以开发了,
                            后面似乎有个点灯的例子,时间不够了,就没讲
                        
                        
                              
                          


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-7-31 10:32:26 | 显示全部楼层
本帖最后由 gentleman 于 2023-8-12 09:38 编辑

2023/7/29  实战课(1-4课时)
      心得:了解了数码管的驱动方式, 与以往直接驱动io不同,这节课采用给寄存器赋值的方法,通过硬件驱动数码管。感觉基本能替代额外的数码管驱动芯片,甚至可能更好用。
                触摸按键,以前在电磁炉等地方见过。相比传统机械按键,有很多优势,比如防水,安全。
                rtc时钟,可以做万年历,桌面时钟等应用,要外部晶振,和电池。不知道以后能不能把晶振搞到内部去,这样外部就更简单了

      简单笔记:
               数码管驱动:
                       驱动数码管要先打开特殊寄存器开关;
                       设置好io的工作模式
                      数码管分共阴 共阳数码管。也要在寄存器中写好。
                      设置数码管的刷新频率,最好大于50hz,不然人眼看着晃。
                       把要显示的数值送到寄存器中。记得定义一个数组存放段码。
                       驱动成功
                触摸按键
                       手指在触摸时,电容发生改变
                        ----------------                             ------------------
                                           \                         /
                                             --------------------

                        使用方式类似与按键。 判断当电容值小于某个值的时候,就说明按键被触摸了
                        可以使用串口绘图器验证。

              RTC 时钟
                       记得电池和电源使用二极管隔离。
                       其他需要供电的器件同样使用二极管隔离。
                       寄存器里有很多值,如年月日等,取出需要的,结合第一部分数码管的驱动内容,把时间显示在数码管上面                        


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-4 08:56:21 | 显示全部楼层
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                            要烧录到单片机里面的机器码。

      
     

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2023-12-18 15:13:58

4

主题

216

回帖

886

积分

高级会员

积分
886
发表于 2023-8-5 10:59:28 | 显示全部楼层
楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 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(周一 到 周五, 法定节假日除外)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-6 08:41:01 | 显示全部楼层
STC芯 发表于 2023-8-5 10:59
楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12 ...

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-8 07:14:02 | 显示全部楼层
本帖最后由 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
                        会有很小的误差
                       float  double(64)
                       二进制错误值
                       nan +inf -inf
            程序
                    定义变量  float a=100,b=100;
                                   float c;
                                   c=a+b;
                    通过汇编 看得到 变量a b 放到了 WR 中
                                  然后搬到了 DR 中
                                  LCALL 调用了一个很复杂的 浮点运算函数   
            
             存储器内核 和存储空间映射   
                             
                     





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-11 07:19:20 | 显示全部楼层

不知道多少课时了,按照回放的集数标注吧。
2023/08/08 第十一集
         堆栈及指针


                跳转指令  吧pc的吓一条指令地址保存在堆栈中 ,
                跳转指令执行后 再恢复。

         1.jpeg

                建议把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
                2.jpeg
                进位   辅助进位
                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)
                     
                     
                  
           
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-11 09:32:14 | 显示全部楼层
本帖最后由 gentleman 于 2023-8-11 10:12 编辑

2023/08/08 第十二集
      字节存储顺序
             小端模式
                    先存低位

                     0x1234
                     0x0  0x34
                     0x1  0x12

              大端模式
                     先存高位

                     0x0  0x12
                     0x1  0x34


             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
                       控制读/写指令
                
                        1.jpeg

                IAP_TRIG      SFR 0XC6
                发0x5a 0xa5 才能操作 有特殊含义
                IAP_CONTR   SFR 0XC7
             2.jpeg

              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复用
                    时序图
                   3.jpeg
                   存在一定的建立时间与保持时间

     




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2023-8-11 10:48:11 | 显示全部楼层
本帖最后由 gentleman 于 2023-8-15 13:51 编辑

2023/8/08 第十三集
       32位 mcs-251 指令集
  
             1.jpeg
             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 4k  xdata 8k
                     还没用完,寻址空间大得多 能寻16M


             外设拓展很多
                     DMA 不通过cpu 直接把存储器数据给外设
             MDU32 专用乘除法单元
              
             寄存器
                   2.jpeg
                   保留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位操作




               

     
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 01:17 , Processed in 0.140127 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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