Демонстрационная прошивка отладочного комплекта МТС NB-IoT
awu_api.c
См. документацию.
1 #include "awu_api.h"
2 
9 static uint8_t awu_initialized=0;
10 
11 void RTC_WKUP_IRQHandler(void)
12 {
13  EXTI->PR = EXTI_PR_PR20;
14  //This bit can be accessed without fully disabling the RTC write protection
15  PWR->CR |= PWR_CR_DBP;
16  RTC->ISR &= ~RTC_ISR_WUTF;
17  PWR->CR &= ~PWR_CR_DBP;
18 }
19 
20 void __unlock_RTC_registers(void)
21 {
22  //Disable RTC domain write protection
23  PWR->CR |= PWR_CR_DBP;
24  RTC->WPR = 0xCA;
25  RTC->WPR = 0x53;
26 }
27 
28 void __lock_RTC_registers(void)
29 {
30  //Re-enable RTC domain write protection
31  PWR->CR &= ~PWR_CR_DBP;
32  RTC->WPR = 0x00;
33 }
34 
35 void AWU_Init(uint16_t wakeup_timeout_ms)
36 {
37  uint32_t safety_counter;
38 
39  NVIC_DisableIRQ(RTC_WKUP_IRQn);
40 
41  __unlock_RTC_registers();
42 
43  EXTI->PR = EXTI_PR_PR20;
44  //This bit can be accessed without disabling write protection
45  RTC->ISR &= ~RTC_ISR_WUTF;
46 
47  RTC->CR &= ~(RTC_CR_WUTE | RTC_CR_WUTIE);
48 
49  safety_counter=0;
50  while ((!(RTC->ISR & RTC_ISR_WUTWF)) && (safety_counter<AWU_MAX_WAIT))
51  {
52  safety_counter++;
53  }
54 
55  if (wakeup_timeout_ms>16000)
56  {
57  wakeup_timeout_ms=16000;
58  }
59 
60  RTC->WUTR = (((uint32_t)wakeup_timeout_ms)*4096UL)/1000UL - 1;
61 
62  //Set LSE/8 clock frequency for AWU (4096 Hz at standard 32768 Hz crystal), approx. 244.14 us resolution
63  RTC->CR &= ~RTC_CR_WUCKSEL;
64  RTC->CR |= RTC_CR_WUCKSEL_0;
65 
66  //Enable AWU
67  RTC->CR |= RTC_CR_WUTE | RTC_CR_WUTIE;
68 
69  __lock_RTC_registers();
70 
71  //Configure the interrupt for AWU
72  EXTI->IMR |= EXTI_IMR_MR20;
73  EXTI->RTSR |= EXTI_RTSR_TR20;
74 
75  NVIC_EnableIRQ(RTC_WKUP_IRQn);
76 
77  awu_initialized=1;
78 }
79 
80 void AWU_GoStop(void)
81 {
82  uint32_t safety_counter=0;
83 
84  if (!awu_initialized)
85  {
86  return;
87  }
88 
89  SCB->SCR |= SCB_SCR_SLEEPDEEP;
90  PWR->CR |= PWR_CR_LPSDSR | PWR_CR_CWUF;
91  PWR->CR &= ~PWR_CR_PDDS;
92 
93  __WFI();
94 
95  RCC->CR |= RCC_CR_HSION;
96 
97  safety_counter=0;
98  while ((!(RCC->CR & RCC_CR_HSIRDY)) && (safety_counter<AWU_MAX_WAIT))
99  {
100  safety_counter++;
101  }
102 
103  RCC->CFGR &= ~RCC_CFGR_SW;
104  RCC->CFGR |= RCC_CFGR_SW_HSI;
105 
106  safety_counter=0;
107  while (((RCC->CFGR & RCC_CFGR_SW)==RCC_CFGR_SW_HSI) && (safety_counter<AWU_MAX_WAIT))
108  {
109  safety_counter++;
110  }
111 }
awu_api.h
AWU_Init
void AWU_Init(uint16_t wakeup_timeout_ms)
Функция выполняет настройку блока периодического пробуждения (AWU) для работы с режимом пониженного э...
Definition: awu_api.c:35
AWU_GoStop
void AWU_GoStop(void)
Функция останавливает выполнение программы и переводит контроллер в режим Stop. Выход из режима Stop ...
Definition: awu_api.c:80