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

冲哥STC32G单片机学习笔记

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-19 09:53:49 | 显示全部楼层
本帖最后由 noonezero 于 2023-10-25 15:45 编辑

第二十八课:硬件SPI读写FLASH芯片


1.硬件SPI寄存器介绍
引脚切换


截图202310190855378438.jpg


寄存器
截图202310190856549429.jpg

SPIF:SPI 中断标志位,此标志位需软件方式此位写 1 清零

WCOL:SPI 写冲突标志位,此标志位需软件方式此位写 1 清零

SSIG:SS 引脚功能控制位,确定器件是主机还是从机

SPEN:SPI 使能控制位

DORD:SPI 数据位发送/接收的顺序(0MSB/1LSB)

MSTR:器件主/从模式选择位

CPOL:SPI 时钟极性控制,0为低电平

CPHA:SPI 时钟相位控制

SPR[1:0]:SPI 时钟频率选择



SPDAT:SPI 发送/接收数据缓冲器


这一节最大的问题就是硬件SPI中对于晶振配置的问题,按冲哥视频11M可以用,24M就不行,或许是SPI速率问题?
模式1硬件我看案例改了,模式2 24M还不行
先跳过,以后填坑
代码:
SPI软硬.zip (104.65 KB, 下载次数: 221)





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-26 06:21:02 | 显示全部楼层
第二十九课:SPI读写FLASH芯片


代码:

读写Flash芯片.zip (129.1 KB, 下载次数: 169)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-10-30 06:27:25 | 显示全部楼层
本帖最后由 noonezero 于 2023-11-1 08:08 编辑

第三十课:软件模拟IIC


IIC介绍
IIC总线是一种简单、双向二线制同步串行总线,只需要两根线就可以在连接于总线上的器件之间传递消息
简单来说就是一个线来控制时钟(SCL)和一个线来发送数据(SDA)
两个线按照一定的传输协议来进行传输数据。由于只有一根线来读写数据,也就意味着同一时间只能有一个发送设备
(这里我们将产生时钟信号的设备称为主机,一条IIC总线同一时间只会有一个主机)
截图202310300627168505.jpg


主机写入数据
截图202310300711149621.jpg


主机读取数据
截图202310300711549710.jpg


代码:
软件IIC读写.zip (112.29 KB, 下载次数: 192)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-11-1 09:25:46 | 显示全部楼层
本帖最后由 noonezero 于 2023-11-1 10:34 编辑

第三十一课:硬件模拟IIC
STC32G12K128 系列没有超时控制功能

1.与标准 IIC 协议相比较,忽略了两种机制
发送起始信号(START)后不进行仲裁


时钟信号(SCL)停留在低电平时不进行超时检测



2.IIC功能引脚切换
截图202311010900468085.jpg



3.配置
截图202311010910276319.jpg

ENI2C:IIC 功能使能控制位

MSSL:IIC主从机设定
MSSPEED[5:0]:总线速度



截图202311010912025634.jpg

EMSI:主机模式中断使能控制位

MSCMD[3:0]:主机命令



截图202311010922408539.jpg

WDTA:主机模式时 IIC 数据自动发送允许位



截图202311010923175464.jpg

MSBUSY:主机模式时 IIC 控制器状态位(只读)

MSACKI:主机模式时,发送“0011”命令到 I2CMSCR 的 MSCMD 位后所接收到的 ACK 数据。(只读位)

MSACKO:主机模式时,准备将要发送出去的 ACK 信号。当发送“0101”命令到 I2CMSCR 的 MSCMD位后,控制器会自动读取此位的数据当作 ACK 发送到 SDA



代码:
截图202311011032498637.jpg


开机读取可以正常读取,+1写入以后在读取就读取失败了
上电再次读取还是ok,问题还在找,找出来填坑


硬件IIC读写.zip (111.15 KB, 下载次数: 207)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-11-1 11:30:42 | 显示全部楼层
第三十二课:串口EEPROM芯片数据读写


暂时略过
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-11-1 11:47:11 | 显示全部楼层
第三十三课:PWM基础



波形和相关术语
截图202311011132117673.jpg

波形表示信号的形状、形式,这个信号可以是波在物理介质上的移动,也可以是其他物理量的抽象表达形式。
电子行业的波形代指电压在时间基准上的表达形式


有PWM转换器(脉冲宽度调制)和PFM转换器(脉冲频率调制
PWM转换器,长度不变,改变占空比

PFM转换器,改变频率



术语
幅值:高低电平电压差
正脉宽:高电平时间
负脉宽:低电平时间
周期:高电平+低电平时间
频率:周期的倒数1/周期
占空比:高电平占周期的百分比
死区:两路方波之间高电平之间的时间差
相位差:方波移相


PWM
PWM控制技术就是对脉冲宽度进行调制的技术,即通过一系列的脉冲宽度进行调制,来等效所需的波形(含形状和幅值)


等效电压
占空比*高电平


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-11-9 06:43:57 | 显示全部楼层
本帖最后由 noonezero 于 2023-11-16 09:34 编辑

第三十四课:单通道PWM输出


1.PWM配置流程和寄存器讲解

截图202311090622128718.jpg

PWM输出框架示意图 图片太大,转压缩包

PWM输出框架示意图.zip (4.31 MB, 下载次数: 181)



代码:
  1. #include <STC32G.H>
  2. #include "../COMM/stc32_stc8_usb.h"
  3. void sys_init();
  4. //USB调试及复位所需定义
  5. char *USER_DEVICEDESC = NULL;
  6. char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. #define PWM_ARR 999
  9. #define PWM_CCR 500
  10. // PWMA初始化
  11. // 输出频率:sysclk / (pscr + 1)/(arr + 1) = 22118400 / 1 / (999 + 1) = 22118.4hz = 22.1184khz
  12. // 占空比:ccr/ (arr + 1) * 100% = 500/(999+1) = 50%
  13. void PWMA_Init(void)
  14. {
  15.         // 时钟选择,默认22.1184
  16.        
  17.         // 时基单元选择
  18.         PWMA_PSCRH = 0;                // 1分频
  19.         PWMA_PSCRL = 0;
  20.        
  21.         PWMA_ARRH = (u8)(PWM_ARR >> 8);
  22.         PWMA_ARRL = (u8)PWM_ARR;
  23.        
  24.         PWMA_CCR1H = (u8)(PWM_CCR >> 8);
  25.         PWMA_CCR1L = (u8)PWM_CCR;
  26.        
  27.         // 输入输出引脚配置
  28.         PWMA_ENO = 0x00;        // 使能PWM1通道输出
  29.         PWMA_ENO |= 0x01;
  30.        
  31.         PWMA_PS = 0x00;                // 选择PWM1从P60引脚输出
  32.         PWMA_PS |= (2<<0);// 选择PWM1从P60引脚输出
  33.        
  34.         // 输入输出模式设置
  35.         PWMA_CCER1 = 0x00;
  36.         PWMA_CCMR1 = 0x68;        // PWM模式1,配置置位输出
  37.         PWMA_CCER1 = 0x01;        // 开启输出比较通道
  38.        
  39.         PWMA_BKR = 0x80;        // 使能主输出
  40.         PWMA_CR1 |= 0x01;        // 启动计数器
  41.        
  42. }
  43. void main()
  44. {
  45.         sys_init();
  46.        
  47.        
  48.         IRC48MCR = 0x80;                                // 使能内部48M的USB专用IRC
  49.         while(!(IRC48MCR & 0x01));
  50.         USBCLK = 0x00;                                        // 设置USB时钟源为内部48M的USB专用IRC
  51.         USBCON = 0x90;                                        // 使能USB功能
  52.        
  53.         usb_init();                                                // 调用USB CDC初始化库函数
  54.         EA = 1;
  55.         EUSB = 1;                                                // 使能USB中断
  56.        
  57.         while(DeviceState != DEVSTATE_CONFIGURED);        // 等待USB配置完成
  58.        
  59.         P40 = 0;
  60.         P61 = 0;
  61.         PWMA_Init();
  62.        
  63.         while(1)
  64.         {
  65.                 if (bUsbOutReady)                                                        // 当硬件接收完成上位机通过串口助手发送数据后会自动将
  66.         {                                                                                        // bUsbOutReady 置1
  67.             USB_SendData(UsbOutBuffer, OutNumber);        // 接收的数据字节数保存在OutNumber变量中
  68.             usb_OUT_done();                                                        // 接收的数据保存在UsbOutBuffer缓存区
  69.                         printf("lailelaodi");
  70.                 }                                                                                        // 使用USB_SendData库函数可向上位机发送数据
  71.                                                                                                         // 调用usb_OUT_done 准备接收下一笔数据
  72.                
  73.         }
  74. }
  75. void sys_init()
  76. {
  77.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  78.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  79.     CKCON = 0; //提高访问XRAM速度
  80.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  81.     P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
  82.     P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
  83.     P3M1 = 0x53;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
  84.         // P30/P31和USB的D-/D+共用PIN脚 需要将P30 P31设置为高阻输入模式
  85.     P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
  86.     P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
  87.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  88.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  89. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-04 11:02:22

2

主题

87

回帖

898

积分

高级会员

积分
898
发表于 2023-11-17 09:03:06 | 显示全部楼层
本帖最后由 noonezero 于 2023-11-17 10:04 编辑

第三十五课:任意频率和占空比的PWM输出


1.任意频率和占空比的PWM输出
边沿对齐PWM频率 = SYSclk/((PSCR+1)*(ARR+1))
(PSCR+1)*(ARR+1) = SYSclk/边沿对齐PWM频率



PSCR和ARR数值最大65535

设主时钟为24Mhz,需要输出的PWM频率为50HZ,ARR和PSCR取值?10KHZ?
50HZ下
(PSCR+1)*(ARR+1) = 24000000/50 = 480000
(ARR+1) = 480000 / 2/2/2=60000
PSCR = 7
ARR = 59999


10HZ下
(PSCR+1)*(ARR+1) = 24000000/10000 = 2400

PSCR = 0
ARR = 2399



2.互补/同相PWM输出
截图202311170854276657.jpg

如何使能互补/同相输出
1.使能ENO寄存器,打开互补输出通道
2.CCERx寄存器打开 比较输出使能


如何设置输出的另一半波形是互补还是同相
1.CCERx寄存器设置比较输出极性



3.带死区的互补PWM输出

截图202311170900083454.jpg

截图202311170901297821.jpg

死区计算
截图202311171003489943.jpg
死区时间计算图表
寄存器配置.xlsx (30.64 KB, 下载次数: 227)



回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-7 11:54 , Processed in 0.138484 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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