74 lines
1.8 KiB
C
74 lines
1.8 KiB
C
|
/*
|
||
|
* Copyright (C) 2023 Daniele Lacamera <root@danielinux.net>
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||
|
* the Free Software Foundation, either version 3 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include "system.h"
|
||
|
|
||
|
extern uint32_t SystemCoreClock;
|
||
|
extern uint32_t _start_heap;
|
||
|
|
||
|
static void flash_set_waitstates(int waitstates)
|
||
|
{
|
||
|
FLASH_ACR |= waitstates | FLASH_ACR_ENABLE_DATA_CACHE | FLASH_ACR_ENABLE_INST_CACHE;
|
||
|
}
|
||
|
|
||
|
void clock_pll_off(void)
|
||
|
{
|
||
|
uint32_t reg32;
|
||
|
/* Enable internal high-speed oscillator. */
|
||
|
RCC_CR |= RCC_CR_HSION;
|
||
|
DMB();
|
||
|
while ((RCC_CR & RCC_CR_HSIRDY) == 0) {};
|
||
|
|
||
|
/* Select HSI as SYSCLK source. */
|
||
|
reg32 = RCC_CFGR;
|
||
|
reg32 &= ~((1 << 1) | (1 << 0));
|
||
|
RCC_CFGR = (reg32 | RCC_CFGR_SW_HSI);
|
||
|
DMB();
|
||
|
|
||
|
/* Turn off PLL */
|
||
|
RCC_CR &= ~RCC_CR_PLLON;
|
||
|
DMB();
|
||
|
}
|
||
|
|
||
|
#include <string.h>
|
||
|
/*
|
||
|
size_t strlen(const char *s)
|
||
|
{
|
||
|
int i = 0;
|
||
|
|
||
|
while (s[i] != 0)
|
||
|
i++;
|
||
|
|
||
|
return i;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
void * _sbrk(unsigned int incr)
|
||
|
{
|
||
|
static unsigned char *heap = (unsigned char *)&_start_heap;
|
||
|
void *old_heap = heap;
|
||
|
if (((incr >> 2) << 2) != incr)
|
||
|
incr = ((incr >> 2) + 1) << 2;
|
||
|
|
||
|
if (heap == NULL)
|
||
|
heap = (unsigned char *)&_start_heap;
|
||
|
else
|
||
|
heap += incr;
|
||
|
return old_heap;
|
||
|
}
|