Проблема в том, что процессор висит если я переключаюсь (несколько раз в секунду) между
SYSTEM_CLOCK_HSI_VOLTAGE_RANGE_2;
SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_3;
Зависает каждые 10ч работы, чёткой привязки ко времени нет.
Если я переключаюсь между
SYSTEM_CLOCK_HSI_VOLTAGE_RANGE_1;
SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_1;
то всё хорошо.
При этом если я запускаю в бесконечном цикле
while(1)
{
SYSTEM_CLOCK_HSI_VOLTAGE_RANGE_2;
SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_3;
}
То процессор не зависает.
Коды макросов приведены ниже.
Вопрос : на первый взгляд код правильный ? Причина зависания глубже чем то что я просто что-то не понял из документации ?
CODE
#define VOLTAGE_RANGE_1 {\
while(PWR->CSR & PWR_CSR_VOSF){}\
PWR->CR &=~ PWR_CR_VOS_1;\
PWR->CR |= PWR_CR_VOS_0;\
while(PWR->CSR & PWR_CSR_VOSF){}}
#define VOLTAGE_RANGE_2 {\
while(PWR->CSR & PWR_CSR_VOSF){}\
PWR->CR &=~ PWR_CR_VOS_0;\
PWR->CR |= PWR_CR_VOS_1;\
while(PWR->CSR & PWR_CSR_VOSF){}}
#define VOLTAGE_RANGE_3 {\
while(PWR->CSR & PWR_CSR_VOSF){}\
PWR->CR |= PWR_CR_VOS_0;\
PWR->CR |= PWR_CR_VOS_1;\
while(PWR->CSR & PWR_CSR_VOSF){}}
#define SYSTEM_CLOCK_HSI_VOLTAGE_RANGE_1 {\
VOLTAGE_RANGE_1;\
RCC->CFGR &=~(RCC_CFGR_SW_0 | RCC_CFGR_SW_1);\
RCC->CFGR |=RCC_CFGR_SW_0;\
FLASH->ACR &=~FLASH_ACR_LATENCY;\
FLASH->ACR &=~FLASH_ACR_ACC64;}
#define SYSTEM_CLOCK_HSI_VOLTAGE_RANGE_2 {\
VOLTAGE_RANGE_2;\
FLASH->ACR |=FLASH_ACR_ACC64;\
FLASH->ACR |=FLASH_ACR_LATENCY;\
RCC->CFGR &=~(RCC_CFGR_SW_0 | RCC_CFGR_SW_1);\
RCC->CFGR |=RCC_CFGR_SW_0;}
#define SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_1 {\
RCC->CFGR &=~(RCC_CFGR_SW_0 | RCC_CFGR_SW_1);\
FLASH->ACR &=~FLASH_ACR_LATENCY;\
FLASH->ACR &=~FLASH_ACR_ACC64;\
VOLTAGE_RANGE_1;}
#define SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_2 {\
RCC->CFGR &=~(RCC_CFGR_SW_0 | RCC_CFGR_SW_1);\
FLASH->ACR &=~FLASH_ACR_LATENCY;\
FLASH->ACR &=~FLASH_ACR_ACC64;\
VOLTAGE_RANGE_2;}
#define SYSTEM_CLOCK_MSI_VOLTAGE_RANGE_3 {\
FLASH->ACR |=FLASH_ACR_ACC64;\
FLASH->ACR |=FLASH_ACR_LATENCY;\
RCC->CFGR &=~(RCC_CFGR_SW_0 | RCC_CFGR_SW_1);\
VOLTAGE_RANGE_3;}
Сообщение отредактировал IgorKossak - Oct 8 2013, 18:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!