32G的学习打卡
记录一下在做毕设的过程中对32G的学习心得。第一集
在大三,学习了原著李全利,主编仲伟峰编写的单片机原理及接口技术,还做了以STC89C52为MCU的单片机实验。STC32G的性能更强大,在相同的工作频率下,STC32G系列单片机比传统8051约快70倍以上。希望能够通过对STC32G的学习,完成小型温室控制。
1、单片机,英文Micro Controller Unit,简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制 。单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。
2、分类:
(1)按处理能力分类:
低端单片机:处理能力较弱,适用于简单的控制应用。
中端单片机:具有一定的处理能力,适用于中等复杂度的控制系统。
高端单片机:处理能力强,适用于复杂的控制系统和计算密集型应用。
(2)按指令集分类:
复杂指令集单片机(CISC):指令丰富,操作复杂,适用于多种应用场景。
精简指令集单片机(RISC):指令简单,执行速度快,功耗低。
(3)按位数分类:
4位单片机:处理能力有限,适用于简单的控制任务。
8位单片机:应用最广泛,如8051系列。
16位单片机:处理能力更强,适用于较为复杂的控制系统。
32位单片机:具有更高的处理能力和更多的功能,适用于高端应用。
(4)按用途分类:
通用型单片机:适用于多种场合。
专用型单片机:针对特定应用设计,如汽车电子、家电控制等。
3、主要组成部分
-CPU:相当于单片机的“大脑”,负责执行指令、进行数据运算和逻辑处理。
- 存储器:包括程序存储器(如ROM、FLASH等)用来存储程序代码,数据存储器(如RAM)用于临时存储运算数据和中间结果。
- I/O接口:是单片机与外部设备连接的桥梁,可实现数据的输入输出,如连接传感器、执行机构等。
- 定时器/计数器:能实现定时功能,为系统提供时间基准,也可对外部事件进行计数。
- 中断系统:允许外部设备或内部事件打断CPU的正常运行,使CPU能及时响应处理紧急任务。
4、单片机执行指令的过程就是从ROM取出一条指令执行来完成它在各个地方的作用,每访问一次ROM的时间,就是一个机器周期的时间。
1个机器周期 = 6个状态周期 = 12个时钟(振荡)周期
时钟周期:即单片机的基本时间单位,若晶体的频率=12MHZ,那时钟周期 = 1/12MHZ,一个时钟周期 = 1/12MHZ = 1/12000 000每秒
机器周期:即12x1/12 000 000 =0.000001s = 1us,访问一次ROM取指令的时间就是1us。
5、编程语言
汇编语言:与单片机硬件紧密相关,指令与机器码一一对应,能精准控制硬件,但编程效率低、可移植性差。
C语言:应用广泛,具有丰富的数据类型和运算符,编程效率高、可移植性强,能很好地控制单片机硬件,便于理解和维护。
32G库函数-STC单片机教学视频 国芯技术交流网站 - AI32位8051交流社区
视频教学:《32位8051单片机原理及应用》,一等奖2万, 送实验箱; 冲哥版 - 视频教学,《单片机原理及应用》教学改革及实战技术交流会,本版限制发帖 国芯技术交流网站 - AI32位8051交流社区
第二集
通过视频了解了实验箱上各个器件以及它的用途.NTC测温是模拟测温,它采集它连续的一个电压信号,只要ADC采集的速度够快采集的电压信号越来越平缓。18B20测温是数字测温,精度越高速度越慢采集的间隔越久,它是数字的每次只会输出一次温度的数值,处理读取都需要时间,它占用的时间周期会更长。理解了ADC模拟转成一个数字量的过程 ,及基准电压的意义。
用这个板子做一个能检测温湿度,光照强度,并对其进行控制的温室。
1、STC32G系列单片机是基于优化的8051内核架构,采用单时钟周期(1T)设计,在相同主频下性能较传统8051提升约70倍,兼具高速运算与低功耗特性。其内置高精度R/C时钟(精度±0.3%),支持4-33MHz宽频设置,无需外部晶振即可稳定运行,同时集成高可靠性复位电路,进一步简化硬件设计。该系列单片机提供丰富的外设资源,包括4路串口、5个定时器、2组带死区控制的16位高级PWM、12位ADC、CAN总线、USB接口及DMA控制器等,可满足工业控制、电机驱动、物联网设备等多样化场景需求。开发方面,STC32G采用C251编译器,兼容传统8051开发者的编程习惯,官方提供完整的工具链及开源例程,支持FreeRTOS实时操作系统,降低了从8位到32位平台的迁移门槛。此外,STC32G以51单片机的成本提供32位性能,内置硬件加密功能,具备强抗干扰和宽电压(1.9V-5.5V)特性,尤其适合对成本敏感且要求高可靠性的应用领域。
2、实验箱
3、STC32G12K128最小系统
4、单片机命名规则
第三集
1、STC-ISP软件的下载,STC-ISP 是一款单片机开发工具软件,专为 STC 系列 8051 内核单片机设计。它集成了程序下载、调试、参数配置等核心功能,是 STC 单片机开发者常用的工具之一。
(1)核心功能:程序下载与擦除,支持通过 USB-TTL 串口或专用下载器(如 STC-USB Link1)将编译后的 HEX/BIN 文件烧录至 STC 单片机。支持自动检测串口、一键擦除芯片内容,并可在下载时自定义时钟频率、复位引脚等参数;串口调试工具,内置串口助手,支持收发 ASCII/HEX 格式数据,可设置波特率、数据位等参数,方便开发者与单片机进行实时通信调试;范例代码与头文件生成,提供常用功能的代码模板(如定时器、ADC、PWM 等),支持自动生
成对应型号的寄存器定义头文件,加速开发流程;芯片参数配置,可图形化配置单片机的内部时钟、复位选项、低压检测、看门狗等参数,自动生成初始化代码,避免手动配置寄存器的繁琐。
(2) 操作流程:硬件连接,通过 USB 转 TTL 模块或TypC连接单片机与电脑,确保电源和串口通信正常;选择芯片型号,在软件界面中选择目标单片机型号(如 STC89C52、STC32G12K128 等);导入 HEX 文件,载入 Keil 或其他 IDE 编译生成的 HEX 文件;配置参数,设置时钟频率、复位引脚选项等,生成初始化代码;下载程序,点击“下载/编程”按钮,重启单片机完成烧录;调试验证,通过内置串口助手或外接调试工具验证程序功能。
(3)软件优势
易用性:界面简洁,支持一键下载和自动检测硬件,适合新手快速上手。
集成化工具:无需额外安装驱动或调试工具,串口助手、代码生成器等功能高度整合。
免费且持续更新:STC 官方提供免费下载,并针对新型号单片机持续优化功能。
本地化支持:全中文界面及文档,降低学习门槛。
(4)兼容性
操作系统:支持 Windows XP/7/10/11,部分版本兼容 Linux(需配置 Wine)。
硬件支持:覆盖 STC 全系列单片机(如 STC8、STC15、STC32 等),适配主流 USB-TTL 模块(如 CH340、CP2102)。
开发环境联动:可与 Keil、IAR 等 IDE 配合使用,直接调用生成的 HEX 文件。
2、Keil
Keil是一款由美国公司开发,后被ARM公司收购的专业嵌入式软件开发工具,在全球嵌入式系统开发领域应用极为广泛。它提供了集成开发环境(IDE),将项目管理、代码编辑、编译、调试等功能集成于一体,支持多种编程语言,如C、C++和汇编语言等,能满足不同开发者的需求。其编译器高效且优化能力强,可将源代码转换为目标芯片能执行的机器码,生成的代码紧凑、运行效率高。调试功能也非常强大,支持软件仿真和硬件调试,开发者可通过设置断点、观察变量、单步执行等操作,快速定位和解决代码中的问题。此外,Keil具有丰富的设备库和示例代码,方便开发者快速上手不同的芯片平台,还支持多种芯片架构,包括ARM、8051等,为不同类型的嵌入式项目开发提供了有力支持。
STC32G12K128需要安装C251的编译环境
3、点亮LED
第四集上
学习了GPIO口是通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制他输出高低电平。它有四种模式:准双向口、推挽输出、高阻输入、开漏输出。准双向口既可以向外输出高低电平又可以读取外部的高低电平。用sbit 能够实现单独控制一个引脚。点亮第一个LED灯,我根据自己买的MCU的原理图对小灯的控制引脚进行编写,实现点亮。
单片机的I/O口配置为准双向口,当I/O口输出高电平时,对于共阴极接法的LED,电流从I/O口流出,经过限流电阻后流向LED的阳极,由于阴极接地为低电平,LED两端形成正向电压差,使得LED内部的PN结导通,电子与空穴复合发光。对于共阳极接法的LED,当I/O口输出低电平时,LED阳极接高电平,阴极通过I/O口接地为低电平,LED两端有正向电压差,PN结导通从而发光。限流电阻的作用是限制通过LED的电流,防止电流过大损坏LED。
输出电压=VCC就是高电平,输出电压=GND就是低电平,分别用1和0来表示。
单片机通过对I/O口输出电平的控制,来决定LED是否导通发光,进而实现对LED的点亮、熄灭以及闪烁等各种控制操作。
GPIO口如果设置成其他模式会有什么区别?
第四集下
我下去改了一下代码,将P2口分别设置成了推挽输出、开漏输出,没看出来小灯的变化。编译是从头到尾编译的,函数定义在末尾时,要在前面进行函数声明。在使用#include引入头文件是,如果头文件在文件夹里,也需要引入文件夹的路径。
当项目处于开发阶段时,需要反复的下载用户代码到目标芯片中进行代码验证,使用 USB 模式对STC 的单片机进行正常的 ISP 下载,需要先将 P3.2 口短路到 GND,然后对目标芯片进行重新上电,从而会使得项目在开发阶段烧录步骤比较繁琐。为此 STC 单片机增加了一个特殊功能寄存器 IAP CONTR当用户向此寄存器写入 0x60,即可实现软件复位到系统区,进而实现不停电就可进行 ISP 下载。
不停电下载:
1、下载最新版本的 STC-ISP 下载软件
2、选择正确的单片机型号
3、打开“收到用户命令后复位到 ISP 监控程序区”选项页
4、选择“USB(HID)模式”,并设置 USB 设备的 VID 和 PID,STC 提供的范例中的 VID 为“34BF”PID 为“FF01”
5、选择 HEX 模式或者文本模式
6、设置自定义下载命令,需要和代码中的自定义命令相一致
7、选择上这两项,当目标代码重新编译后,STC-ISP 下载软件便会自动发送复位命令,并自动开始
USB 模式的 ISP 下载
若需要使用此模式,则必须将 STC 提供的“stc usb hid.lib”代码库添加到项目中,并按照下图所示的方式设置自定义下载命令。若要改成CDC,将“stc usb cdc.lib”代码库代替“stc usb hid.lib”代码库添加到项目中, 并添加USBCLK = 0x00;USBCON = 0x90;使用CDC功能需要使用这两行,HID功能禁用这两行
在做不停电下载时,编译完成后为什么会有40个警告?
第五集上
编辑代码,下载到单片机,在串口助手里打开串口发送“1”,接收到“Hello World!”。文本模式的一个汉字对应HEX模式的两个数。
格式字符是以%开头用一个字母或者两个字母去实现一个特殊字符的定义。
%d 以十进制整数形式输出
%ld 以十进制长整形输出
%f 以单精度浮点型输出
%lf 以双精度浮点型输出
%o 以八进制整型输出整数
%x或%X 以十六进制形式输出整数
%u 以十进制无符号整形输出
%i 以十进制整形输出
%c 输出单个字符
%s 输出字符串
%e或%E 以指数形式输出
%g或%G 自适应数据输出
%p 输出地址
转义字符
\? 在书写连续多个问号时使用,防止他们被解析成三字字词
\’ 用于表示字符常量
\’’ 用于表示一个字符窗内部的双引号
\\ 用于表示一个反斜杠,防止他被解释为一个转义序列符
\a 警告字符,蜂鸣
\b 退格符
\f 换页符
\n 换行符
\r 回车
\t 水平制表符(8个字符)
\v 垂直制表符
\ddd ddd表示1-3个八进制的数字,如:\120
\xdd dd表示2个十六进制数字,如:\x30
进制之间的转换:
十进制与二进制转换:
十进制转二进制:采用“除2取余,逆序排列”法。将十进制数除以2,取余数,再将商继续除以2,直到商为0。然后将所有余数从下到上排列,即为二进制数。例如,将十进制数13转换为二进制数,13÷2 = 6余1,6÷2 = 3余0,3÷2 = 1余1,1÷2 = 0余1,所以13的二进制表示为1101。
二进制转十进制:采用“按权展开,逐项相加”法。从二进制数的右往左,将每一位数字乘以2的相应位数次幂,然后将所有结果相加。例如,二进制数1011转换为十进制数,1*2^0 + 1*2^1 + 0*2^2 + 1*2^3=1 + 2 + 0 + 8 = 11。
十进制与八进制转换:
十进制转八进制:采用“除8取余,逆序排列”法。与十进制转二进制类似,将十进制数除以8,取余数,再将商继续除以8,直到商为0。然后将所有余数从下到上排列,得到八进制数。
八进制转十进制:采用“按权展开,逐项相加”法。从八进制数的右往左,将每一位数字乘以8的相应位数次幂,然后将所有结果相加。
十进制与十六进制转换:
十进制转十六进制:采用“除16取余,逆序排列”法。用十进制数除以16,取余数,再将商继续除以16,直到商为0。余数用0 - 9和A - F表示,然后将所有余数从下到上排列,得到十六进制数。
十六进制转十进制:采用“按权展开,逐项相加”法。从十六进制数的右往左,将每一位数字乘以16的相应位数次幂,然后将所有结果相加。
二进制与八进制转换
二进制转八进制:将二进制数从右往左每三位一组,不足三位的在左边补0,然后将每组二进制数转换为对应的八进制数。例如,二进制数11011转换为八进制数,分组为011 011,分别转换为3和3,所以结果为33。
八进制转二进制:将八进制数的每一位转换为对应的三位二进制数,然后依次连接起来。
二进制与十六进制转换
二进制转十六进制:将二进制数从右往左每四位一组,不足四位的在左边补0,然后将每组二进制数转换为对应的十六进制数。
十六进制转二进制:将十六进制数的每一位转换为对应的四位二进制数,然后依次连接起来。
第五集下
C语言的运算符主要包括以下几类:
算术运算符:用于各类算术运算,包括加法“+”、减法“-”、乘法“*”、除法“/”、取余“%”。
关系运算符:用于比较两个操作数的大小或相等关系,有大于“>”、小于“<”、大于等于“>=”、小于等于“<=”、等于“==”、不等于“!=”。
逻辑运算符:用于进行逻辑运算,包括逻辑与“&&”、逻辑或“||”、逻辑非“!”。
位运算符:对操作数的二进制位进行操作,有按位与“&”、按位或“|”、按位异或“^”、按位取反“~”、左移“<<”、右移“>>”。
赋值运算符:用于给变量赋值,有简单赋值“=”以及复合赋值运算符如“+=”“-=”“*=”“/=”“%=”等。
杂项运算符:sizeof和三元
C语言的运算优先级
C语言的常用运算符
算术运算符加(+)减(-)乘(*)除(/);模(余)运算符(%):不允许出现浮点型,余数正负取决于被除数正负;自增(++i,--i;i++,i--)
位运算符右移(>>)左移(<<);按位与(&);按位或(|);按位异或(^)取反(~)
赋值运算符+=加赋值(a += 3等价于a = a + 3);-=减赋值;*=乘赋值;/=除赋值;%=求余赋值;&=按位与赋值;|=按位或赋值;^=按位异或赋值;<<=左移位赋值(>>=右移位赋值)
进行与运算时,相同位上同时为1,才能出1,全1为1。或运算是只要有一个1就能出1。异或相反出1。
数据类型
bit 0 to 1
signed char -128—+127
unsigned char 0—255
signed short int -32768—+32767
unsigned short int 0-65535
signed int -32768—+32767
unsigned int 0—65535
signed long int -2147483648—+2147483647
unsigned long int 0—4294967295
float +-1.175494E-38—+-30402823E+38
double +-1.175494E-38—+-30402823E+38
sbit 0 or 1
sfr 0—255
sfr16 0—65535
第六集上
基于Delay函数实现LED的闪烁,单位换算1秒=1000毫秒=1000000微妙。define函数的用法,用define后面的名称去代替名称后面需要定义的内容。typedef的用法,它是用末尾的名称代替typedef后面的名称,结尾加一个分号。
延时函数的原理:利用CPU执行指令需要时间的特点,通过让CPU执行大量无实际意义的循环操作来消耗时间。循环次数越多,消耗的时间就越长,从而实现延时效果。
while的用法括号里的条件要是否为真(条件是否等于0,是0就是假,非0就是真)则执行大括号里的功能A每执行完一次在回到while判断,直到为假跳出循环,往下执行。do while开始了以后会先执行一次大括号里的功能,然后再去判断条件若条件为真则继续执行功能,若为假则跳出循环往下执行。
在C语言中, a++ 、 ++a 、 a-- 、 --a 均为自增/自减运算符,它们的区别主要体现在运算顺序和表达式结果上:
1. 前置运算符(++a / --a)
运算顺序:先对变量本身进行增/减操作,再参与表达式的运算。
表达式结果:运算后的变量值。
int a = 5;
int b = ++a;// 先执行 a = a + 1 → a=6,再将6赋值给b → b=6
int c = --a;// 先执行 a = a - 1 → a=5,再将5赋值给c → c=5
2. 后置运算符(a++ / a--)
运算顺序:先使用变量原来的值参与表达式运算,再对变量本身进行增/减操作。
表达式结果:变量原来的值。
int a = 5;
int b = a++;// 先将a的值5赋值给b → b=5,再执行 a = a + 1 → a=6
int c = a--;// 先将a的值6赋值给c → c=6,再执行 a = a - 1 → a=5
3. 对比
运算符 运算顺序 表达式结果 变量最终值
++a 先自增,再参与运算 a+1 a+1
a++ 先参与运算,再自增 a a+1
--a 先自减,再参与运算 a-1 a-1
a-- 先参与运算,再自减 a a-1
4. 常见应用场景
独立语句中:
前置和后置的效果相同,仅改变变量值,不影响其他运算。
a++;// 等价于 a = a + 1;
++a;// 同上
表达式中:
前置和后置的结果不同,需根据逻辑选择。
int x = 10, y = 20;
int result = x++ + ++y;// 先计算 x=10(x++后变为11),y=21(++y后变为21),结果为10+21=31
优先级:自增/自减运算符的优先级高于大多数算术运算符,但低于括号 () 。
int a = 2, b = 3;
int c = a++ + b;// 等价于 (a++) + b → a=2+3=5,a变为3
代码