|
STM32F0+Keil=простой старт, Помогите начать работать с АРМ Cortex M0 |
|
|
|
 |
Ответов
(1 - 56)
|
Jul 21 2013, 09:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Привет. Где-то я тебя видел  Надо было здесь писать - http://electronix.ru/forum/index.php?showforum=190 . Модераторы перенесут. 1. Запустить кейл, зайти в меню Project -> New project 2. Указать путь, где будет лежать проект. 3. Указать имя файла проекта. Например, test1. Жмём сохранить. 4. Выбираем из кучи нужный процессор, например, STM32F051. Я не знаю, какой там у тебя на плате стоит, сам укажи, какой надо. 5. Кейл спросит, скопировать ли файл startup_.....s в каталог проекта. Лучше согласиться. 6. В принципе, всё. Но в этом виде проект неработоспособен, т.к. кейл не генерит main и не добавляет в проект ещё один важный файл - system_stm32f0xx.c .В нём лежит код инициализации проца (тактовый генерратор и пр.). Этот файл есть в директории кейла, у меня это C:\Keil\ARM\Startup\ST\STM32F0xx\. Ну и main добавить. Т.к. кейл жутко гадит временными и объектными файлами в каталог проекта, то лучше держать свои модули (файлы *.c) в каком-нибудь подкаталоге. Результат прилагаю. Библиотеки периферии и пр. надо качать с сайта ST и добавлять нужное в проект руками. Если что, спрашивай.
Прикрепленные файлы
TestF0.zip ( 108.81 килобайт )
Кол-во скачиваний: 100
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Jul 21 2013, 09:13
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(hd44780 @ Jul 21 2013, 12:04)  Привет. Где-то я тебя видел  Привет! Спасибо большое за помощь  Подскажи, где взять этот пакет? stm32f0xx stdperiph_lib На сайте производителя по поиску ни в какую не находит!!!!!!! Уже готов разбить "аП стену" монитор  ) Где вообще взять этот злосчастный пакет библиотек?! Надо: CMSIS & SPL Цитата(hd44780 @ Jul 21 2013, 12:04)  Если что, спрашивай. СПАСИБО огромнейшее! Скачал твой пример, и проект от компилировался!!!  Теперь надо что то полезное (работоспособное) откомпилировать
Сообщение отредактировал Artos5 - Jul 21 2013, 09:09
|
|
|
|
|
Jul 21 2013, 09:16
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Я тоже пару дней ковыряюсь, с STM32F0Discovery, хочу выполнить маленькую задачу. Пока проблем не увидел. А в чем у Вас проблемы? Напишите, поможем чем сможем. В рабочей папке проекта создал папки: CMSIS, StdLib, Project, Source. В CMSIS скопировал startup_stm32f0xx.s, stm32f0xx.h, system_stm32f0xx.c и system_stm32f0xx.h. В StdLib папки inc и src из STM32F0xx_StdPeriph_Driver. В папке Project сохраняю сам проект. В Source stm32f0xx_it.c, stm32f0xx_it.h, stm32f0xx_conf.h и также создаю, в самом Keil, main.c, добавляю еще main.h, а также init_main.c и init_main.h, в которых инициализирую модули. При создании проекта выбираю нужный камень и в опциях проекта в С/С++ Define пишу USE_STDPERIPH_DRIVER,USE_FULL_ASSERT. Там же в Include Parts прописываю пути к папкам Source, CMSIS, StdLib/inc. Будут вопросы пишите.
|
|
|
|
|
Jul 21 2013, 09:21
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Хочу "поблымать" светодиодом . Но дальше не пойму как это сделать.. Я так понимаю надо подключить библиотеку для работы с вводом/выводом , но где ее взять? Проц в твоем проекте выбран в точности такой как у меня стоит на плате  Цитата(andries5 @ Jul 21 2013, 12:16)  В CMSIS скопировал startup_stm32f0xx.s, stm32f0xx.h, system_stm32f0xx.c и system_stm32f0xx.h Спасибо за помощь Вам! Где взять выше указанные файлы? Можно поделиться настроенным проектом со всеми выше указанными файлами? Буду Вам очень признателен!
Сообщение отредактировал Artos5 - Jul 21 2013, 09:18
|
|
|
|
|
Jul 21 2013, 09:23
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
http://www.st.com/web/en/catalog/tools/PF257884Скачать STSW-STM32048. В нем есть папка STM32F0xx_StdPeriph_Lib_V1.0.0, а в ней папка Libraries. Вот там все есть CMSIS & SPL.
|
|
|
|
|
Jul 21 2013, 09:44
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(hd44780 @ Jul 21 2013, 12:21)  Пребольшущее Тебе спасибо  А то по поиску на ихнем сайте ничего не находило......... Буду сейчас ковырять  Цитата(andries5 @ Jul 21 2013, 12:16)  В Source stm32f0xx_it.c, stm32f0xx_it.h, stm32f0xx_conf.h и также создаю, в самом Keil, main.c, добавляю еще main.h, а также init_main.c и init_main.h, в которых инициализирую модули. Прошу прощение за возможно ламерский вопрос... В архиве нашел мешок таких файлов. Какие из них надо добавить к проекту? И всеже для меня , было бы проще разобраться в прикрепленном проекте.. А то я что то уже запутался : ))
Сообщение отредактировал Artos5 - Jul 21 2013, 09:47
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 21 2013, 09:47
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Цитата(Artos5 @ Jul 21 2013, 12:21)  Хочу "поблымать" светодиодом . Но дальше не пойму как это сделать.. Можно поделиться настроенным проектом со всеми выше указанными файлами? Буду Вам очень признателен!  Создал проект, пробуйте.
|
|
|
|
|
Jul 21 2013, 10:07
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 12:47)  Создал проект, пробуйте. Спасибо большое! Откомпилировал, залил, работает!  Цитата(andries5 @ Jul 21 2013, 12:47)  пробуйте. В вашем коде есть строчка: Код if(Butt_User_Get_State != RESET) { LED_Blue_On; LED_Greeen_On; } else { LED_Blue_Off; LED_Greeen_On; Delay(1000); LED_Blue_On; LED_Greeen_Off; Delay(1000); } Все понятно кроме одного. Где взялась строчка: Butt_User_Get_State и строчка: RESET Чтобы было "задефайнено" не вижу..
|
|
|
|
|
Jul 21 2013, 10:12
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(Artos5 @ Jul 21 2013, 13:07)  Все понятно кроме одного. Где взялась строчка: Butt_User_Get_State и строчка: RESET Чтобы было "задефайнено" не вижу.. Вопрос снят, нашел
|
|
|
|
|
Jul 21 2013, 10:24
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 12:47)  Создал проект, пробуйте. Второй ламерский вопрос: Код void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } Не понятный для меня код... как выполняется декремент? Если бы было так: Код void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay ) { TimingDelay--; } } Вопросов бы не было вовсе  И тоже для меня странно... нету объявления TimingDelay это переменная или это какой то системный таймер?
Сообщение отредактировал Artos5 - Jul 21 2013, 10:17
|
|
|
|
|
Jul 21 2013, 11:30
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(toweroff @ Jul 21 2013, 13:38)  глобальная переменная. Декремент смотреть в прерывании системного таймера объявлена в main.c (как вы ищите - непонятно) Переменную нашел в мейн . Теперь не найду где выполняется декремент.. Все, нашел! Урааааааааа!
|
|
|
|
|
Jul 21 2013, 12:10
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Все по своим отдельным файлам, не люблю когда все в одном в виде каши. Думаю так удобнее.
|
|
|
|
|
Jul 21 2013, 12:23
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 15:10)  Все по своим отдельным файлам, не люблю когда все в одном в виде каши. Думаю так удобнее. А скажите пожалуйста, с какой частотой происходит прерывание системного таймера? И как например задействовать Код void TIM17_IRQHandler(void) { } Это прерывание? Достаточно вбить туда переменную? Подозреваю, что нужны еще дополнительные телодвижения  Посмотрел даташит на МК, и я просто в шоке  Такая куча возможностей!!! Таймеров дофига и всего прочего
|
|
|
|
|
Jul 21 2013, 12:30
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Цитата(Artos5 @ Jul 21 2013, 15:15)  А скажите пожалуйста, с какой частотой происходит прерывание системного таймера? И как например задействовать Код void TIM17_IRQHandler(void) { } Это прерывание? Достаточно вбить туда переменную? Подозреваю, что нужны еще дополнительные телодвижения  Прерывание системного таймера происходит согласно указанию SysTick_Config(SystemCoreClock / 1000); //1ms Если делить на 10000, то будет 0.1ms. Здесь можно изменить значение по своему усмотрению, в пределах возможного. В Keil нажав правую кнопку на непонятной переменной или функции, выбираете в меню "Go To Definition Of '...' " и попадаете в место ее определения. Очень удобно. Да это прерывание, Прерывание Timer17 и для этого сначала нужно проинициализировать таймер, включить режим прерываний и так далее.
|
|
|
|
|
Jul 21 2013, 13:01
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 15:30)  Прерывание системного таймера происходит согласно указанию SysTick_Config(SystemCoreClock / 1000); //1ms Если делить на 10000, то будет 0.1ms. Здесь можно изменить значение по своему усмотрению, в пределах возможного. В Keil нажав правую кнопку на непонятной переменной или функции, выбираете в меню "Go To Definition Of '...' " и попадаете в место ее определения. Очень удобно. Да это прерывание, Прерывание Timer17 и для этого сначала нужно проинициализировать таймер, включить режим прерываний и так далее. Спасибо Вам за помощь! Буду дальше пробовать разбираться  А сколько времени происходит вход в прерывание и его выполнение а потом выход из него?
Сообщение отредактировал Artos5 - Jul 21 2013, 13:00
|
|
|
|
|
Jul 21 2013, 14:23
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Цитата(Artos5 @ Jul 21 2013, 16:01)  А сколько времени происходит вход в прерывание и его выполнение а потом выход из него? Когда отладку включал с платой на stm32f103 через JTAG отладчик, то видел время каждого шага. Сейчас на этой плате не знаю. Я сам только учусь.
|
|
|
|
|
Jul 21 2013, 16:22
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(hd44780 @ Jul 21 2013, 18:58)  Я имел в виду на компе из кейла шьёшь? Попробуй ST-шную утилиту - http://www.st.com/web/en/catalog/tools/PF258168#header поставить. Только кейл перед этим закрой. Блин... закрыл Кейл. Запустил СТ Линк. И он отказывается дружить с программатором... все равно не видит программатор. Хотя система видит устройство прекрасно. Начал шить СТ Линк, после шаманства... Поставил в настройках Connect under reset. Что то не могу вкурить что это произошло... кейл по прежнему отказывается шить... Теперь Кейл пишет такую херню: flash download failed - Target DLL has been canсelledЧто то СТМ начинает тошнить  Что ему то не хватает?!
Сообщение отредактировал Artos5 - Jul 21 2013, 16:23
|
|
|
|
|
Jul 21 2013, 16:40
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
В свойствах проекта, на вкладке Utilites, в св-вах St-Link (settings), выбран STM32F05x Flash?
|
|
|
|
|
Jul 21 2013, 16:46
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 19:40)  В свойствах проекта, на вкладке Utilites, в св-вах St-Link (settings), выбран STM32F05x Flash? Выбран ST Link debugger и его поменять нельзя, он не активный Оно шилось нормально , шилось-шилось пока не "заглючило" резко . Резко начал ругаться Кейл...
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 21 2013, 16:47
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Нажать левой кнопкой на Use Target Drive for Flash Programming.
|
|
|
|
|
Jul 21 2013, 17:00
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 19:47)  Нажать левой кнопкой на Use Target Drive for Flash Programming. Спасибо Вам за наводку! Заработало! Только не могу понять почему оно заглючило!  Есть еще серьезная проблема... Не работает полностью PORTB инициализирую так: Код void Init_GPIO(void) { /* Private typedef ---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStruct_butt; GPIO_InitTypeDef GPIO_InitStruct_led; //GPIO_InitTypeDef GPIO_InitStruct_led1; /*Enable or disable the AHB peripheral clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); /** Configure pins as GPIO for USER button PA0 ------> GPIO_Input */
/* Configure Button pin as input */ GPIO_InitStruct_butt.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct_butt.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct_butt.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStruct_butt); /** Configure pins as GPIO for led PC8 ------> GPIO_Output blue PC9 ------> GPIO_Output green */
/*Configure GPIO pin */ GPIO_InitStruct_led.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStruct_led.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct_led.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct_led.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct_led.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStruct_led); /*Configure GPIO pin PORTB*/ GPIO_InitStruct_led.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStruct_led.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct_led.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct_led.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct_led.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct_led); } и Код #define LED_Greeen_On (GPIOC->BSRR = GPIO_Pin_9) #define LED_Blue_On (GPIOC->BSRR = GPIO_Pin_8) #define LED_Greeen_Off (GPIOC->BRR = GPIO_Pin_9) #define LED_Blue_Off (GPIOC->BRR = GPIO_Pin_8) #define LED_Green_Toggle (GPIOC->ODR ^= GPIO_Pin_9) #define LED_Blue_Toggle (GPIOC->ODR ^= GPIO_Pin_8) #define Butt_User_Get_State (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) // led out config #define DATA_LED_1 (GPIOB->BSRR = GPIO_Pin_13) #define DATA_LED_0 (GPIOB->BRR = GPIO_Pin_13) #define CLOCK_LED_1 (GPIOB->BSRR = GPIO_Pin_14) #define CLOCK_LED_0 (GPIOB->BRR = GPIO_Pin_14) #define LATCH_LED_1 (GPIOB->BSRR = GPIO_Pin_15) #define LATCH_LED_0 (GPIOB->BRR = GPIO_Pin_15) Если настраиваю другой порт например: PORTA То все работает... Подозреваю что умер у меня в отладчике порт В
|
|
|
|
|
Jul 21 2013, 17:47
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Видимо моя вина, не расписал комментарии. Но это нормально, запомнит. А то автоматом прошло и хорошо, а надо в отладке пройти по шагам и понять что там делается подробно. Я так делаю. В ARM каждый модуль необходимо включить подачей тактового сигнала. hd44780 Вам подсказал, порты А и С были включены, а В нет. Потому и не заработал.
Сообщение отредактировал andries5 - Jul 21 2013, 17:51
|
|
|
|
|
Jul 21 2013, 18:12
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 20:47)  Видимо моя вина, не расписал комментарии. Но это нормально, запомнит. А то автоматом прошло и хорошо, а надо в отладке пройти по шагам и понять что там делается подробно. Я так делаю. В ARM каждый модуль необходимо включить подачей тактового сигнала. hd44780 Вам подсказал, порты А и С были включены, а В нет. Потому и не заработал. Большущее Вам спасибо! Не знаю , куда я смотрел ?  Теперь работает порт В : ))) Мне начинает нравится ARM! Особенно точностью генерирования сигнала! Настроил прерывание на 100Гц и в нем меняю состояние выхода, и мой мультиметр показал точно 50.00Гц !
|
|
|
|
|
Jul 21 2013, 19:28
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Цитата(Artos5 @ Jul 21 2013, 21:12)  Особенно точностью генерирования сигнала! Настроил прерывание на 100Гц и в нем меняю состояние выхода, и мой мультиметр показал точно 50.00Гц ! Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него.
|
|
|
|
|
Jul 21 2013, 19:31
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 22:28)  Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него. Я это заметил  А скажите пожалуйста что это за системный таймер? И с какой макс. частотой могут происходить прерывания?
|
|
|
|
|
Jul 21 2013, 19:44
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(andries5 @ Jul 21 2013, 22:28)  Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него. И что??? Вы ничего не путаете??? Цитата SB18 (MCO) ON Provides the 8 MHz for OSC_IN from MCO of STM32F103C8T6.
|
|
|
|
|
Jul 21 2013, 19:52
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Верно! SB18 замкнут, а SB17 разомкнут. Не обратил внимания. Значит от кварца. А о SYSTICK почитать например http://chipspace.ru/stm32-systick
Сообщение отредактировал andries5 - Jul 21 2013, 19:54
|
|
|
|
|
Jul 22 2013, 19:46
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Цитата(andries5 @ Jul 21 2013, 22:52)  Верно! SB18 замкнут, а SB17 разомкнут. Не обратил внимания. Значит от кварца. А о SYSTICK почитать например http://chipspace.ru/stm32-systickСпасибо! Хорошо разжевано!  Вот по больше таких примеров и описаний!
|
|
|
|
|
Jul 22 2013, 20:14
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 15-01-09
Из: Moldova
Пользователь №: 43 421

|
Сейчас разбираюсь с таймерами на F0, подбираю подобные описания.
|
|
|
|
|
Aug 16 2013, 17:21
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-02-06
Пользователь №: 14 373

|
вопрос снят)
Сообщение отредактировал _D9_ - Aug 16 2013, 17:45
|
|
|
|
|
Nov 6 2013, 04:12
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Цитата(andries5 @ Jul 21 2013, 11:47)  Создал проект, пробуйте. Не могу запустить проект в симуляторе - *** error 65: access violation at 0x0000000C : no 'read' permission Подскажите куда копать? Пробовал с stm32f100 debug c помощью st-link проходило успешно, вот только меню периферии существенно отличалось - можно было наблюдать подробную информацию о состоянии портов, настройках и частотах. Здесь же голые регистры показаны. Этот момент от чего зависит?
|
|
|
|
|
Nov 8 2013, 01:30
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Цитата(Falkon_99 @ Nov 7 2013, 07:40)  В симуляторе проэкт может не работать, например если при инициализации в коде есть бесконечный цикл ожидания готовности регистров. На реальной плате эта проверка легко проходит, а в симуляторе зависает. Может помочь галочка RUNtoMAIN, с которой вы пропустите начальный код STARTUP Дело в том что проект не стартовал совсем, в нулевом адресе. Галочка не помогла.. С другого проекта подглядел, здесь помогло. Установил параметр SARMCM3.DLL ->> "-REMAP" во вкладке Debug. Ошибки все равно идут, но симулирует, правда периферию показывает не так подробно как 32F100 и пользы не приносит. Что бы это значило? И еще вопрос, есть шанс прошить F0 при помощи st-link установленного vlDiscovery или сразу заказывать программатор вместе с МК?
|
|
|
|
|
Nov 12 2013, 07:54
|
Частый гость
 
Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613

|
Добрый день дорогие друзья и товарищи! Помогите пожалуйста чайнику... Начну по порядку. есть файлы: 1) main.c // тут есть функции индикации 2) STM32F0xx_it.c // тут содержатся обработчики прерывания Во втором файле , такой обработчик: Код void SysTick_Handler(void) { indication_funс(); } Код void led_out (){
clear_leds; // digit off switch (y) // select digit { case 0: IND_PORT->ODR = led_buff[0]; digit_1; break; case 1: IND_PORT->ODR = led_buff[1]; digit_2; break; case 2: IND_PORT->ODR = led_buff[2]; digit_3; break; } if (++y>2)y=0; }
void indication_func() {
temp1 = temp;
temp_lcd1=temp_lcd2=temp_lcd3=0; while (temp1>99) { temp1-=100; temp_lcd3++; }
while (temp1>9) { temp1-=10; temp_lcd2++; }
while (temp1<10 && temp1!=0) { temp1--; temp_lcd1++; }
if(temp<10) { led_buff[2]=led_table[temp_lcd1]; led_buff[1]=led_table[10]; led_buff[0]=led_table[10]; } else if(temp>9 && temp<100) { led_buff[1]=led_table[temp_lcd1]; led_buff[2]=led_table[temp_lcd2]; led_buff[0]=led_table[10]; } else if(temp>99) { led_buff[0]=led_table[temp_lcd1]; led_buff[1]=led_table[temp_lcd2]; led_buff[2]=led_table[temp_lcd3]; } led_out(); } Хочу поместить в обработчик системного таймера функцию Код indication_func(); Никакими из всевозможных способов мне не получается это сделать.... Надо такое: в прерывании работает индикация и разложение числа на разряды, а в основном цикле я только отправляю в переменную значения. Код temp=111; Помогите пожалуйста! Буду очень благодарен!
Сообщение отредактировал Artos5 - Nov 12 2013, 08:00
|
|
|
|
|
Jan 27 2014, 04:41
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Добрый день. У меня проблема с использованием adc, микросхема - STM32F050F4, измерение не происходит. В KEIL могу выбрать для ADC только регистр CCR (ADC->CCR) зато для ADC1 доступны регистры все Код // Включить тактирование порта B RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // Вывод 1 на аналоговый вход GPIOB->MODER |= GPIO_MODER_MODER1;
// Настройк ADC ADC1->CR |= ADC_CR_ADEN; ADC1->CFGR2 |= ADC_CFGR2_JITOFFDIV2;
ADC1->CHSELR |= ADC_CHSELR_CHSEL9; И при отладке в железе видно, что регистры не записываются в нужные значения Код // Главный цикл int main(void) { SysTick_Config(48000); while(1) { ADC1->CR |= ADC_CR_ADSTART; i=100; while(i); c=((ADC1->DR)>8); f[2]=c/100%10; f[1]=c/10%10; f[0]=c%10; } } //Обработчик прерывания системного таймера - индикация void SysTick_Handler(void) { if(i)i--; c_i++; if(c_i==3) c_i=0; GPIOA->BSRR = 0xffff0000; // сброс GPIOA->BSRR = ((mask_led[f[c_i]])&0xff) | mask_ind[c_i]; return; } Проясните пожалуйста: Что значит ADC1 и чем оно отличается от ADC ? Каким образом мне записывать значения в регистры, так, чтоб они отображались и работали?
|
|
|
|
|
Jan 27 2014, 17:52
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Цитата(ViKo @ Jan 27 2014, 09:59)  А тактирование АЦП включили? Нужную тактовую частоту подали? По умолчанию тактирование включено от асинхронного собственного генератора 14 МГц. Также пробовал подключать такты к шине AHB/2, эффект точно такой же. Код ADC1->CFGR2 |= ADC_CFGR2_JITOFFDIV2; Проблема в том, что не записываются данные в регистры ADC после выполнения строк кода. Ни в режиме симулятора, ни в дебаге железа. Код ADC1->CR |= ADC_CR_ADEN; ADC1->CFGR2 |= ADC_CFGR2_JITOFFDIV2; Проверял пути к адресам flash, начало ADC1 - 0x40012400. Соответствует документации. Битовые маски тоже годные. Регистры портов и тактирования записываются корректно. Индикация работает, при записи в переменную "с" константы, она выводится. Подозреваю проблема с настройками библиотек. Нужно ли их настраивать, если да, то каким образом ? Прикрепил проект полностью
|
|
|
|
|
Jan 28 2014, 21:05
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Всем спасибо за участие, проблему решил. Оказалось нужно дополнительно включить такты на управление регистрами ADC Код RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; Теперь все в порядке
|
|
|
|
|
Mar 10 2014, 14:43
|
Группа: Новичок
Сообщений: 6
Регистрация: 6-11-13
Пользователь №: 79 060

|
Здравствуйте. Вопрос по прерыванию готовности результата группы измерений АЦП Не могу найти данный обработчик в серии F0. Стоит задача запустить группу преобразований и отправить через DMA обработать прерывание по окончанию преобразования группы измерений. Каким образом вызвать такое прерывание если в списке векторов прерывания в библиотеке нашел только вызов оконного : Код ADC1_COMP_IRQn = 12, /*!< ADC1, COMP1 and COMP2 Interrupts */ Образцы работы с ADC + DMA есть для другой f10x серии, но там в библиотеке обработчик описан, а тут нет
|
|
|
|
|
Jul 19 2015, 14:23
|
Группа: Новичок
Сообщений: 1
Регистрация: 19-07-15
Пользователь №: 87 632

|
вСЕМ ПРИВЕТ! я начинаю изучать stm 32 f0 и вот возник вопрос,итак внимание: объясните в чем вызвана разница в синтаксисе(в том числе во включение тактирования портов) пример 1 // Включить тактирование порта C RCC->AHBENR |= RCC_AHBENR_GPIOCEN; // 9, 10 выводы - на выход (general purpose output mode) GPIOC->MODER |= GPIO_MODER_MODER9_0 | GPIO_MODER_MODER10_0; пример 2 GPIO_InitTypeDef GPIO_InitStruct_butt; GPIO_InitTypeDef GPIO_InitStruct_led; /*Enable or disable the AHB peripheral clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); вроде бы одно и тоже,но написано чуть по разному,тут мелькают практически все сообщения со вторым вариантом написания, первый вариант накопал допустим тут: http://teplofizik.diary.ru/p182430549.htm?oam#more1как правильнее писать, и еще вопрос почему когда в кейле пытаюсь написать первым вариантом он не может понять что я инициализурую( ну короче вообще не компилится и команды красным подчеркивает) я так понимаю,что в каком-то служебном файлике команды прописаны как во втором варианте,если я прав подскажите как файлик называется,уже столько времени копаюсь,что ппц... спасибо всем тем кто поставит на путь истинный  !
|
|
|
|
|
Jul 23 2015, 08:17
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (toweroff @ Jul 22 2015, 22:44)  я знаю Вашу "любовь" к библиотекам, написанным не Вами... Увы, это жизненный опыт  . C середины 90x годов встречал только с разной степенью безумности писанные "библиотеки". Вот почти прямо сейчас вожусь с JN5168 чипом. С ним уже абсолютно вырожденный вариант - документации нет вообще - только либы и точка. Либы само-собой уже без исходников. Казалось-бы меньше знаешь - крепче спишь, но ведь дерьмо лезет все равно. API написано через анус, хотя для тех-же базовых функций предачи пакетов мог-ли-бы посмотреть хотя-бы лет тридцать назад специфицированный интерфейс пакетного драйвера. Так нет, написана какя-то фигня котороая как-бы с одной стороны как-бы показывет, что опыт проедшественников как-бы знаком, но с другой стороны, что ОН НЕ ПОНЯТ!!! Море байтовых пременых на 32bit контроллере, сруктруры БЕЗ правил паковки, но зато местами за неведомым хреном с напихаными выравнивающими полями. Один кусок "библиотеки" все-же есть в исходнике, ибо не смогли родить достойный API - пришлось отдавать пользователям шанс расхлебать. Так я чуть мозг не вывихнул думая, что в том нагромождении структур и очередей есть какой-то смысл и наихитрейшая хитрость. Но ее там нет. Совсем нет. Одна глупость нагромождения школярских рецептов программирования которые запихнули в автора сего творения преподаватели, но не смогли впихнуть ему мозга побольше. QUOTE , но для первого старта - посмотреть что и как - вполне себе хотя... там действительно все как-то сделано... нипанашынски  тоже делаю свое, хоть и с подсмотром некоторых моментов из SPL со сверкой с даташитом Ну так безусловного отторжения "библиотек" нет - все-же хоть как-то работающий хоть какой-то образчик. Дальше уже если что-то дышет - дальше сам. Но уж на "библиотечные" функции типа "подрыгать ножкой" уж точно не смотрю никогда. На самом деле проблемы с разными "исходниками" зачастую начинабтся еще раньше библиотек - поставщики компиляторов обычно поставляют и хидеры. Причем все чаще и чаще обращаются более, чем вольно с описаниями производителя и напихивают своих даже не расширений а вообще уродств. Понятно, что-бы начинающе-непонимающие на другой компилятор не соскакивали. Посему почти всегда правки начинаются уже с постепенного добавления собственноручно написанных/правленых хидеров.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|