реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите начинающему STM32+KEIL5+std peripheral library, Ошибка компиляци с STM32F10X_HD
sabrat
сообщение Nov 4 2015, 13:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



Доброго времения суток. Долгое время пытался подружится с 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 - Nov 4 2015, 13:11
Go to the top of the page
 
+Quote Post
Integro
сообщение Nov 4 2015, 13:29
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



Проверьте что стоит в Project->options for targer ... >C\C++>Define
Должно стоять STM32F10X_HD если STM32F103RET6 является HD, сейчас не могу проверить.
Go to the top of the page
 
+Quote Post
sabrat
сообщение Nov 4 2015, 13:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



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"
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 4 2015, 13:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(sabrat @ Nov 4 2015, 16:06) *
Вот код инициализации тактирвоания (взят на просторах интернета как пример):

А мне нравится регистры программировать. Никогда не знаешь, какой говнокод сидит у них там в блюмблюатеках.
CODE
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 */
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 4 2015, 14:12
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ Nov 4 2015, 16:56) *
А мне нравится регистры программировать...

И мне. beer.gif Это для STM32F3xx:
CODE
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;
}
Go to the top of the page
 
+Quote Post
sabrat
сообщение Nov 4 2015, 14:12
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён.
Go to the top of the page
 
+Quote Post
Integro
сообщение Nov 4 2015, 15:10
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



выкладывайте здесь проект, так быстрей будет
Go to the top of the page
 
+Quote Post
AlanDrakes
сообщение Nov 4 2015, 16:19
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Цитата(sabrat @ Nov 4 2015, 20:12) *
Я на AVR долго на асме сидел и понимаю вас. Всё прозрачно и закономерно, но не читабельно ИМХО. Почему бы на столь нафаршированном камне как STM32F103RE не пользоваться библиотеками? Возможно я в дальнейшем и откажусь от использования библиотек, но вопрос то не решён.


Камень-то нафарширован, да.
Сейчас аналогичная ситуация - камень STM32F107VCT6. Пытаюсь запустить Ethernet. HAL... в общем, не взлетает с ним пока что. Либо я что-то делаю не так, но в случайном месте после HAL_Init() вылетает HardFault. Возможно, причина и не там, но пока пишу всё в регистры и не знаю проблем.
Go to the top of the page
 
+Quote Post
sabrat
сообщение Nov 4 2015, 18:19
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



Цитата(Integro @ Nov 4 2015, 19:10) *
выкладывайте здесь проект, так быстрей будет


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

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

Сообщение отредактировал sabrat - Nov 4 2015, 18:21
Go to the top of the page
 
+Quote Post
sabrat
сообщение Nov 5 2015, 07:04
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



Цитата(Integro @ Nov 4 2015, 19:10) *
выкладывайте здесь проект, так быстрей будет


Проект во сложении
Прикрепленные файлы
Прикрепленный файл  HelloWordMDK5_2015_11_03.rar ( 1.11 мегабайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
Integro
сообщение Nov 5 2015, 08:06
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460



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



А для понимания и расчета клоков можно поставить CubeMx, там есть полезная вкладка:
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
sabrat
сообщение Nov 5 2015, 08:11
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-12-05
Пользователь №: 12 204



Посыпаю голову пеплом....Большое спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016