restructure
This commit is contained in:
parent
43311096b6
commit
a91a82c296
|
@ -36,15 +36,30 @@ void __attribute__ ((interrupt, used)) SysTick_Handler(void)
|
||||||
|
|
||||||
void __attribute__ ((interrupt, used)) RTC_IRQHandler(void)
|
void __attribute__ ((interrupt, used)) RTC_IRQHandler(void)
|
||||||
{
|
{
|
||||||
RTC->ISR &= ~RTC_ISR_WUTF; /* clear the wake up flag... is this required? */
|
if ( (EXTI->PR & EXTI_PR_PIF20) != 0 )
|
||||||
|
{
|
||||||
|
EXTI->PR = EXTI_PR_PIF20; /* wake up is connected to line 20, clear this IRQ */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the wake up time flag must be cleared, otherwise no further IRQ will happen */
|
||||||
|
/* in principle, this should happen only when a IRQ line 20 IRQ happens, but */
|
||||||
|
/* it will be more safe to clear this flag for any interrupt */
|
||||||
|
RTC->ISR &= ~RTC_ISR_WUTF; /* clear the wake up flag */
|
||||||
|
|
||||||
|
|
||||||
RTCIRQCount++;
|
RTCIRQCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*=======================================================================*/
|
||||||
|
/*
|
||||||
|
Set internal high speed clock as clock for the system
|
||||||
|
Also call SystemCoreClockUpdate()
|
||||||
|
|
||||||
|
This must be executed after each reset.
|
||||||
|
*/
|
||||||
void setHSIClock()
|
void setHSIClock()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
/* test if the current clock source is something else than HSI */
|
/* test if the current clock source is something else than HSI */
|
||||||
if ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)
|
if ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)
|
||||||
{
|
{
|
||||||
|
@ -96,16 +111,47 @@ void setHSIClock()
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*=======================================================================*/
|
||||||
|
/*
|
||||||
|
Setup systick interrupt.
|
||||||
|
A call to SystemCoreClockUpdate() is required before calling this function.
|
||||||
|
|
||||||
|
This must be executed after each reset.
|
||||||
|
*/
|
||||||
|
void startSysTick(void)
|
||||||
|
{
|
||||||
|
SysTick->LOAD = (SystemCoreClock/1000)*50 - 1; /* 50ms task */
|
||||||
|
SysTick->VAL = 0;
|
||||||
|
SysTick->CTRL = 7; /* enable, generate interrupt (SysTick_Handler), do not divide by 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=======================================================================*/
|
||||||
|
/*
|
||||||
|
Setup u8g2
|
||||||
|
|
||||||
|
This must be executed only after POR reset.
|
||||||
|
*/
|
||||||
|
void initDisplay(void)
|
||||||
|
{
|
||||||
|
/* setup display */
|
||||||
|
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_stm32l0);
|
||||||
|
u8g2_InitDisplay(&u8g2);
|
||||||
|
u8g2_SetPowerSave(&u8g2, 0);
|
||||||
|
u8g2_SetFont(&u8g2, u8g2_font_6x12_tf);
|
||||||
|
u8g2_ClearBuffer(&u8g2);
|
||||||
|
u8g2_DrawStr(&u8g2, 0,12, "STM32L031");
|
||||||
|
u8g2_DrawStr(&u8g2, 0,24, u8x8_u8toa(SystemCoreClock/1000000, 2));
|
||||||
|
u8g2_DrawStr(&u8g2, 20,24, "MHz");
|
||||||
|
u8g2_SendBuffer(&u8g2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=======================================================================*/
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
setHSIClock();
|
setHSIClock();
|
||||||
SystemCoreClockUpdate(); /* Update SystemCoreClock() */
|
SystemCoreClockUpdate(); /* Update SystemCoreClock() */
|
||||||
//SystemCoreClock = 32000000UL;
|
//SystemCoreClock = 32000000UL;
|
||||||
|
startSysTick();
|
||||||
SysTick->LOAD = (SystemCoreClock/1000)*50 - 1; /* 50ms task */
|
|
||||||
SysTick->VAL = 0;
|
|
||||||
SysTick->CTRL = 7; /* enable, generate interrupt (SysTick_Handler), do not divide by 2 */
|
|
||||||
|
|
||||||
|
|
||||||
RCC->IOPENR |= RCC_IOPENR_IOPAEN; /* Enable clock for GPIO Port A */
|
RCC->IOPENR |= RCC_IOPENR_IOPAEN; /* Enable clock for GPIO Port A */
|
||||||
__NOP();
|
__NOP();
|
||||||
|
@ -131,17 +177,7 @@ int main()
|
||||||
GPIOA->PUPDR |= GPIO_PUPDR_PUPD2_0; /* pullup for PA2 */
|
GPIOA->PUPDR |= GPIO_PUPDR_PUPD2_0; /* pullup for PA2 */
|
||||||
|
|
||||||
|
|
||||||
/* setup display */
|
initDisplay();
|
||||||
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_stm32l0);
|
|
||||||
u8g2_InitDisplay(&u8g2);
|
|
||||||
u8g2_SetPowerSave(&u8g2, 0);
|
|
||||||
u8g2_SetFont(&u8g2, u8g2_font_6x12_tf);
|
|
||||||
u8g2_ClearBuffer(&u8g2);
|
|
||||||
u8g2_DrawStr(&u8g2, 0,12, "STM32L031");
|
|
||||||
u8g2_DrawStr(&u8g2, 0,24, u8x8_u8toa(SystemCoreClock/1000000, 2));
|
|
||||||
u8g2_DrawStr(&u8g2, 20,24, "MHz");
|
|
||||||
u8g2_SendBuffer(&u8g2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* real time clock enable */
|
/* real time clock enable */
|
||||||
|
@ -185,7 +221,7 @@ int main()
|
||||||
while((RTC->ISR & RTC_ISR_WUTWF) != RTC_ISR_WUTWF)
|
while((RTC->ISR & RTC_ISR_WUTWF) != RTC_ISR_WUTWF)
|
||||||
;
|
;
|
||||||
|
|
||||||
RTC->WUTR = 0x010; /* reload is 1: 1Hz with the 1Hz clock */
|
RTC->WUTR = 0; /* reload is 1: 1Hz with the 1Hz clock */
|
||||||
RTC->CR &= ~RTC_CR_WUCKSEL; /* clear selection register */
|
RTC->CR &= ~RTC_CR_WUCKSEL; /* clear selection register */
|
||||||
RTC->CR |= RTC_CR_WUCKSEL_2; /* select the 1Hz clock */
|
RTC->CR |= RTC_CR_WUCKSEL_2; /* select the 1Hz clock */
|
||||||
RTC->CR |= RTC_CR_WUTE | RTC_CR_WUTIE ;
|
RTC->CR |= RTC_CR_WUTE | RTC_CR_WUTIE ;
|
||||||
|
@ -195,8 +231,9 @@ int main()
|
||||||
RTC->WPR = 0; /* enable RTC write protection */
|
RTC->WPR = 0; /* enable RTC write protection */
|
||||||
RTC->WPR = 0;
|
RTC->WPR = 0;
|
||||||
|
|
||||||
EXTI->IMR |= EXTI_IMR_IM20;
|
/* wake up IRQ is connected to line 20 */
|
||||||
EXTI->RTSR |= EXTI_RTSR_RT20;
|
EXTI->RTSR |= EXTI_RTSR_RT20; /* rising edge for wake up line */
|
||||||
|
EXTI->IMR |= EXTI_IMR_IM20; /* interrupt enable */
|
||||||
|
|
||||||
NVIC_EnableIRQ(RTC_IRQn);
|
NVIC_EnableIRQ(RTC_IRQn);
|
||||||
NVIC_SetPriority(RTC_IRQn, 0);
|
NVIC_SetPriority(RTC_IRQn, 0);
|
||||||
|
|
Loading…
Reference in New Issue