Я про первое сообщение, а не про второе.psw2.ru писал(а):А где там "простота" видна ? Кликать мышей в галки - просто ?
Выше я давал ссылку и упоминал про файл system_stm32fxxx.c. http://purebasic.mybb.ru/viewtopic.php?id=575psw2.ru писал(а):А лично я исходник просил инициализатора платформы (хотяб даже на Си), ну просто поглядеть/скомпилить из любопытства.
В первом сообщении есть ссылка на исходники. http://pure-basic.narod.ru/forum_files/stm32/Blink.zip
В архиве найдите файл "Blink\src\system_stm32f10x.c" в котором начальная инициализация. Еще можете посмотреть файл "Blink\src\startup_stm32f10x_md.S" в котором находится таблица прерываний и код выполняемый после сброса.
В system_stm32f10x.c несколько функий под разные частоты. Некоторые их них.
Начальная инициализация.
Спойлер
Код: Выделить всё
/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemCoreClock variable.
* @note This function should be used only after reset.
* @param None
* @retval None
*/
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#else
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
#endif
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
/* We disable the vector table mapping if we actively debug because we are doing this in our
** debugger script. By doing this in the debugger script, we can switch between flash or ram execution.
** For the release version, please enable the code below by undefining __DONT_INIT_VTABLE
*/
/* Configure the Vector Table location add offset address ------------------*/
/* If you work ith the STlink for debug, please don't use this. */
#ifndef __DONT_INIT_VTABLE
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
#else
#warning For release version do not use __DONT_INIT_VTABLE (see above).
#endif
}Спойлер
Код: Выделить всё
/**
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2
* and PCLK1 prescalers.
* @note This function should be used only after reset.
* @param None
* @retval None
*/
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
#ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
RCC_CFGR_PLLMULL9);
#else
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}Код: Выделить всё
/* #define SYSCLK_FREQ_HSE HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz 24000000 */
/* #define SYSCLK_FREQ_36MHz 36000000 */
/* #define SYSCLK_FREQ_48MHz 48000000 */
/* #define SYSCLK_FREQ_56MHz 56000000 */
#define SYSCLK_FREQ_72MHz 72000000Чтобы было понятней, картинка с настройками тактирования. Читайте комментарии в коде и смотрите картинку.
Спойлер
Код: Выделить всё
void Overclocking(void) // Разгон микроконтроллера.
{
RCC_HSICmd(ENABLE); // Включаем внутренний RC генератор.
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // Выбираем источником такторования внутренний RC генератор.
RCC_PLLCmd(DISABLE); // Выключаем умножитель частоты.
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_CFGR_PLLMULL12); // На сколько будем умножать частоту.
RCC_PLLCmd(ENABLE); // Включаем умножитель частоты.
while ((RCC->CR & RCC_CR_PLLRDY) == 0); // Ждем запуска умножителя частоты.
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Выбираем источником такторования умножитель частоты.
SystemCoreClockUpdate(); // Вычисление тактовой частоты ядра.
}STM32 это микроконтроллеры, а не микропроцессоры, т. е. ядро Cortex-M, а не Cortex-A. https://ru.wikipedia.org/wiki/ARM_(архи ... ессоры_ARMpsw2.ru писал(а):Ибо все эти уровни привилегий/диспетчеры памяти - штука тёмная для лично меня.
В них нет таких сложностей. Самые обычные МК.
Код нужно писать, а не мышкотыкать!psw2.ru писал(а):АутоматишКодеКонфигуратор с галками такого не предлагает, нет такой иконки ?Но "простота" - манит ?
Это из собственного опыта?psw2.ru писал(а):А фантастические заявления пенсионера типа "я разобрался с USB - там всё просто - втыкай и работает" - легко прерываются вопросом типа "а подскажите формат дескриптора для HID" например.И воспевание интеллекта обезъяны, которая самостоятельно разобралась что при нажатии картинки "банан" в лоток снизу падает реальный банан - ну, достойно простоты, согласен.
Начальную инициализацию производить не нужно. Код написал производителем МК. Разве что нужно подобрать коэффициенты умножителей и делителей, но это математика на уровне 5 класса. Настройка периферии тоже не сложная (например используя библиотеку SPL) и в сети можно найти примеры.psw2.ru писал(а):Какой смысл соблазнять лично меня ресурсами платформы, которую лично я не могу инициализировать ?
Нужно изучать платформу, ведь изначально мы даже ходить и говорить не умели не говоря о другом и всему приходилось учится.
Все, но есть ограничение на общий ток потребления. Если не ошибаюсь 150 мА, но может быть больше в зависимости от модели МК.psw2.ru писал(а):И что, прям все выводы 25/25 мА или только 8 штук ?
Разве не знаете что программная работа не совсем совместима с прерываниями? Это можно обойти, но если задача простая и есть свободные USART, то почему его не использовать? Например в STM32F103C8T6 есть 3 USART. В STM32F103RET6 есть 3 USART и 2 UART.psw2.ru писал(а):Ой, простите, оно бортовой аппаратный USART жрёт вместо чисто программной обработки.
Использование USART совместно с DMA также позволяет опрашивать датчики в одной из задач RTOS что позволяет минимизировать ресурсы затрачиваемые на опрос. Как вы будете программно опрашивать датчик в многозадачной среде, где выполнение задачи может быть прервано в любой момент?
В STM32 это не нужно. USART может работать в полудуплексном режиме используя один вывод и выход TXD можно настроить на работу с открытым коллектором.psw2.ru писал(а):И парочка транзисторов/паек на макетке для объединения TX+RX в один провод - тоже стоит денег/места на платке.


