123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- /* Project L476_ats_blink for STM32L476 mounted on Nucleo board:
- * the user LED (mounted on pin PA-5) is flashed every second for 50 ms.
- * The time base is provided by Systick (1000 ticks per second).
- * The clock configuration is the default one (Sysclk = 80 MHz, derived from MSI and PLL).
- */
-
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- // #if defined(USE_FULL_ASSERT)
- // #include "stm32_assert.h"
- // #endif /* USE_FULL_ASSERT */
-
- #include "gpio.h"
-
- // systick interrupt handler
- volatile uint32_t msTicks = 0;
- volatile uint8_t expe = 2;
- volatile uint8_t blue_mode = 0;
-
- void SysTick_Handler()
- {
- if ( BLUE_BUTTON() ){
- blue_mode = 1 ;
- }
-
- msTicks++; /* See startup file startup_LPC17xx.s for SysTick vector */
- if (msTicks == 5 * expe){
- LED_GREEN(0);
- }else if(msTicks >= 200){
- msTicks = 0;
- LED_GREEN(1);
- }
- if(expe == 2){
- CLK_TOGGLE();
- }
- }
-
-
-
-
- int main(void)
- {
- // if (RCC->BDCR & RCC_BDCR_LSEON) {
- // LL_APB1_GRP1_EnableClock( LL_APB1_GRP1_PERIPH_PWR );
- // LL_PWR_EnableBkUpAccess();
- //
- // //expe = register RTC
- // expe = RTC->BKP0R;
- // if (expe == 0){
- // expe = 1;
- // RTC->BKP0R = expe;
- // }else if (expe != 0 && BLUE_BUTTON()){
- // expe ++;
- // RTC->BKP0R = expe;
- // }
- // }else{
- // SystemClock_Config_24M_LSE();
- // expe = 1;
- // LL_APB1_GRP1_EnableClock( LL_APB1_GRP1_PERIPH_PWR );
- // LL_PWR_EnableBkUpAccess();
- // RTC->BKP0R = expe;
- // }
- // LL_PWR_DisableBkUpAccess();
- switch(expe){
- case 1:
- /* Configure the system clock */
- SystemClock_Config_80M();
- break;
- case 2:
- /* Configure the system clock */
- SystemClock_Config_24M_LSE();
- break;
- }
-
-
-
-
- // config GPIO
- GPIO_init();
-
- // init systick timer (tick period at 1 ms)
- LL_Init1msTick( SystemCoreClock );
- LL_SYSTICK_EnableIT();
-
- //Setup Sleep mode
- LL_LPM_EnableSleep();
- //LL_LPM_EnableSleepOnExit();
-
- while (1) {
- if (blue_mode){
- switch(expe){
- case 1:
- __WFI();
- break;
- case 2:
- LL_RCC_MSI_EnablePLLMode();
- break;
- }
-
- }
- }
- }
-
- /**
- * @brief System Clock Configuration
- * @retval None
- * 24Mhz + RTC + LSE
- */
- void SystemClock_Config_24M_LSE(void)
- {
- LL_FLASH_SetLatency(LL_FLASH_LATENCY_1);
- while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_1)
- {
- }
- LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
- LL_RCC_MSI_Enable();
-
- /* Wait till MSI is ready */
- while(LL_RCC_MSI_IsReady() != 1)
- {
-
- }
-
- LL_RCC_LSE_Enable();
-
- /* Wait till LSE is ready */
- while(LL_RCC_LSE_IsReady() != 1)
- {
-
- }
- LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);
- LL_RCC_EnableRTC();
-
- LL_RCC_MSI_EnableRangeSelection();
- LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_6);
- LL_RCC_MSI_SetCalibTrimming(0);
- // LL_RCC_MSI_EnablePLLMode();
- LL_PWR_EnableBkUpAccess();
- LL_RCC_ForceBackupDomainReset();
- LL_RCC_ReleaseBackupDomainReset();
- LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_LOW);
-
- LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 24, LL_RCC_PLLR_DIV_4);
- LL_RCC_PLL_EnableDomain_SYS();
- LL_RCC_PLL_Enable();
-
- /* Wait till PLL is ready */
- while(LL_RCC_PLL_IsReady() != 1)
- {
-
- }
- LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
-
- /* Wait till System clock is ready */
- while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
- {
-
- }
- LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
- LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
- LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
- LL_SetSystemCoreClock(24000000);
-
- /* Update the time base */
- if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
- {
- // Error_Handler();
- }
- }
-
-
- void SystemClock_Config_80M(void)
- {
- LL_FLASH_SetLatency(LL_FLASH_LATENCY_4);
- while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_4)
- {
- }
- LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
- LL_RCC_MSI_Enable();
-
- /* Wait till MSI is ready */
- while(LL_RCC_MSI_IsReady() != 1)
- {
-
- }
- LL_RCC_MSI_EnableRangeSelection();
- LL_RCC_MSI_SetRange(LL_RCC_MSIRANGE_6);
- LL_RCC_MSI_SetCalibTrimming(0);
- LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_MSI, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2);
- LL_RCC_PLL_EnableDomain_SYS();
- LL_RCC_PLL_Enable();
-
- /* Wait till PLL is ready */
- while(LL_RCC_PLL_IsReady() != 1)
- {
-
- }
- LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
-
- /* Wait till System clock is ready */
- while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
- {
-
- }
- LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
- LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
- LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
- LL_SetSystemCoreClock(80000000);
-
- /* Update the time base */
- if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
- {
- // Error_Handler();
- }
- }
|