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

STC32G核心板学习记录

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-9 08:12:34 | 显示全部楼层
学习冲哥STC32G教学视频    https://www.stcaimcu.com/thread-323-1-1.html

第14集    外部中断学习笔记

外部中断1的初始化,下降沿触发测试程序

  1. void INT1_Init(void)
  2. {
  3.     // 步骤1:配置INT1对应引脚(P3.3)为输入模式
  4.     P3M0 &= ~(1 << 3);  // P3.3模式0清零
  5.     P3M1 &= ~(1 << 3);  // P3.3模式1清零 → 准双向口(默认输入模式)
  6.    
  7.     // 步骤2:配置INT1触发方式为下降沿
  8.     IT1 = 1;            // IT1=1:下降沿触发;IT1=0:低电平触发
  9.    
  10.     // 步骤3:使能外部中断1
  11.     EX1 = 1;            // 开启外部中断1使能
  12.    
  13.     // 步骤4:配置中断优先级(可选,默认低优先级)
  14.     PX1 = 0;            // PX1=1:高优先级;PX1=0:低优先级
  15.    
  16.     // 步骤5:开启总中断(必须!否则所有中断无效)
  17.     EA = 1;
  18. }
  19. /**
  20. * @brief 外部中断1中断服务函数
  21. * @note 中断号必须为2,否则中断无法触发
  22. */
  23. void INT1_ISR(void) interrupt 2
  24. {
  25.      // 延时10ms,避免机械按键抖动导致多次触发
  26.     u16 i;
  27.     for(i=0; i<24000; i++);  // 24MHz主频下约10ms延时
  28.    
  29.     // 验证中断触发(可替换为自定义业务逻辑)
  30.     INT1_Trigger_Flag = 1;   // 置触发标志位
  31.     P00 = ~P00;              // 翻转P0.0口LED,直观显示中断触发
  32. }
  33. // 主函数测试
  34. void main(void)
  35. {
  36.     // 初始化P0.0为输出(用于LED指示)
  37.     P0M0 |= (1 << 0);
  38.     P0M1 &= ~(1 << 0);
  39.     P00 = 1;  // 初始熄灭LED
  40.    
  41.     // 初始化外部中断1
  42.     INT1_Init();
  43.    
  44.     while(1)
  45.     {
  46.         // 主函数中检测中断触发标志
  47.         if(INT1_Trigger_Flag == 1)
  48.         {
  49.             INT1_Trigger_Flag = 0;  // 清空标志位
  50.             // 可添加自定义业务逻辑(如按键功能、数据采集等)
  51.         }
  52.     }
  53. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-9 08:50:48 | 显示全部楼层
学习冲哥STC32G教学视频    https://www.stcaimcu.com/thread-323-1-1.html

第15集    IO中断学习笔记

io--P35 的初始化,低电平触发测试程序,这是STC32G独有的功能,上升沿、下降沿暂不推荐使用!
  1. void P3Exit_Init(void)
  2. {
  3.         P3IM0 = 0X00;
  4.         P3IM1 = 0XFF;                                       
  5.         P3INTE = 0X20;                               
  6. }
复制代码



P54 引脚的高电平触发外部中断,类比如下
  1. // 定义一个全局变量用于中断触发计数
  2. unsigned int interrupt_count = 0;
  3. /**
  4. * @brief P54引脚外部中断初始化函数(高电平触发)
  5. * @note  配置P54为高电平触发的外部中断
  6. */
  7. void P5Exit_Init(void)
  8. {
  9.     // 关闭总中断(防止初始化过程中触发中断)
  10.     EA = 0;
  11.    
  12.     // P5口中断模式配置
  13.     P5IM0 = 0XFF;        // P5口中断模式0寄存器,全1
  14.     P5IM1 = 0XFF;        // P5口中断模式1寄存器,全1 → 配置为高电平触发中断
  15.     P5INTE = 0X10;       // 0001 0000 → 使能P54引脚的外部中断(bit4)
  16.    
  17.     // P54引脚配置为输入模式(必须配置,否则中断可能异常)
  18.     P5M1 |= 0X10;        // P54配置为高阻输入
  19.     P5M0 &= ~0X10;       // 配合P5M1=1,P5M0=0,设置为输入模式
  20.    
  21.     // 清除P5口中断标志
  22.     P5IF = 0X00;         // 清除所有P5口中断标志位,避免初始化后立即触发
  23.    
  24.     // 开启总中断和外部中断总开关
  25.     EX5 = 1;             // 开启P5口外部中断总开关
  26.     EA = 1;              // 开启总中断
  27. }
  28. /**
  29. * @brief P5口外部中断服务函数
  30. * @note  P54高电平触发时进入此函数
  31. */
  32. void P5_INT(void) interrupt 21  // STC32G的P5口中断号为21
  33. {
  34.     // 等待中断稳定(消抖)
  35.     delay_ms(10);
  36.    
  37.     // 确认P54为高电平
  38.     if(P54 == 1)
  39.     {
  40.         interrupt_count++;  // 中断计数加1
  41.         // 可以在这里添加中断触发后的操作,比如翻转LED
  42.         P10 = !P10;        // 示例:翻转P10引脚电平(可接LED)
  43.     }
  44.    
  45.     // 清除P5口中断标志(必须)
  46.     P5IF = 0X00;
  47. }
  48. /**
  49. * @brief 毫秒级延时函数(STC32G 24MHz主频)
  50. * @param ms 延时毫秒数
  51. */
  52. void delay_ms(unsigned int ms)
  53. {
  54.     unsigned int i, j;
  55.     for(i = ms; i > 0; i--)
  56.         for(j = 12000; j > 0; j--);
  57. }
  58. /**
  59. * @brief 主函数
  60. */
  61. void main(void)
  62. {
  63.     // 初始化P10为输出(接LED测试)
  64.     P1M1 &= ~0X01;
  65.     P1M0 |= 0X01;
  66.     P10 = 0;  // 初始低电平
  67.    
  68.     // 初始化P54外部中断
  69.     P5Exit_Init();
  70.    
  71.     // 主循环
  72.     while(1)
  73.     {
  74.         // 主循环可执行其他任务,中断不影响
  75.         // 例如:每秒打印一次中断计数(需串口初始化)
  76.         delay_ms(1000);
  77.     }
  78. }
复制代码




回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2026-02-12 08:01:16
已绑定手机

4

主题

84

回帖

225

积分

中级会员

积分
225
发表于 2026-1-9 10:43:48 | 显示全部楼层
学习冲哥STC32G教学视频    https://www.stcaimcu.com/thread-323-1-1.html

第16集   ADC学习笔记

STC32G为12位分辨率,通道数15,如果芯片有ADC的外部参考电源管脚ADC_VRef+,则一定不能浮空,必须接外部参考电源或者直接连到VCC。

STC32G 的 ADC 是12 位逐次逼近型 ADC,理论分辨率为:参考电压 / 4096(12 位对应 2¹²=4096 个档位)。
输入电压范围:默认 0~VCC(若 VCC=5V,则数字量 0 对应 0V,4095 对应 5V;若 VCC=3.3V,则 4095 对应 3.3V)。
通道资源:STC32G12K128 包含最多 16 路 ADC 通道(P1.0~P1.7、P4.0~P4.7),部分引脚为复用功能,需配置为 ADC 模式。

流程:指定要采集的模拟输入引脚---通过寄存器触发 ADC 开始采集---转换完成后,从 ADC 数据寄存器中读取数字量,可换算为实际电压。

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 21:40 , Processed in 0.114490 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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