Перейти к содержанию
    

Помогите начинающему STM32+KEIL5+std peripheral library

Доброго времения суток. Долгое время пытался подружится с 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 и всё отлично скомпелировалось.

 

Уже не знаю что и делать, потому обращаюсь за помощью.

Изменено пользователем sabrat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте что стоит в Project->options for targer ... >C\C++>Define

Должно стоять STM32F10X_HD если STM32F103RET6 является HD, сейчас не могу проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот код инициализации тактирвоания (взят на просторах интернета как пример):

А мне нравится регистры программировать. Никогда не знаешь, какой говнокод сидит у них там в блюмблюатеках.

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 */

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне нравится регистры программировать...

И мне. :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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён.

 

Камень-то нафарширован, да.

Сейчас аналогичная ситуация - камень STM32F107VCT6. Пытаюсь запустить Ethernet. HAL... в общем, не взлетает с ним пока что. Либо я что-то делаю не так, но в случайном месте после HAL_Init() вылетает HardFault. Возможно, причина и не там, но пока пишу всё в регистры и не знаю проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выкладывайте здесь проект, так быстрей будет

 

Спасибо огромное! Завтра буду на работе - выложу.

 

P.S. Я смотрю SPL уже не актуально. Сейчас HAL в трэнде. Что скажете за это HAl библиотеки?

Изменено пользователем sabrat

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выкладывайте здесь проект, так быстрей будет

 

Проект во сложении

HelloWordMDK5_2015_11_03.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так там же английским по белому написано какие параметры для каких контроллеров:

post-54460-1446710576_thumb.png

 

 

А для понимания и расчета клоков можно поставить CubeMx, там есть полезная вкладка:

post-54460-1446710586_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...