Elesar 0 16 августа, 2015 Опубликовано 16 августа, 2015 · Жалоба Проблема такая: не просыпается по аларму от РТС. Прервания от РТС проходят, это видно если не засыпать. Ткните носом, может что- то пропустил. #include <stm32f10x_gpio.h> #include <stm32f10x_rcc.h> #include <stm32f10x_rtc.h> #include <stm32f10x_bkp.h> #include <stm32f10x_pwr.h> #include <stm32f10x_usart.h> #include <stm32f10x.h> #include <misc.h> int main(void) { if(PWR_GetFlagStatus(PWR_FLAG_SB)==SET){ PWR_ClearFlag(PWR_FLAG_SB); RTC_WaitForSynchro(); send_string_to_uart("Load///////// "); } InitUSART(); PortInit(); InitNVIC(); RTC_Configuration(); while(1){ } } void send_to_uart(uint8_t data) { while(!(USART1->SR & USART_SR_TC)); USART1->DR=data; } void send_string_to_uart(char* str){ uint8_t i=0; GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET); while(str[i]){ send_to_uart(str[i]); i++; } GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET); } void Reciver(){ int i=0; for(i; i<7;i++){ if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)){ send_string_to_uart("7770000000101111 "); }else { send_string_to_uart("7770000000102222 "); } } RTC_SetAlarm(RTC_GetCounter()+2); RTC_WaitForLastTask(); //PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); //PWR_EnterSTANDBYMode(); } void RTC_Configuration(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE); PWR_DeInit(); PWR_BackupAccessCmd(ENABLE); PWR_WakeUpPinCmd(ENABLE); BKP_DeInit(); RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_SetPrescaler(32767); RTC_WaitForLastTask(); RTC_SetCounter(0); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_ALR,ENABLE); RTC_SetAlarm(RTC_GetCounter()+2); RTC_WaitForLastTask(); send_string_to_uart("Load RTC "); } void InitNVIC(){ NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); send_string_to_uart("Load NVIC "); } void InitUSART(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_DeInit(USART1); USART_InitTypeDef uart_struct; uart_struct.USART_BaudRate = 9600; uart_struct.USART_WordLength = USART_WordLength_8b; uart_struct.USART_StopBits = USART_StopBits_1; uart_struct.USART_Parity = USART_Parity_No ; uart_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; uart_struct.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &uart_struct); USART_Cmd(USART1, ENABLE); send_string_to_uart("Load USART "); } void PortInit(void) { GPIO_InitTypeDef InitPort; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); InitPort.GPIO_Mode =GPIO_Mode_Out_PP; InitPort.GPIO_Pin =GPIO_Pin_14; InitPort.GPIO_Speed =GPIO_Speed_2MHz; GPIO_Init(GPIOB,&InitPort); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); InitPort.GPIO_Pin = GPIO_Pin_10; InitPort.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &InitPort); InitPort.GPIO_Pin = GPIO_Pin_9; InitPort.GPIO_Speed = GPIO_Speed_2MHz; InitPort.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &InitPort); send_string_to_uart("Load GPIO \n"); } void RTC_IRQHandler(){ RTC_ClearITPendingBit(RTC_IT_ALR); send_string_to_uart("INTERRPUT "); Reciver(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dac 0 16 августа, 2015 Опубликовано 16 августа, 2015 · Жалоба Проблема такая: не просыпается по аларму от РТС. Прервания от РТС проходят, это видно если не засыпать. Ткните носом, может что- то пропустил. Разрешите просыпаться по WFI, по умолчанию разрешается только от WFE Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Elesar 0 16 августа, 2015 Опубликовано 16 августа, 2015 (изменено) · Жалоба Разрешите просыпаться по WFI, по умолчанию разрешается только от WFE А разве WFI/WFE не для стопа? Для стендбая всегда вроде по WFI засыпает. void PWR_EnterSTANDBYMode(void) { /* Clear Wake-up flag */ PWR->CR |= PWR_CR_CWUF; /* Select STANDBY mode */ PWR->CR |= PWR_CR_PDDS; /* Set SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR |= SCB_SCR_SLEEPDEEP; /* This option is used to ensure that store operations are completed */ #if defined ( __CC_ARM ) __force_stores(); #endif /* Request Wait For Interrupt */ __WFI(); } Это из исходников stm_lib ААА, сам виноват, засыпаю в СТЕНДБАЙ. забыл написать. Изменено 16 августа, 2015 пользователем Elesar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dac 0 16 августа, 2015 Опубликовано 16 августа, 2015 · Жалоба Проблема такая: не просыпается по аларму от РТС. Прервания от РТС проходят, это видно если не засыпать. Ткните носом, может что- то пропустил. может перед этим RTC_SetAlarm(RTC_GetCounter()+2); RTC_WaitForLastTask(); //PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI); //PWR_EnterSTANDBYMode(); добавить: RTC_ClearFlag(RTC_FLAG_SEC); while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET); могу ошибаться, последнее время в основном с STM32L дело имею Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Elesar 0 16 августа, 2015 Опубликовано 16 августа, 2015 (изменено) · Жалоба Исключительное спасибо! заработало! Изменено 17 августа, 2015 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться