low-power improvements; starting flappy bird

master
Clyne 4 years ago
parent 2b3bc49928
commit bc4baf38ba

@ -451,6 +451,10 @@
* @note This macro can be used to activate a power saving mode. * @note This macro can be used to activate a power saving mode.
*/ */
#define CH_CFG_IDLE_ENTER_HOOK() { \ #define CH_CFG_IDLE_ENTER_HOOK() { \
RCC->ICSCR = (RCC->ICSCR & ~RCC_ICSCR_MSIRANGE_Msk); \
while (!(RCC->CR & RCC_CR_MSIRDY)); \
PWR->CR &= ~PWR_CR_LPRUN; \
PWR->CR |= PWR_CR_LPRUN; \
} }
/** /**
@ -460,6 +464,9 @@
* @note This macro can be used to deactivate a power saving mode. * @note This macro can be used to deactivate a power saving mode.
*/ */
#define CH_CFG_IDLE_LEAVE_HOOK() { \ #define CH_CFG_IDLE_LEAVE_HOOK() { \
RCC->ICSCR |= 6 << RCC_ICSCR_MSIRANGE_Pos; \
while (!(RCC->CR & RCC_CR_MSIRDY)); \
PWR->CR &= ~PWR_CR_LPRUN; \
} }
/** /**

@ -39,26 +39,26 @@
* HAL driver system settings. * HAL driver system settings.
*/ */
#define STM32_NO_INIT FALSE #define STM32_NO_INIT FALSE
#define STM32_VOS STM32_VOS_1P8 #define STM32_VOS STM32_VOS_1P2
#define STM32_PVD_ENABLE FALSE #define STM32_PVD_ENABLE TRUE
#define STM32_PLS STM32_PLS_LEV0 #define STM32_PLS STM32_PLS_LEV4
#define STM32_HSI16_ENABLED TRUE #define STM32_HSI16_ENABLED TRUE
#define STM32_HSI16_DIVIDER_ENABLED FALSE #define STM32_HSI16_DIVIDER_ENABLED FALSE
#define STM32_LSI_ENABLED TRUE #define STM32_LSI_ENABLED FALSE
#define STM32_HSE_ENABLED FALSE #define STM32_HSE_ENABLED FALSE
#define STM32_LSE_ENABLED FALSE #define STM32_LSE_ENABLED FALSE
#define STM32_ADC_CLOCK_ENABLED TRUE #define STM32_ADC_CLOCK_ENABLED TRUE
#define STM32_MSIRANGE STM32_MSIRANGE_512K #define STM32_MSIRANGE STM32_MSIRANGE_4M
#define STM32_SW STM32_SW_MSI #define STM32_SW STM32_SW_MSI
#define STM32_PLLSRC STM32_PLLSRC_HSI16 #define STM32_PLLSRC STM32_PLLSRC_HSI16
#define STM32_PLLMUL_VALUE 4 #define STM32_PLLMUL_VALUE 3
#define STM32_PLLDIV_VALUE 2 #define STM32_PLLDIV_VALUE 4
#define STM32_HPRE STM32_HPRE_DIV1 #define STM32_HPRE STM32_HPRE_DIV1
#define STM32_PPRE1 STM32_PPRE1_DIV1 #define STM32_PPRE1 STM32_PPRE1_DIV1
#define STM32_PPRE2 STM32_PPRE2_DIV1 #define STM32_PPRE2 STM32_PPRE2_DIV1
#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK #define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
#define STM32_MCOPRE STM32_MCOPRE_DIV1 #define STM32_MCOPRE STM32_MCOPRE_DIV1
#define STM32_RTCSEL STM32_RTCSEL_LSI #define STM32_RTCSEL STM32_RTCSEL_NOCLOCK
#define STM32_RTCPRE STM32_RTCPRE_DIV2 #define STM32_RTCPRE STM32_RTCPRE_DIV2
#define STM32_USART2SEL STM32_USART2SEL_APB #define STM32_USART2SEL STM32_USART2SEL_APB
#define STM32_LPUART1SEL STM32_LPUART1SEL_APB #define STM32_LPUART1SEL STM32_LPUART1SEL_APB

@ -136,7 +136,7 @@ void dogs_init_display()
CS_LOW; CS_LOW;
dogs_reset(); dogs_reset();
CS_HIGH; CS_HIGH;
chThdSleepMilliseconds(100); chThdSleepS(TIME_MS2I(100) / 64);
CS_LOW; CS_LOW;
dogs_set_scroll_line(0); dogs_set_scroll_line(0);
dogs_set_segdir(true); dogs_set_segdir(true);
@ -146,7 +146,7 @@ void dogs_init_display()
dogs_set_bias(true); dogs_set_bias(true);
dogs_set_power(0x07); dogs_set_power(0x07);
dogs_set_vlcd_ratio(7); dogs_set_vlcd_ratio(7);
dogs_set_contrast(0x10); dogs_set_contrast(12);
dogs_set_advanced(0x83); dogs_set_advanced(0x83);
dogs_set_sleep(false); dogs_set_sleep(false);
CS_HIGH; CS_HIGH;
@ -187,12 +187,22 @@ void dogs_flush()
void draw_pixel(int x, int y, bool state) void draw_pixel(int x, int y, bool state)
{ {
if (x < 0 || y < 0 || x >= DISP_WIDTH || y >= DISP_HEIGHT)
return;
if (state) if (state)
dogs_buffer[y / 8 * DISP_WIDTH + x] |= (1 << (y % 8)); dogs_buffer[y / 8 * DISP_WIDTH + x] |= (1 << (y % 8));
else else
dogs_buffer[y / 8 * DISP_WIDTH + x] &= ~(1 << (y % 8)); dogs_buffer[y / 8 * DISP_WIDTH + x] &= ~(1 << (y % 8));
} }
void draw_rect(int x, int y, int w, int h)
{
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++)
draw_pixel(x + i, y + j, true);
}
}
void draw_bitmap(int x, int y, const unsigned char *buffer) void draw_bitmap(int x, int y, const unsigned char *buffer)
{ {
// Prepare source information // Prepare source information

@ -22,6 +22,7 @@ void dogs_clear();
void dogs_flush(); void dogs_flush();
void draw_pixel(int x, int y, bool state); void draw_pixel(int x, int y, bool state);
void draw_rect(int x, int y, int w, int h);
void draw_bitmap(int x, int y, const unsigned char *buffer); void draw_bitmap(int x, int y, const unsigned char *buffer);
void draw_number(int x, int y, int number); void draw_number(int x, int y, int number);

@ -21,7 +21,9 @@
* - Can read buttons through PAL (through interrupts now) * - Can read buttons through PAL (through interrupts now)
* - Use ADC to read Vintref, print to screen in mV * - Use ADC to read Vintref, print to screen in mV
* - Sleep mode via WFI, saves ~0.5mA (we're running around 1.1mA) * - Sleep mode via WFI, saves ~0.5mA (we're running around 1.1mA)
* - Run at 512kHz, only use HSI for ADC: 360uA * - Run at 512kHz, only use HSI for ADC: 360uA (jumpy)
* - Drop to 1.2V Vcore (range 3), enable low-V detector: 375uA (steady) (440uA at 1MHz)
* - Run at 4MHz, drop to low-power run/sleep @ 64kHz for idle: 375uA (also lowered contrast)
*/ */
static volatile bool adc_is_complete = false; static volatile bool adc_is_complete = false;
@ -67,7 +69,7 @@ static int readVddmv()
return 3000 * /* CAL */ *((adcsample_t *)0x1FF80078) / reading; return 3000 * /* CAL */ *((adcsample_t *)0x1FF80078) / reading;
} }
THD_WORKING_AREA(waThread2, 96); THD_WORKING_AREA(waThread2, 128);
THD_FUNCTION(Thread2, arg) THD_FUNCTION(Thread2, arg)
{ {
(void)arg; (void)arg;
@ -86,32 +88,51 @@ THD_FUNCTION(Thread2, arg)
0b11000000, 0b11000000,
}; };
int t1x = DISP_WIDTH, t1o = 30;
int x = 0, y = 0; int py = DISP_HEIGHT / 2 - 4;
int vy = 0;
int counter = 0; int counter = 0;
int mv = readVddmv(); int mv = readVddmv();
while (1) { while (1) {
chThdSleepMilliseconds(100); //systime_t old_time = chVTGetSystemTimeX();
unsigned char b = button_state; if (py > 0) {
if ((b & (BUTTON_JOYUR | BUTTON_JOYUL)) == (BUTTON_JOYUR | BUTTON_JOYUL)) py += vy;
y--; if (vy > -4)
else if ((b & (BUTTON_JOYUR | BUTTON_JOYDR)) == (BUTTON_JOYUR | BUTTON_JOYDR)) vy--;
x++; } else if (py < 0) {
else if ((b & (BUTTON_JOYDR | BUTTON_JOYDL)) == (BUTTON_JOYDR | BUTTON_JOYDL)) py = 0;
y++; }
else if ((b & (BUTTON_JOYDL | BUTTON_JOYUL)) == (BUTTON_JOYDL | BUTTON_JOYUL))
x--;
if (++counter == 50) { if (button_state & BUTTON_2) {
counter = 0; vy = 5;
mv = readVddmv(); if (py <= 0)
py = 1;
} }
dogs_clear(); dogs_clear();
draw_bitmap(x, y, testbitmap);
draw_rect(t1x, 0, 4, t1o - 12);
draw_rect(t1x, t1o + 12, 4, DISP_HEIGHT - t1o + 12);
draw_bitmap(4, py, testbitmap);
draw_number(0, 50, mv); draw_number(0, 50, mv);
dogs_flush(); dogs_flush();
if (++counter == 50) {
counter = 0;
mv = !(PWR->CSR & PWR_CSR_PVDO) ? readVddmv() : 1;
}
t1x -= 2;
if (t1x <= -5)
t1x = DISP_WIDTH;
//chThdSleepUntilS(chTimeAddX(old_time, TIME_MS2I(100) / 32));
chThdSleepS(TIME_MS2I(100) / 64);
} }
} }
@ -125,6 +146,7 @@ int main(void)
chSysInit(); chSysInit();
RCC->CR &= ~RCC_CR_HSION; RCC->CR &= ~RCC_CR_HSION;
PWR->CR |= PWR_CR_LPSDSR;
buttons_init(); buttons_init();

Loading…
Cancel
Save