OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8214|回复: 9

f030芯片 运行freertos时进入stop模式问题?

[复制链接]

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
发表于 2022-3-22 18:02:14 | 显示全部楼层 |阅读模式
50金钱
请教大家一个问题,我用F030芯片,裸机时,进入stop模式,然后唤醒可以正常的;在运行freertos时,进入stop模式,能唤醒(调试发现执行到了进入stop模式代码后),但是不会进入到任务中,执行任务相关的代码

RTC闹钟中断 5S进一次

  1. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
  2. {
  3.   RTC_TimeTypeDef sTime = {0};
  4. //  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
  5.   HAL_GPIO_TogglePin(CH6_GPIO_Port,CH6_Pin);
  6.   HAL_GPIO_TogglePin(CH6_GPIO_Port,CH6_Pin);
  7.   sTime.Hours = 0;
  8.   sTime.Minutes = 0;
  9.   sTime.Seconds = 0;
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  12.   HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BIN);

  13.   stop_cnt++;
  14. }
复制代码



进入stop模式的代码
  1. void MCU_stop_FUNC(void)
  2. {
  3.   if(stop_cnt>4){//RTC中断中 每5s累加一次
  4.       stop_cnt=0;
  5.       
  6.       HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
  7.       HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
  8.       HAL_ADC_Stop_DMA(&hadc);
  9.       rf_sleep();
  10.    
  11. //    vTaskSuspend(rfTaskHandle);
  12. //    vTaskSuspend(otherTaskHandle);

  13.        HAL_GPIO_WritePin(LED_RED_GPIO_Port,LED_RED_Pin,GPIO_PIN_SET);
  14.        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);
  15.        HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,LED_BLUE_Pin,GPIO_PIN_SET);
  16.        SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  
  17.       HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI ); //进入stop  PWR_MAINREGULATOR_ON  PWR_LOWPOWERREGULATOR_ON
  18.       
  19.       HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
  20.       HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
  21.       SystemClock_Config();
  22.       HAL_ADC_Start_DMA(&hadc, (uint32_t*)adcBuf, 2);
  23.       rf_out_of_sleep();
  24.       HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);  
  25.       SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  26. //vTaskResume(rfTaskHandle);
  27. //vTaskResume(otherTaskHandle);
  28. //osKernelStart();//开启任务调度

  29.     }
  30. }
复制代码
在空闲任务中执行进入stop模式的代码
  1. static portTASK_FUNCTION( prvIdleTask, pvParameters )
  2. {
  3.         /* Stop warnings. */
  4.         ( void ) pvParameters;

  5.         for( ;; )
  6.         {
  7.                 /* See if any tasks have deleted themselves - if so then the idle task
  8.                 is responsible for freeing the deleted task's TCB and stack. */
  9.                 prvCheckTasksWaitingTermination();
  10. MCU_stop_FUNC();
  11. ............................
  12. }
复制代码

目前想实现的就是在任务跑时,能正常唤醒,执行任务

我看了一些帖子,说进入stop前,关闭SysTick,唤醒后,初始化系统时钟,并开启SysTick;但是我试了还是不能正常跑起来

请教下该如何在执行操作系统时(freertos),正常唤醒,正常执行任务??

谢谢啦





最佳答案

查看完整内容[请看2#楼]

找到问题了 是这个函数有问题 rf_out_of_sleep(); 之前的是 参考SX1280文档这里, 后续我重新创建了个带有freertos的工程,进入低功耗,在唤醒,是没问题的,然后我就慢慢找目前的这个工程,结果发现 文档中这里写着,NSS拉低会唤醒........... 改成这样,可以正常唤醒并跑任务了。 下面是我测试创建的工程
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-3-22 18:02:15 | 显示全部楼层
找到问题了
是这个函数有问题
rf_out_of_sleep();
之前的是
  1. void rf_out_of_sleep(void)
  2. {
  3.   HAL_GPIO_WritePin(SX1280_NSS_GPIO_Port,SX1280_NSS_Pin,GPIO_PIN_SET);
  4.   HAL_Delay(1);
  5.   Radio.SetStandby( STDBY_XOSC );
  6. }
复制代码

参考SX1280文档这里,
后续我重新创建了个带有freertos的工程,进入低功耗,在唤醒,是没问题的,然后我就慢慢找目前的这个工程,结果发现
文档中这里写着,NSS拉低会唤醒...........
  1. void rf_out_of_sleep(void)
  2. {
  3. HAL_GPIO_WritePin(SX1280_NSS_GPIO_Port,SX1280_NSS_Pin,GPIO_PIN_RESET);
  4. HAL_Delay(1);
  5. Radio.SetStandby( STDBY_XOSC );
  6. }
复制代码
改成这样,可以正常唤醒并跑任务了。

下面是我测试创建的工程





RTC-FREERTOS.rar

9.14 MB, 下载次数: 23

回复

使用道具 举报

8

主题

163

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2021-12-14
在线时间
70 小时
发表于 2022-3-22 18:12:48 | 显示全部楼层
帮顶!!!
回复

使用道具 举报

2

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2019-8-20
在线时间
147 小时
发表于 2022-3-23 08:46:32 | 显示全部楼层
RTOS需要SysTick做时钟源,Stop模式下SysTick是不能工作的,所以可以用其他定时器代替,但Stop模式下F030的TIM也不工作,RTC我没有用过,不知道能不能。所以你说的“我看了一些帖子,说进入stop前,关闭SysTick,唤醒后,初始化系统时钟,并开启SysTick;但是我试了还是不能正常跑起来
”,这个是正常的,在停止模式下,SysTick能跑起来就奇怪了。另外补充一句,STM32低功耗系列中LPTIM可以代替。
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-3-23 09:12:07 | 显示全部楼层
顶!!!!!
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2022-4-2 13:40:04 | 显示全部楼层
正好想了解一下这方面的操作   使用FreeRTOS后进入停止模式前  需要注意哪些事项了   唤醒后   需要注意哪些事项呢   谢谢您啦
Nothing is impossible
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-4-6 09:08:49 | 显示全部楼层
unnormal 发表于 2022-4-2 13:40
正好想了解一下这方面的操作   使用FreeRTOS后进入停止模式前  需要注意哪些事项了   唤醒后   需要注意哪 ...

进入停止模式后唤醒 需要重新配置时钟,唤醒后他好像是采用的8M的时钟(之前找资料在哪看到了来着);对于关闭中断,引脚之类的,由于我这对低功耗要求不是很严,所以外设之类的我就没进行控制了
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2022-4-6 15:14:33 | 显示全部楼层
chenyuan 发表于 2022-4-6 09:08
进入停止模式后唤醒 需要重新配置时钟,唤醒后他好像是采用的8M的时钟(之前找资料在哪看到了来着);对 ...

恩 恩     好的     谢谢您
Nothing is impossible
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-12-27
在线时间
0 小时
发表于 2022-12-27 17:37:41 | 显示全部楼层
chenyuan 发表于 2022-3-22 18:02
找到问题了
是这个函数有问题
rf_out_of_sleep();

我怎么没有发现你究竟改了哪里呢????两段rf_out_of_sleep()得代码我发现是一摸一样的呀。
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-12-28 09:08:37 | 显示全部楼层
Jerrick 发表于 2022-12-27 17:37
我怎么没有发现你究竟改了哪里呢????两段rf_out_of_sleep()得代码我发现是一摸一样的呀。

NSS引脚,之前是拉高的,后面改成拉低 就可以了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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