找回密码
 立即注册
楼主: Rain_Personal

跟冲哥学习STC32G128K芯片打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-4-28 18:49:07 | 显示全部楼层
第十八课  ADC采集电源电压和ADC按键

目的:检测电源电压
CHIPID7  内部1.19V参考电压
CHIPID8  内部1.19V参考电压


截图202404281837254481.jpg

ADC的第15通道会形成固定的1.19V,采集ADC时,会将1.19V转换为参考值  比如2048,此时可以根据这个反推Vref参考电压
2048 = 1.19/Vref*4096  ===>  Vref = 1.19/0.5 = 2.38V

ADC按键的原理是,读取ADC的值,判断ADC值,不同的按键会又不同的ADC值,进而判断那个键按下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-4-28 20:45:37 | 显示全部楼层
本帖最后由 Rain_Personal 于 2024-5-15 20:42 编辑

第十九课 NTC温度采集

1. NTC原理

NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热敏电阻。其电阻率和材料常数随材料成分比例、烧结气氛、烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。
检测电阻就可以获取当前温度
截图202404282031193856.jpg

横坐标温度,纵坐标电阻
截图202404282035177292.jpg


Vout可以根据ADC值测得
那么NTC的电阻R2 = Vout*R1/(Vin-Vout)
再根据R2~温度 反推出来温度。

截图202405152041358665.jpg
跳线帽链接红色圆圈中左边两个阵脚,就可以使用NTC测温了,通过手触摸蓝色NTC电阻,就可以改变温度数值,检测对错


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-4-29 19:36:27 | 显示全部楼层
第二十课 串口通信

1. 串口通信是将两个设备通过一定的协议进行信息交换。
截图202404291916063055.jpg


并行通信和串行通信:每次发送一位数据的称为串行通信,多位一起传输的称为并行通信。
串口通信(Serial Communication), 是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

接线方式:
截图202404291918033227.jpg


接受时钟和发送时钟不一定相同,只要相近就可以的属于异步通讯。接收时钟与发送进钟严格同步,通常要有同步时钟。
全双工 半双工和单工的区别,根据用的几条线,单工是单向发送,只能发不能回。
截图202404291921281425.jpg


波特率 表明每秒钟可以发送的数据 例如9600波特率,表示每秒可以发送9600位数据。

串口通讯的距离比较短,一般解决方法为添加专用芯片
截图202404291926556327.jpg


应用:通过串口转以太网,WIFI,蓝牙,zigbee等可以做成路由器,网络插座,智能手环等设备。

2. STC32的串口引脚
截图202404291929476990.jpg


手册是需要熟练掌握的信息!


实验箱中电路图:
截图202404291931578370.jpg




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-5 14:09:09 来自手机 | 显示全部楼层
本帖最后由 Rain_Personal 于 2024-5-15 17:58 编辑

哈哈哈,好事发生,给自己放个假
准备回归工作生活,再琢磨琢磨串口通信问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-8 20:58:28 | 显示全部楼层
Rain_Pe*** 发表于 2024-4-25 17:39
第四课 新建工程并点亮LED灯

上节课未吃透所遇问题

有点难度,现在都没调试完,怎么自动上电下载程序
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:451
  • 最近打卡:2025-06-29 09:00:27
已绑定手机

17

主题

137

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-9 22:42:51 | 显示全部楼层
学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-15 21:18:17 | 显示全部楼层
本帖最后由 Rain_Personal 于 2024-5-16 22:04 编辑

第二十一课  串口应用
串口2的启用方法


void Usart2_Init(void)
{
        P_SW2 = 0X80;
        P_SW2 |= 0X01;                        //将串口2 的引脚切换到P46 P47   0X00  P10 P11
       
        S2CFG = 0X01;
       
        S2CON = 0X50;
        T2L = BRT;
        T2H = BRT>>8;
        T2x12 = 1;
        T2R = 1;
       
        wptr = 0x00;
        rptr = 0x00;
        busy = 0;
}
截图202405162159153418.jpg

void Usart_Isr() interrupt 8
{
        if( S2TI )
        {
                S2TI = 0;
                busy = 0;
        }
        if( S2RI )
        {
                S2RI = 0;
                buffer[wptr++] = S2BUF;
                wptr &= 0X0F;
        }
}

void Usart2_Send(char dat)
{
        while(busy);
        busy = 1;
        S2BUF = dat;
}

void Usart2_SendStr(char *p)
{
        while(*p)
        {
                Usart2_Send(*p++);
        }
}
其中S2BUF 为寄存器地址,可以用于读取和写入
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-17 21:45:02 | 显示全部楼层
第二十二课 CDC串口通信

截图202405172122333715.jpg

无需USB转TTL工具!P30和P31连接电脑D-和D+

截图202405172123458876.jpg

STC32G128K支持自动烧录

具体方法之前探索过,流程如下

1)下载.lib库和头文件
2)新建工程,加载lib库文件
3)调用头文件并初始化USB功能
4)设置工程参数,编译选项等
5)首次下载手动进入HID下载模式下载
6)下载完成等待生成CDC串口号,设置ISP软件参数

执行完如上步骤,再也不需要手动进下载模式了,只要ISP软件点一下下载程序就可以自动烧录。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-17 21:57:06 | 显示全部楼层
第二十三课 看门狗

复位的主要作用是把单片机内部的特殊功能寄存器置于初始状态,使单片机硬件、软件从一个确定的、唯一的起点开始工作。




看门狗是一个计数器,它的基本功能是在软件问题和程序跑偏后重启系统。看门狗正常工作时会自动计数,程序进程会定时将其归零。如果系统在某个地方卡住了或者跑了,定时器就会溢出,是系统强制复位。
检测bug和意外
软件的可靠性一直是一个关键问题。任何使用软件的人都可能遇到电脑死机或程序失控的问题,这种问题在嵌入式系统中也存在。由于单片机抗干扰能力有限,在工业现场仪器仪表中,经常因电压不稳和电弧干扰而死机。在水表、电表无人值守的情况下,系统因干扰无法重启。为了保证系统在受到干扰后能自动恢复正常,看门狗定时器的使用是非常有价值的。

提高单片机运行可靠性


WDT_CONTR寄存器操作看门狗



截图202405172155055263.jpg

CLR_WDT = 1表示喂狗

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:222
  • 最近打卡:2025-06-25 10:21:49

1

主题

65

回帖

423

积分

中级会员

积分
423
发表于 2024-5-18 11:52:11 | 显示全部楼层
第二十四课 比较器



截图202405181147016712.jpg



void CMP_Init(void)
{

    CMPEXCFG = 0x00;
    CMPEXCFG |= 0xc0;                           //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//  CMPEXCFG &= ~0x04;                          //P3.6为CMP-输入脚
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

    CMPEXCFG &= ~0x03;                          //P3.7为CMP+输入脚
//  CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
//  CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
    CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚


    CMPCR2 = 0x00;
    INVCMPO = 0;                                //比较器正向输出
//  INVCMPO = 1;                                //比较器反向输出
    DISFLT = 0;                                 //使能0.1us滤波
//  DISFLT = 1;                                 //禁止0.1us滤波
//  CMPCR2 &= ~0x3f;                            //比较器结果直接输出
    CMPCR2 |= 0x10;                             //比较器结果经过16个去抖时钟后输出

    CMPCR1 = 0x00;
//  PIE = 0;                                    //禁止比较器上升沿中断
    PIE = 1;                                    //使能比较器上升沿中断
//  NIE = 0;                                    //禁止比较器下降沿中断
    NIE = 1;                                    //使能比较器下降沿中断

//  CMPOE = 0;                                  //禁止比较器输出
    CMPOE = 1;                                  //使能比较器输出

    CMPO_S = 0;                                 //选择P3.4作为比较器输出脚
//  CMPO_S = 1;                                 //选择P4.1作为比较器输出脚
    CMPEN = 1;                                  //使能比较器模块
}

sbit LED0 = LED_DATA^0;        # LED0引脚的定义


void CMP_Isr() interrupt 21
{
    CMPIF = 0;                        //清中断标志
        if( CMPRES )                                          //等于1 正端电压大于负端
        {
               
        }
        else
        {
        
        }
    LED0 = CMPRES;                     //中断方式读取比较器比较结果
}

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 15:57 , Processed in 0.150956 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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