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

学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-3 20:20:42 | 显示全部楼层
我们看看步进电机的驱动函数:
step_motor.C



  1. #include "step_motor.h"
  2. void Step_Motor_Run(u8 step,u8 dir,u8 speed,u16 angle,u8 sta)
  3. //step是节拍数,dir是方向 speed是速度 ganle是角度 sta是运行或停止
  4. {
  5.         u16 j ;
  6.         u8 i = 0 ;
  7.         if(sta==1)
  8.         {
  9.                 if(dir==0)  //顺时针转
  10.                 {
  11.                         //28BYJ-48电机一个脉冲转过的角度:5.625/64,4096个脉冲转1圈
  12.                         //90°就是1024个脉冲,angle度对应的脉冲=(64/45)*angle*8
  13.                        
  14.                         for(j=0;j<64*angle/45;j++)
  15.                         {
  16.                                 for(i=0;i<8;i+=8/step) //step是步进--就是节拍数
  17.                                 {
  18.                                         switch(i) //8拍8步
  19.                                         {
  20.                                                 case 0:  MOTOR_IN1=1;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=0;break;
  21.                                                 //第一步,A 色=0,其他=1,输入刚好相反
  22.                                                 case 1:  MOTOR_IN1=1;MOTOR_IN2=1;MOTOR_IN3=0;MOTOR_IN4=0;break;
  23.                                                 //第二步,A 色=0,B 色=0,其他=1,输入刚好相反
  24.                                                 case 2:  MOTOR_IN1=0;MOTOR_IN2=1;MOTOR_IN3=0;MOTOR_IN4=0;break;
  25.                                                 //第三步,A 色=1,B 色=0,其他=1,输入刚好相反
  26.                                                 case 3:  MOTOR_IN1=0;MOTOR_IN2=1;MOTOR_IN3=1;MOTOR_IN4=0;break;
  27.                                                 //第四步,A 色=1,B 色=0,B 色=0,其他=1,输入刚好相反
  28.                                                 case 4:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=1;MOTOR_IN4=0;break;
  29.                                                 //第五步,A 色=1,B 色=1,C 色=0,D 色=1,输入刚好相反
  30.                                                 case 5:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=1;MOTOR_IN4=1;break;
  31.                                                 case 6:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=1;break;
  32.                                                 case 7:  MOTOR_IN1=1;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=1;break;
  33.                                                
  34.                                         }
  35.                                         delay_ms(speed);
  36.                                        
  37.                                 }
  38.                         }
  39.                                
  40.                        
  41.                        
  42.                 }
  43.                 else  //逆时针转,把上面的switch倒过来
  44.                 {
  45.                                 for(j=0;j<64*angle/45;j++)
  46.                         {
  47.                                 for(i=0;i<8;i+=8/step) //step是步进--就是节拍数
  48.                                 {
  49.                                         switch(i) //8拍8步
  50.                                         {
  51.                                                 case 0:  MOTOR_IN1=1;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=1;break;
  52.                                                 //第一步,A 色=0,其他=1,输入刚好相反
  53.                                                 case 1:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=1;break;
  54.                                                 //第二步,A 色=0,B 色=0,其他=1,输入刚好相反
  55.                                                 case 2:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=1;MOTOR_IN4=1;break;
  56.                                                 //第三步,A 色=1,B 色=0,其他=1,输入刚好相反
  57.                                                 case 3:  MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=1;MOTOR_IN4=0;break;
  58.                                                 //第四步,A 色=1,B 色=0,B 色=0,其他=1,输入刚好相反
  59.                                                 case 4:  MOTOR_IN1=0;MOTOR_IN2=1;MOTOR_IN3=1;MOTOR_IN4=0;break;
  60.                                                 //第五步,A 色=1,B 色=1,C 色=0,D 色=1,输入刚好相反
  61.                                                 case 5:  MOTOR_IN1=0;MOTOR_IN2=1;MOTOR_IN3=0;MOTOR_IN4=0;break;
  62.                                                 case 6:  MOTOR_IN1=1;MOTOR_IN2=1;MOTOR_IN3=0;MOTOR_IN4=0;break;
  63.                                                 case 7:  MOTOR_IN1=1;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=0;break;
  64.                                                
  65.                                         }
  66.                                         delay_ms(speed);
  67.                                        
  68.                                 }
  69.                         }
  70.                                
  71.                
  72.                 }
  73.                
  74.         }
  75.         else  //sta==0 ,电机停止
  76.         {
  77.                 MOTOR_IN1=0;MOTOR_IN2=0;MOTOR_IN3=0;MOTOR_IN4=0;//电机停止
  78.         }
  79. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-3 20:21:19 | 显示全部楼层
#ifndef __STEP_MOTOR_
#define __STEP_MOTOR_

#include "config.h"

#define MOTOR_IN1 P10
#define MOTOR_IN2 P11
#define MOTOR_IN3 P13
#define MOTOR_IN4 P14

#define STEPMOTOR_MAXSPEED  1
#define STEPMOTOR_MINSPEED  5

void Step_Motor_Run(u8 step,u8 dir,u8 speed,u16 angle,u8 sta);
//step是节拍数,dir是方向 speed是速度 ganle是角度 sta是运行或停止

#endif
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-3 20:22:08 | 显示全部楼层
看看主函数:
  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-03-03) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含
  14. #include "key.h"
  15. #include "step_motor.h"
  16. //<<AICUBE_USER_INCLUDE_END>>
  17. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  18. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  19. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  20. ////////////////////////////////////////
  21. // 项目主函数
  22. // 入口参数: 无
  23. // 函数返回: 无
  24. ////////////////////////////////////////
  25. void main(void)
  26. {
  27.     //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  28.     // 在此添加用户主函数初始化代码  
  29.         u8 key=0;  //保存按键值
  30.         u8 run=0;  //1运行0停止
  31.         u8 dir=0;  //0是逆时针1是顺时针
  32.         u8 speed = STEPMOTOR_MAXSPEED;
  33.     //<<AICUBE_USER_MAIN_INITIAL_END>>
  34.     SYS_Init();
  35.     //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  36.     // 在此添加主函数中运行一次的用户代码  
  37.     //<<AICUBE_USER_MAIN_CODE_END>>
  38.     while (1)
  39.     {
  40.         USBLIB_OUT_Done();              //查询方式处理USB接收的数据
  41.         //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  42.         // 在此添加主函数中用户主循环代码
  43.                 key = KEY_Scan(0); //mode=0 单击 mode=1 长按
  44.                 if(key==KEY1_PRESS) run=!run;      //K1控制启停
  45.                 else if(key==KEY2_PRESS) dir=!dir;  //K2控制方向
  46.                 else if(key==KEY3_PRESS)           //K3控制减速
  47.                 {
  48.                         speed++;
  49.                         if(speed>STEPMOTOR_MINSPEED )
  50.                         speed= STEPMOTOR_MINSPEED;
  51.                 }
  52.                 else if(key==KEY4_PRESS)           //K4控制加速
  53.                 {
  54.                         speed--;
  55.                         if(speed<STEPMOTOR_MAXSPEED )
  56.                         speed= STEPMOTOR_MAXSPEED;
  57.                 }
  58.                 Step_Motor_Run(8,dir,speed,1,run);//第4个变量是角度
  59.         //<<AICUBE_USER_MAIN_LOOP_END>>
  60.     }
  61. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 18:31:57 | 显示全部楼层
14.1-外部中断实验-简介1-外部中断实验-简介
本讲主要内容
1.实验介绍
2.硬件设计
3.软件设计
4.实验现象


截图202603041831569186.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 18:48:15 | 显示全部楼层
1.2 实验目的
使用K1和K2配置外部中断功能,K3和K4配置普通I0口中断功能,K1-K4控制LED1-LED4亮灭。
我的实验板HC6800-ES V2.0 K1 对应P5.1 K2对应P5.2 K3对应P3.2 K4对应P3.3,所以我要把K3和K4配置外部中断功能,K1和K2配置普通I0口中断功能,K1-K4控制LED1-LED4亮灭。
重点是软件配置:




截图202603041849231536.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 18:52:10 | 显示全部楼层
简单说:4个开关是高阻输入 使能上拉

P20---P23设置为推挽输出 使能上拉

使能系统时钟

使能外部中断1  外部中断2


IO口中断我们是这样:
K1对应P51 K2 对应P50 要允许IO口下降沿中断


截图202603041906235231.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 19:02:20 | 显示全部楼层
按上面的设置,生成框架:

截图202603041902173874.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 19:07:58 | 显示全部楼层
特别注意普通IO口中断的设置:

直接在管脚IO口设置选择就OK

截图202603041907557609.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 20:02:07 | 显示全部楼层
这里IO口中断,键的判断:
截图202603042002057678.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2026-04-08 10:46:34
已绑定手机

22

主题

2458

回帖

3488

积分

论坛元老

积分
3488
发表于 2026-3-4 20:17:43 | 显示全部楼层
看看port.c:

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: port.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-03-04) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含
  14. #include "key.h"
  15. #include "led.h"
  16. //<<AICUBE_USER_INCLUDE_END>>
  17. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  18. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  19. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  20. ////////////////////////////////////////
  21. // P2口初始化函数
  22. // 入口参数: 无
  23. // 函数返回: 无
  24. ////////////////////////////////////////
  25. void PORT2_Init(void)
  26. {
  27.     SetP2nInitLevelHigh(PIN_ALL);       //设置P2初始化电平
  28.     SetP2nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4); //设置P2.7,P2.6,P2.5,P2.4为准双向口模式
  29.     SetP2nPushPullMode(PIN_3 | PIN_2 | PIN_1 | PIN_0); //设置P2.3,P2.2,P2.1,P2.0为推挽输出模式
  30.     EnableP2nPullUp(PIN_3 | PIN_2 | PIN_1 | PIN_0); //使能P2.3,P2.2,P2.1,P2.0内部上拉电阻
  31.     DisableP2nPullUp(PIN_7 | PIN_6 | PIN_5 | PIN_4); //关闭P2.7,P2.6,P2.5,P2.4内部上拉电阻
  32.     DisableP2nPullDown(PIN_ALL);        //关闭P2内部下拉电阻
  33.     DisableP2nSchmitt(PIN_ALL);         //使能P2施密特触发
  34.     SetP2nSlewRateNormal(PIN_ALL);      //设置P2一般翻转速度
  35.     SetP2nDrivingNormal(PIN_ALL);       //设置P2一般驱动能力
  36.     SetP2nDigitalInput(PIN_ALL);        //使能P2数字信号输入功能
  37.     //<<AICUBE_USER_PORT2_INITIAL_BEGIN>>
  38.     // 在此添加用户初始化代码  
  39.     //<<AICUBE_USER_PORT2_INITIAL_END>>
  40. }
  41. ////////////////////////////////////////
  42. // P3口初始化函数
  43. // 入口参数: 无
  44. // 函数返回: 无
  45. ////////////////////////////////////////
  46. void PORT3_Init(void)
  47. {
  48.     SetP3nInitLevelHigh(PIN_ALL);       //设置P3初始化电平
  49.     SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_2); //设置P3.7,P3.6,P3.5,P3.2为准双向口模式
  50.     SetP3nHighZInputMode(PIN_4 | PIN_3 | PIN_1 | PIN_0); //设置P3.4,P3.3,P3.1,P3.0为高阻输入模式
  51.     EnableP3nPullUp(PIN_4 | PIN_3);     //使能P3.4,P3.3内部上拉电阻
  52.     DisableP3nPullUp(PIN_7 | PIN_6 | PIN_5 | PIN_2 | PIN_1 | PIN_0); //关闭P3.7,P3.6,P3.5,P3.2,P3.1,P3.0内部上拉电阻
  53.     DisableP3nPullDown(PIN_ALL);        //关闭P3内部下拉电阻
  54.     DisableP3nSchmitt(PIN_ALL);         //使能P3施密特触发
  55.     SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
  56.     SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
  57.     SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能
  58.     //<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
  59.     // 在此添加用户初始化代码  
  60.     //<<AICUBE_USER_PORT3_INITIAL_END>>
  61. }
  62. ////////////////////////////////////////
  63. // P5口初始化函数
  64. // 入口参数: 无
  65. // 函数返回: 无
  66. ////////////////////////////////////////
  67. void PORT5_Init(void)
  68. {
  69.     SetP5nInitLevelHigh(PIN_ALL);       //设置P5初始化电平
  70.     SetP5nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P5.7,P5.6,P5.5,P5.4,P5.3,P5.2为准双向口模式
  71.     SetP5nHighZInputMode(PIN_1 | PIN_0); //设置P5.1,P5.0为高阻输入模式
  72.     EnableP5nPullUp(PIN_1 | PIN_0);     //使能P5.1,P5.0内部上拉电阻
  73.     DisableP5nPullUp(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //关闭P5.7,P5.6,P5.5,P5.4,P5.3,P5.2内部上拉电阻
  74.     DisableP5nPullDown(PIN_ALL);        //关闭P5内部下拉电阻
  75.     DisableP5nSchmitt(PIN_ALL);         //使能P5施密特触发
  76.     SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
  77.     SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
  78.     SetP5nDigitalInput(PIN_ALL);        //使能P5数字信号输入功能
  79.     SetP5nFallingInt(PIN_1 | PIN_0);    //设置P5.1,P5.0为下降沿中断
  80.     EnableP5nInt(PIN_1 | PIN_0);        //使能P5.1,P5.0口中断
  81.     SetP5IntPriority(0);                //设置中断为最低优先级
  82.     //<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
  83.     // 在此添加用户初始化代码  
  84.     //<<AICUBE_USER_PORT5_INITIAL_END>>
  85. }
  86. ////////////////////////////////////////
  87. // P5中断服务程序
  88. // 入口参数: 无
  89. // 函数返回: 无
  90. ////////////////////////////////////////
  91. void PORT5_ISR(void) interrupt P5INT_VECTOR
  92. {
  93.     //<<AICUBE_USER_PORT5_ISR_CODE1_BEGIN>>
  94.     // 在此添加中断函数用户代码  
  95.     uint8_t intf;
  96.         intf = CheckP5nFlag(PIN_ALL);       //读取中断请求标志
  97.     ClearP5nFlag(PIN_ALL);              //清除中断请求标志
  98.        
  99.         if(intf & 0X01)  //判断是否P50按下  01就是P50,02就是P51,04就是P52,08--P53,10--P54
  100.         {               
  101.                         delay_ms(10);
  102.                         if(intf & 0X01)
  103.                         {
  104.                                 printf_usb("K2(P50)按下!\r\n");                // 发送字符串“K2(P50)按下!”
  105.                                 LED2=!LED2; //LED1反转
  106.                         }
  107.         }
  108.         else if(intf & 0X02)  //判断是否P51按下  01就是P50,02就是P51,04就是P52,08--P53,10--P54
  109.                  {                 
  110.                         delay_ms(10);
  111.                         if(intf & 0X02)
  112.                         {
  113.                                 printf_usb("K1(P51)按下!\r\n");                // 发送字符串“K1(P51)按下!”
  114.                                 LED1=!LED1; //LED1反转
  115.                         }
  116.                  }
  117.     //<<AICUBE_USER_PORT5_ISR_CODE1_END>>
  118. }
  119. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  120. // 在此添加用户函数实现代码  
  121. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-10 01:06 , Processed in 0.113543 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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