Files
Klipper/src/lpc176x/main.c
Kevin O'Connor ae89a65956 lpc176x: Do not modify PCLKSELx at runtime
The lpc176x has an errata that could cause updates to PCLKSELx to not
take effect.  Rework the code to use the default peripheral clock
speed (25Mhz or 30Mhz) so that this register does not need to be
updated at runtime.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
2021-03-25 11:35:04 -04:00

68 lines
1.5 KiB
C

// Main starting point for LPC176x boards.
//
// Copyright (C) 2018-2021 Kevin O'Connor <kevin@koconnor.net>
//
// This file may be distributed under the terms of the GNU GPLv3 license.
#include "autoconf.h" // CONFIG_CLOCK_FREQ
#include "board/armcm_boot.h" // armcm_main
#include "internal.h" // enable_pclock
#include "sched.h" // sched_main
/****************************************************************
* watchdog handler
****************************************************************/
void
watchdog_reset(void)
{
LPC_WDT->WDFEED = 0xaa;
LPC_WDT->WDFEED = 0x55;
}
DECL_TASK(watchdog_reset);
void
watchdog_init(void)
{
LPC_WDT->WDTC = 4000000 / 2; // 500ms timeout
LPC_WDT->WDCLKSEL = 1<<31; // Lock to internal RC
LPC_WDT->WDMOD = 0x03; // select reset and enable
watchdog_reset();
}
DECL_INIT(watchdog_init);
/****************************************************************
* misc functions
****************************************************************/
// Check if a peripheral clock has been enabled
int
is_enabled_pclock(uint32_t pclk)
{
return !!(LPC_SC->PCONP & (1<<pclk));
}
// Enable a peripheral clock
void
enable_pclock(uint32_t pclk)
{
LPC_SC->PCONP |= 1<<pclk;
}
// Return the frequency of the given peripheral clock
uint32_t
get_pclock_frequency(uint32_t pclk)
{
return CONFIG_CLOCK_FREQ / 4;
}
// Main entry point - called from armcm_boot.c:ResetHandler()
void
armcm_main(void)
{
SystemInit();
sched_main();
}