sabrat 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 (изменено) · Жалоба Доброго времения суток. Долгое время пытался подружится с STM32 после AVR и вот дошли руки и имеем первые грабли. Суть проблемы такова. Пытаюсь прощупать архитектуру на камне STM32F103RET6. Среда для программирования KEIL v5+GCC+std peripheral library. С настройкой портов всё прошло нормально. После этого попытался разобратся с конфигурированием тактирования. Вот тут и начались проблемы. Вот код инициализации тактирвоания (взят на просторах интернета как пример): 1. RCC_DeInit(); // сброс настроек тактирования 2. RCC_HSICmd(DISABLE); // выключение внутреннего генератора 3. RCC_HSEConfig(RCC_HSE_ON); // включение внешнего генератора 4. RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);// Предделитель PREDIV1: HSE перед множителем PLLMUL 5. RCC_PLLConfig(RCC_PLLSource_PREDIV1 ,RCC_PLLMul_3); // тактирование HSE с PREDIV1 8/1*3 = 24МГЦ 6. RCC_PLLCmd(ENABLE); // Включаем множитель PLL 7. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Тактирование системной шины от множителя PLLMUL После компиляции имеем ошибки в строках 4 и 5. Жалуется что это всё не задекларировано. error: use of undeclared identifier `RCC_PLLSource_PREDIV1` Полез рыться в stm32f10x_rcc.c и stm32f10x_rcc.h и заметил что для контроллеров STM32F10X_HD все функции закрыты, а открыты для Value Line контроллеров. Например из stm32f10x_rcc.h: #ifdef STM32F10X_CL /* PREDIV1 clock source (for STM32 connectivity line devices) */ #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) #define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE) || \ ((SOURCE) == RCC_PREDIV1_Source_PLL2)) #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) /* PREDIV1 clock source (for STM32 Value line devices) */ #define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) #define IS_RCC_PREDIV1_SOURCE(SOURCE) (((SOURCE) == RCC_PREDIV1_Source_HSE)) #endif Попробовал, для подтверждения, поменять с свойствах проекта контроллер на любой из серии Value Line и всё отлично скомпелировалось. Уже не знаю что и делать, потому обращаюсь за помощью. Изменено 4 ноября, 2015 пользователем sabrat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба Проверьте что стоит в Project->options for targer ... >C\C++>Define Должно стоять STM32F10X_HD если STM32F103RET6 является HD, сейчас не могу проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sabrat 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба C/C++ Define: USE_STDPERIPH_DRIVER Compiler control string: -c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I D:\STM32_Projekts\HelloWordMDK5-2015-11-03\HelloWordMDK5\RTE -I D:\STM32_Projekts\HelloWordMDK5-2015-11-03\HelloWordMDK5\RTE\Device\STM32F103RE -I C:\Keil_v5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include -I C:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.0.0\Device\Include -I C:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.0.0\Device\StdPeriph_Driver\inc -I C:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.0.0\RTE_Driver -D__UVISION_VERSION="516" -D_RTE_ -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -o ".\Objects\*.o" --omf_browse ".\Objects\*.crf" --depend ".\Objects\*.d" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба Вот код инициализации тактирвоания (взят на просторах интернета как пример): А мне нравится регистры программировать. Никогда не знаешь, какой говнокод сидит у них там в блюмблюатеках. FLASH_ACR = 0x32; /* flash: 2 wait states */ /* 25 MHz crystal connected to HSE */ RCC_CR |= (1 << 16); /* HSE on */ while ((RCC_CR & (1 << 17)) == 0) { /* wait for HSE to stabilize */ } /* configure PLL2 for 40 MHz output */ RCC_CFGR2 = (1 << 16) /* PREDIV1SRC=PLL2 */ | (6 << 8) /* PLL2MUL=8 */ | (4 << 4) /* PREDIV2=5 */ | (4 << 0);/* PREDIV1=5 */ RCC_CR |= (1 << 26); /* PLL2 on */ while ((RCC_CR & (1 << 27)) == 0) { /* wait for PLL2 to stabilize */ } /* configure PLL for 56 MHz output, MCO=25 MHz (HSE) */ RCC_CFGR = (6 << 24) /* MCO=HSE */ | (5 << 18) /* PLLMUL=7 */ | (1 << 16) /* PLLSRC=PREDIV1 */ | (1 << 14) /* ADCPRE=4 */ | (4 << 8);/* PPRE1=2 */ RCC_CR |= (1 << 24); /* PLL on */ while ((RCC_CR & (1 << 25)) == 0) { /* wait for PLL to stabilize */ } RCC_CFGR |= 2; /* switch system clock to PLL */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба А мне нравится регистры программировать... И мне. :beer: Это для STM32F3xx: void System_init(void) { /* Задать полный доступ к сопроцессору(-ам) CP10, CP11 */ SCB->CPACR = 3UL << 10 * 2 | 3UL << 11 * 2; /* Задать работу от HSI, включить HSE */ RCC->CR |= RCC_CR_HSION | // HSI clock enable: On RCC_CR_HSEON | // HSE clock enable: On RCC_CR_HSEBYP; // HSE crystal oscillator bypass RCC->CFGR = RCC_CFGR_SW_0 * 0 | // System clock Switch: HSI RCC_CFGR_HPRE_0 * 0 | // AHB prescaler: SYSCLK not divided RCC_CFGR_PPRE1_0 * 0 | // APB1 prescaler: HCLK not divided RCC_CFGR_PPRE2_0 * 4 | // APB2 prescaler: HCLK / 2 RCC_CFGR_PLLSRC * 1 | // PLL entry clock source: HSE PREDIV1 RCC_CFGR_PLLXTPRE * 0 | // HSE divider for PLL entry: not divided RCC_CFGR_PLLMUL_0 * 7 | // PLL multiplication factor: x 9 (72 MHz) RCC_CFGR_USBPRE * 0 | // USB prescaler: PLL / 1.5 (48 MHz) RCC_CFGR_I2SSRC * 0 | // I2S external clock source selection: System clock RCC_CFGR_MCO_0 * 5 | // Microcontroller Clock Output: HSI RCC_CFGR_PLLNODIV * 0; // PLL is not divided to MCO: divided /* Запретить и сбросить все запросы прерываний */ RCC->CIR = RCC_CIR_LSIRDYIE * 0 | // LSI Ready Interrupt Enable RCC_CIR_LSERDYIE * 0 | // LSE Ready Interrupt Enable RCC_CIR_HSIRDYIE * 0 | // HSI Ready Interrupt Enable RCC_CIR_HSERDYIE * 0 | // HSE Ready Interrupt Enable RCC_CIR_PLLRDYIE * 0 | // PLL Ready Interrupt Enable RCC_CIR_LSIRDYC * 1 | // LSI Ready Interrupt Clear RCC_CIR_LSERDYC * 1 | // LSE Ready Interrupt Clear RCC_CIR_HSIRDYC * 1 | // HSI Ready Interrupt Clear RCC_CIR_HSERDYC * 1 | // HSE Ready Interrupt Clear RCC_CIR_PLLRDYC * 1 | // PLL Ready Interrupt Clear RCC_CIR_CSSC * 1; // Clock Security System Interrupt Clear /* Пределитель для PLL (младший бит совпадает с RCC_CFGR_PLLXTPRE) предделитель для АЦП */ RCC->CFGR2 = RCC_CFGR2_PREDIV_0 * 0 | // HSE input to PLL not divided RCC_CFGR2_ADCPRE12_0 * 16 | // ADC12 PLL clock divided by 1 = 72 MHz // RCC_CFGR2_ADCPRE34_0 * 16 | // ADC34 PLL clock divided by 1 = 72 MHz // RCC_CFGR2_ADCPRE12_0 * 0 | // ADC12 clock disabled, can use AHB clock RCC_CFGR2_ADCPRE34_0 * 0; // ADC34 clock disabled, can use AHB clock /* Пределитель для U(S)ART, I2C, TIM */ RCC->CFGR3 = RCC_CFGR3_USART1SW_0 * 0 | // PCLK selected as USART1 clock source RCC_CFGR3_I2C1SW * 1 | // PCLK selected as I2C1 clock RCC_CFGR3_I2C2SW * 1 | // PCLK clock selected as I2C2 clock RCC_CFGR3_TIM1SW * 0 | // PCLK2 clock RCC_CFGR3_TIM8SW * 0 | // PCLK2 clock RCC_CFGR3_USART2SW_0 * 0 | // PCLK selected as USART2 clock source RCC_CFGR3_USART3SW_0 * 0 | // PCLK selected as USART3 clock source RCC_CFGR3_UART4SW_0 * 0 | // PCLK selected as UART4 clock source RCC_CFGR3_UART5SW_0 * 0; // PCLK selected as UART5 clock source /* Ждать, пока включится HSE генератор. Включить PLL и защиту от сбоев */ while (!(RCC->CR & RCC_CR_HSERDY)); RCC->CR |= RCC_CR_PLLON | // PLL enable RCC_CR_CSSON; // Clock Security System enable /* Разрешить буфер предвыборки, установить латентность */ FLASH->ACR = FLASH_ACR_LATENCY_0 * 2 | // Two wait states FLASH_ACR_HLFCYA * 0 | // Flash Half Cycle Access Enable FLASH_ACR_PRFTBE * 1; // Prefetch buffer enable /* Ждать, пока появится готовность PLL */ while (!(RCC->CR & RCC_CR_PLLRDY)); /* Выбрать PLL как источник системной частоты Ждать, пока PLL выберется как источник системной частоты */ RCC->CFGR |= RCC_CFGR_SW_0 * 2; // System clock Switch: HSI -> PLL while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); /* Выключить внутренний генератор HSI */ // RCC->CR &= ~RCC_CR_HSION; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sabrat 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба выкладывайте здесь проект, так быстрей будет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 4 ноября, 2015 Опубликовано 4 ноября, 2015 · Жалоба Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён. Камень-то нафарширован, да. Сейчас аналогичная ситуация - камень STM32F107VCT6. Пытаюсь запустить Ethernet. HAL... в общем, не взлетает с ним пока что. Либо я что-то делаю не так, но в случайном месте после HAL_Init() вылетает HardFault. Возможно, причина и не там, но пока пишу всё в регистры и не знаю проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sabrat 0 4 ноября, 2015 Опубликовано 4 ноября, 2015 (изменено) · Жалоба выкладывайте здесь проект, так быстрей будет Спасибо огромное! Завтра буду на работе - выложу. P.S. Я смотрю SPL уже не актуально. Сейчас HAL в трэнде. Что скажете за это HAl библиотеки? Изменено 4 ноября, 2015 пользователем sabrat Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sabrat 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба выкладывайте здесь проект, так быстрей будет Проект во сложении HelloWordMDK5_2015_11_03.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба Так там же английским по белому написано какие параметры для каких контроллеров: А для понимания и расчета клоков можно поставить CubeMx, там есть полезная вкладка: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sabrat 0 5 ноября, 2015 Опубликовано 5 ноября, 2015 · Жалоба Посыпаю голову пеплом....Большое спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться