Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F0+Keil=простой старт
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2
Artos5
Добрый день уважаемые форумчане!
Бьюсь уже третий день. Не могу начать работать с СТМ32Ф0...
В интернете полно примеров для STM32f1 серии, а для 0 серии информации "0".
Помогите (подскажите) пошаговую настройку Кейла для работы с STM32F0. Из отладочного комплекта имеется STM32F0Discovery
hd44780
Привет. Где-то я тебя видел sm.gif
Надо было здесь писать - 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 и добавлять нужное в проект руками.
Если что, спрашивай.
Artos5
Цитата(hd44780 @ Jul 21 2013, 12:04) *
Привет. Где-то я тебя видел sm.gif

Привет! Спасибо большое за помощь wink.gif

Подскажи, где взять этот пакет? stm32f0xx stdperiph_lib
На сайте производителя по поиску ни в какую не находит!!!!!!! Уже готов разбить "аП стену" монитор sm.gif)

Где вообще взять этот злосчастный пакет библиотек?! Надо: CMSIS & SPL

Цитата(hd44780 @ Jul 21 2013, 12:04) *
Если что, спрашивай.


СПАСИБО огромнейшее! Скачал твой пример, и проект от компилировался!!! sm.gif
Теперь надо что то полезное (работоспособное) откомпилировать sm.gif
andries5
Я тоже пару дней ковыряюсь, с 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.
Будут вопросы пишите.
Artos5
Хочу "поблымать" светодиодом . Но дальше не пойму как это сделать..
Я так понимаю надо подключить библиотеку для работы с вводом/выводом , но где ее взять?
Проц в твоем проекте выбран в точности такой как у меня стоит на плате sm.gif

Цитата(andries5 @ Jul 21 2013, 12:16) *
В CMSIS скопировал startup_stm32f0xx.s, stm32f0xx.h, system_stm32f0xx.c и system_stm32f0xx.h


Спасибо за помощь Вам!
Где взять выше указанные файлы?

Можно поделиться настроенным проектом со всеми выше указанными файлами? Буду Вам очень признателен! sm.gif
hd44780
Вот архив в сайта ST - http://www.st.com/web/en/catalog/tools/PF257885 для твоей платы.
В том числе и для кейла. Покопайся в них для начала. Там есть всё - библиотеки, заголовки, всё. Некоторые не любят SPL, но это уже вопросы религии.
andries5
http://www.st.com/web/en/catalog/tools/PF257884
Скачать STSW-STM32048. В нем есть папка STM32F0xx_StdPeriph_Lib_V1.0.0, а в ней папка Libraries. Вот там все есть CMSIS & SPL.
Artos5
Цитата(hd44780 @ Jul 21 2013, 12:21) *
Вот архив в сайта ST - http://www.st.com/web/en/catalog/tools/PF257885 для твоей платы.


Пребольшущее Тебе спасибо wink.gif
А то по поиску на ихнем сайте ничего не находило.........
Буду сейчас ковырять sm.gif


Цитата(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, в которых инициализирую модули.

Прошу прощение за возможно ламерский вопрос...
В архиве нашел мешок таких файлов. Какие из них надо добавить к проекту?
И всеже для меня , было бы проще разобраться в прикрепленном проекте.. А то я что то уже запутался : ))
andries5
Цитата(Artos5 @ Jul 21 2013, 12:21) *
Хочу "поблымать" светодиодом . Но дальше не пойму как это сделать..

Можно поделиться настроенным проектом со всеми выше указанными файлами? Буду Вам очень признателен! sm.gif

Создал проект, пробуйте.
Artos5
Цитата(andries5 @ Jul 21 2013, 12:47) *
Создал проект, пробуйте.


Спасибо большое! Откомпилировал, залил, работает! wink.gif


Цитата(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
Чтобы было "задефайнено" не вижу..
hd44780
Цитата(Artos5 @ Jul 21 2013, 12:44) *
А то по поиску на ихнем сайте ничего не находило.........


Надо искать по STM32F0Discovery. Эта ссылка оттуда rolleyes.gif .
Artos5
Цитата(Artos5 @ Jul 21 2013, 13:07) *
Все понятно кроме одного. Где взялась строчка: Butt_User_Get_State и строчка: RESET
Чтобы было "задефайнено" не вижу..


Вопрос снят, нашел sm.gif
hd44780
А я уж собрался подсказывать sm.gif
Artos5
Цитата(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--;
}
}


Вопросов бы не было вовсе sm.gif

И тоже для меня странно... нету объявления TimingDelay это переменная или это какой то системный таймер?
toweroff
Цитата(Artos5 @ Jul 21 2013, 14:24) *
Не понятный для меня код... как выполняется декремент?

И тоже для меня странно... нету объявления TimingDelay это переменная или это какой то системный таймер?

глобальная переменная. Декремент смотреть в прерывании системного таймера
объявлена в main.c (как вы ищите - непонятно)
Artos5
Цитата(toweroff @ Jul 21 2013, 13:38) *
глобальная переменная. Декремент смотреть в прерывании системного таймера
объявлена в main.c (как вы ищите - непонятно)


Переменную нашел в мейн .
Теперь не найду где выполняется декремент..

Все, нашел! Урааааааааа! sm.gif
andries5
Все по своим отдельным файлам, не люблю когда все в одном в виде каши. Думаю так удобнее.
Artos5
Цитата(andries5 @ Jul 21 2013, 15:10) *
Все по своим отдельным файлам, не люблю когда все в одном в виде каши. Думаю так удобнее.


А скажите пожалуйста, с какой частотой происходит прерывание системного таймера?
И как например задействовать

Код
void TIM17_IRQHandler(void)
{
    
}


Это прерывание?
Достаточно вбить туда переменную? Подозреваю, что нужны еще дополнительные телодвижения sm.gif

Посмотрел даташит на МК, и я просто в шоке sm.gif
Такая куча возможностей!!!
Таймеров дофига и всего прочего sm.gif
andries5
Цитата(Artos5 @ Jul 21 2013, 15:15) *
А скажите пожалуйста, с какой частотой происходит прерывание системного таймера?
И как например задействовать

Код
void TIM17_IRQHandler(void)
{
    
}


Это прерывание?
Достаточно вбить туда переменную? Подозреваю, что нужны еще дополнительные телодвижения sm.gif


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


Спасибо Вам за помощь!




Буду дальше пробовать разбираться sm.gif

А сколько времени происходит вход в прерывание и его выполнение а потом выход из него?
andries5
Цитата(Artos5 @ Jul 21 2013, 16:01) *
А сколько времени происходит вход в прерывание и его выполнение а потом выход из него?

Когда отладку включал с платой на stm32f103 через JTAG отладчик, то видел время каждого шага. Сейчас на этой плате не знаю. Я сам только учусь.
Artos5
Бедаааа.... отвалился программатор.
Не хочет шить . Выскакивает ошибка: "No target connected"
Хотя программатор видется.
hd44780
Чем шьёшь?
Artos5
stm32f0discovery
hd44780
Я имел в виду на компе из кейла шьёшь?
Попробуй ST-шную утилиту - http://www.st.com/web/en/catalog/tools/PF258168#header поставить. Только кейл перед этим закрой.
Artos5
Цитата(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
Что то СТМ начинает тошнить sm.gif

Что ему то не хватает?!
andries5
В свойствах проекта, на вкладке Utilites, в св-вах St-Link (settings), выбран STM32F05x Flash?
Artos5
Цитата(andries5 @ Jul 21 2013, 19:40) *
В свойствах проекта, на вкладке Utilites, в св-вах St-Link (settings), выбран STM32F05x Flash?

Выбран ST Link debugger и его поменять нельзя, он не активный

Оно шилось нормально , шилось-шилось пока не "заглючило" резко . Резко начал ругаться Кейл...
andries5
Нажать левой кнопкой на Use Target Drive for Flash Programming.
Artos5
Цитата(andries5 @ Jul 21 2013, 19:47) *
Нажать левой кнопкой на Use Target Drive for Flash Programming.

Спасибо Вам за наводку! Заработало!
Только не могу понять почему оно заглючило! sad.gif

Есть еще серьезная проблема...
Не работает полностью 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
То все работает...

Подозреваю что умер у меня в отладчике порт В sm.gif
hd44780
А где RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); ?
Или в F0 не нужно?
andries5
Видимо моя вина, не расписал комментарии. Но это нормально, запомнит. А то автоматом прошло и хорошо, а надо в отладке пройти по шагам и понять что там делается подробно. Я так делаю.
В ARM каждый модуль необходимо включить подачей тактового сигнала.
hd44780 Вам подсказал, порты А и С были включены, а В нет. Потому и не заработал.
Artos5
Цитата(andries5 @ Jul 21 2013, 20:47) *
Видимо моя вина, не расписал комментарии. Но это нормально, запомнит. А то автоматом прошло и хорошо, а надо в отладке пройти по шагам и понять что там делается подробно. Я так делаю.
В ARM каждый модуль необходимо включить подачей тактового сигнала.
hd44780 Вам подсказал, порты А и С были включены, а В нет. Потому и не заработал.


Большущее Вам спасибо! Не знаю , куда я смотрел ? sm.gif
Теперь работает порт В : )))

Мне начинает нравится ARM! Особенно точностью генерирования сигнала! Настроил прерывание на 100Гц и в нем меняю состояние выхода, и мой мультиметр показал точно 50.00Гц !
andries5
Цитата(Artos5 @ Jul 21 2013, 21:12) *
Особенно точностью генерирования сигнала! Настроил прерывание на 100Гц и в нем меняю состояние выхода, и мой мультиметр показал точно 50.00Гц !

Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него.
Artos5
Цитата(andries5 @ Jul 21 2013, 22:28) *
Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него.


Я это заметил sm.gif
А скажите пожалуйста что это за системный таймер? И с какой макс. частотой могут происходить прерывания?
HHIMERA
Цитата(andries5 @ Jul 21 2013, 22:28) *
Учтите, на плате STM32F0Discovery целевой МК, тактируется от встроенного генератора. На плате нет кварца! Только место под него.

И что??? Вы ничего не путаете???
Цитата
SB18 (MCO) ON Provides the 8 MHz for OSC_IN from MCO of STM32F103C8T6.

andries5
Верно! SB18 замкнут, а SB17 разомкнут. Не обратил внимания. Значит от кварца.
А о SYSTICK почитать например http://chipspace.ru/stm32-systick
Artos5
Цитата(andries5 @ Jul 21 2013, 22:52) *
Верно! SB18 замкнут, а SB17 разомкнут. Не обратил внимания. Значит от кварца.
А о SYSTICK почитать например http://chipspace.ru/stm32-systick


Спасибо! Хорошо разжевано! sm.gif
Вот по больше таких примеров и описаний!
andries5
Сейчас разбираюсь с таймерами на F0, подбираю подобные описания.
Artos5
Здесь были? >

http://forum.easyelectronics.ru/viewtopic....f=35&t=7080

Там по одной ссылке есть очень хорошая книга по СТМ32 на Русском!
_D9_
вопрос снят)
KuAlex
Цитата(andries5 @ Jul 21 2013, 11:47) *
Создал проект, пробуйте.


Не могу запустить проект в симуляторе - *** error 65: access violation at 0x0000000C : no 'read' permission

Подскажите куда копать?

Пробовал с stm32f100 debug c помощью st-link проходило успешно, вот только меню периферии существенно отличалось - можно было наблюдать подробную информацию о состоянии портов, настройках и частотах. Здесь же голые регистры показаны. Этот момент от чего зависит?
Falkon_99
В симуляторе проэкт может не работать, например если при инициализации в коде есть бесконечный цикл ожидания готовности регистров. На реальной плате эта проверка легко проходит, а в симуляторе зависает. Может помочь галочка RUNtoMAIN, с которой вы пропустите начальный код STARTUP
KuAlex
Цитата(Falkon_99 @ Nov 7 2013, 07:40) *
В симуляторе проэкт может не работать, например если при инициализации в коде есть бесконечный цикл ожидания готовности регистров. На реальной плате эта проверка легко проходит, а в симуляторе зависает. Может помочь галочка RUNtoMAIN, с которой вы пропустите начальный код STARTUP


Дело в том что проект не стартовал совсем, в нулевом адресе. Галочка не помогла..
С другого проекта подглядел, здесь помогло. Установил параметр SARMCM3.DLL ->> "-REMAP" во вкладке Debug. Ошибки все равно идут, но симулирует, правда периферию показывает не так подробно как 32F100 и пользы не приносит. Что бы это значило?

И еще вопрос, есть шанс прошить F0 при помощи st-link установленного vlDiscovery или сразу заказывать программатор вместе с МК?
Artos5
Добрый день дорогие друзья и товарищи!
Помогите пожалуйста чайнику...

Начну по порядку.
есть файлы:
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
Вроде разобрался, только не пойму почему "ворнинг" выскакивает...


..\Source\stm32f0xx_it.c(104): warning: #223-D: function "indication_func" declared implicitly
KuAlex
Добрый день.
У меня проблема с использованием 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 ?
Каким образом мне записывать значения в регистры, так, чтоб они отображались и работали?
ViKo
Цитата(KuAlex @ Jan 27 2014, 07:41) *
Добрый день.
У меня проблема с использованием adc, микросхема - STM32F050F4, измерение не происходит.
...
И при отладке в железе видно, что регистры не записываются в нужные значения
...
Каким образом мне записывать значения в регистры, так, чтоб они отображались и работали?

А тактирование АЦП включили? Нужную тактовую частоту подали?
KuAlex
Цитата(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. Соответствует документации. Битовые маски тоже годные.

Регистры портов и тактирования записываются корректно. Индикация работает, при записи в переменную "с" константы, она выводится.

Подозреваю проблема с настройками библиотек. Нужно ли их настраивать, если да, то каким образом ?
Прикрепил проект полностью
KuAlex
Всем спасибо за участие, проблему решил. Оказалось нужно дополнительно включить такты на управление регистрами ADC
Код
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;

Теперь все в порядке
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.