21 Востаннє редагувалося taburyak (25.07.2016 14:07:08)

Re: STM32, Atolic TrueStudio, CubeMX

Дякую за відповідь пане VitekSVM і корисні поради. Прочитав давно, але було не до писанини. Перемкнувся трішки на інше. Морочусь з RTC. З Alarm не виходить, щоб апаратний будильник був. Мабуть плюну і програмний буде.
І ще хотів перевірити як зберігається час від резервного живлення, а не вийшло. Бо на платі STM32VLDiscavery не правильно зробили розведення. По схемам в доках все вірно, а на платі не відповідає. Ось реально що є. Має бути - як зняти SB1 то на 1 пін чипу від VBAT подаємо резервне живлення. А в реалі, що при знятої SB1 в повітрі висить VBAT з С16, а 1 пін чипу як був з'єднаний з основним живленням, так і залишився. Майте на увазі. Бо в інеті такого я ніде не зустрічав ще. Треба буде відпаювати 1 пін чипу від схеми і самому десь ліпити vbat саморобний.
http://replace.org.ua/misc.php?action=pun_attachment&item=1333&download=0

Post's attachments

schem vbat.png 70.66 kb, 119 downloads since 2016-07-25 

Подякували: 0xDADA11C71

22 Востаннє редагувалося taburyak (29.12.2014 21:23:35)

Re: STM32, Atolic TrueStudio, CubeMX

Вітання.
З ALARM трішки є просування.

Зрозумів помилку. Підглянув тут http://www.diygoodies.org.ua/?p=634

Як виявилось, моя помилка в тому, що не існує якогось окремого переривання для ALARM. Всі можливі події RTC в одному перериванні, тільки треба перевірити регістри, щоб виявити, що викликало переривання.

Тут дозволяємо переривання по секундам і будильнику:

    RCC_ITConfig(RTC_IT_ALR, ENABLE);//дозволити переривання при збігу рахункового і сигнального регістра
    RTC_WaitForLastTask();//Чекаємо поки останні операції запису у регистри RTC завершаться
    RTC_ITConfig(RTC_IT_SEC, ENABLE);//Вмикаємо відлік RTC по секундам
    RTC_WaitForLastTask();//Чекаємо поки останні операції запису у регистри RTC завершаться
NVIC_EnableIRQ (RTC_IRQn);//

Встановлюю будильник на 10 сек:

RTC_SetAlarm(10);

Обробник переривань (кожну секунду міняємо стан синього вогника, по будильнику світимо зелений вогник):

void RTC_IRQHandler(void)
{
    if (RTC_GetFlagStatus(RTC_IT_SEC) == SET)//якщо минула секунда
    {
        RTC_ClearITPendingBit(RTC_IT_SEC);//очистити RTC переривання по секундам
        RTC_WaitForLastTask();//чекаємо поки останні операції запису до RTC закінчаться
        LCD_PORT->ODR ^= LED_BLUE;//перемикаємо стан голубого світлодіода
    }
    if (RTC_GetFlagStatus(RTC_IT_ALR) == SET)//як стався збіг рахункового і сигнального регістра
    {
        RTC_ClearITPendingBit(RTC_IT_ALR);//очистка ALR переривання по збігу
        RTC_WaitForLastTask();//чекаємо поки останні операції запису до RTC закінчаться
        LCD_PORT->BSRR = LED_GREEN;//засвітимо зелений світлодіод
    }
}

Це працює.
Але є одне але. Коли я задаю певну дату і час для таймера, та ту саму дату і час, плюс 10 секунд, то зелений вогник не запалюється. Функція cal_get_timer повертає кількість секунд від 1.1.1970 00:00 до дати і часу що задаю.
Так не працює:

    RTC_SetCounter(cal_get_timer(2014,12,29,19,38,00));
    RTC_SetAlarm(cal_get_timer(2014,12,29,19,38,10));

Що не так?

23 Востаннє редагувалося taburyak (29.12.2014 21:24:50)

Re: STM32, Atolic TrueStudio, CubeMX

Де тут видаляти повідомлення?

24

Re: STM32, Atolic TrueStudio, CubeMX

Де тут видаляти повідомлення?

Повідомлення видаляти не можна, лише редагувати їх :)

25

Re: STM32, Atolic TrueStudio, CubeMX

Replace написав:

Де тут видаляти повідомлення?

Повідомлення видаляти не можна, лише редагувати їх :)

Та ото ж. Зрозуміло.

26

Re: STM32, Atolic TrueStudio, CubeMX

taburyak
Вангую, що ви там щось намудрували з контролером преривань в обхід стандартної бібліотеки, а тепер ридаєте, що вона не виконує покладених на неї функцій  :D

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

27 Востаннє редагувалося taburyak (06.02.2015 10:51:01)

Re: STM32, Atolic TrueStudio, CubeMX

Вітаннячко.
Черговий серйозний затик.
Дійшло діло, що мені потрібно організувати на STM32 + LCD 1602 менюшку, щоб кнопірки тиснути і міняти різні параметри там.
Сам я не маю уявлення як це організувати, тож пошукав, пошукав і надибав на micromenu для AVR'ок
https://github.com/abcminiuser/micromenu-v2
Вирішив що і мені воно підійде, бо коли шукав, то багато хто це micromenu використовує. Поверхневе ознайомлення показало що пункти меню зберігаються на флеші АВРки в файлі menuconfig.h зазначено:

/** Configuration for the desired memory storage location of created menu items.
     *  This may be configured to locate the menus into FLASH memory space, SRAM, or
     *  any other suitable memory space.
     */
    #define MENU_ITEM_STORAGE              PROGMEM
    
    /** Configuration for the macro or function required to read out a pointer from
     *  the memory storage space set by \ref MENU_ITEM_STORAGE.
     *
     *  \param[in] Addr  Address of the pointer to read
     */
    #define MENU_ITEM_READ_POINTER(Addr)   (void*)pgm_read_word(Addr)

Але й зазначено що замість флешпам'яті можна зберігати в ОЗУ. Як користуватись флешпам'яттю на STM32 я ще не розбирався і поки не планував. Влаштувало б розмістити в ОЗУ. Але як поміняти сирцеве micromenu, щоб не у флеш, а в ОЗУ зберігалось? Я з АВР'ками ніколи не стикався. І що то за такі штуки як PROGMEM і (void*)pgm_read_word(Addr) тільки інтуїтивно здогадуюсь.
Сам код мікроменю для мене теж дуже складний, але щоб розібратись краще, тре його якось запустити.
Допоможіть будь ласочка.

28 Востаннє редагувалося VitekSVM (08.02.2015 00:25:02)

Re: STM32, Atolic TrueStudio, CubeMX

Передмова: у восьмибітних AVR і MICROCHIP FLASH-память і RAM-память починають адресуватися з 0x0000  (і у інших виробників теж є такі). Тому щоб хоч якось їх відрізнити в програмі, вони в компіляторах 'С' ввели оператори типу PROGMEM , FLASH, RAM, ROM і інші. У Cortex-M3 адресація наскрізна в межах 4ГБ. У STM32F103 FLASH з 0х08000000, RAM - 0х20000000. Тож проблем з визначенням немає.

Тому (це стосується з глобальних змінних):

 // буде в FLASH
const int MyVar= -2345;
const float coeffs[5] ={0.012, 1.569, -56.678, 48.125, -3.567};

//буде в RAM
int YourVar= -2345;
float EnotherCoeffs[5] ={0.012, 1.569, -56.678, 48.125, -3.567};

Тепер відповідь на ваше питання.

PROGMEM замініть на const.
Думаю MENU_ITEM_READ_POINTER можна визначити так:

#define MENU_ITEM_READ_POINTER(Addr)   Addr

Example на https://github.com/abcminiuser/micromenu-v2 не найкращий

Подякували: 0xDADA11C7, taburyak2

29

Re: STM32, Atolic TrueStudio, CubeMX

ще з приводу https://github.com/abcminiuser/micromenu-v2
Мені сподобалось як вирішено звязок між менюшками.
Для статичного меню це добре.

А як реалізовано вивід динамічного параметру? - В приципі можна зробити в "GetButtonPress()" виклик якоїсь BUTTON_UPDATE_DIPSLAY через 0,2...0,5 секунди, якщо немає натиснутих клавіш.

А як реалізовано зміна параметрів (особливо якщо їх багато)?

Тому пропоную розкажу як зробив сам (коли використовую RTOS).
Є задача CheckButtons(), де визначається яку клавішу(-і) натиснуто.
При старті запускаю функцію Menu1, в якій:
1. Вивід статичного тексту для цього меню.
2. Вивід динамічної складової меню.
3. виклик GetButtonPress() для переходу в інші меню або зміна параметру
4. засинаю на 0,2 ... 0,5 сек
5. переходжу до п.2

без RTOS є три задачі:
1. CheckButtons() визначає натиснуті клавіші
2. SelectMenu() в якій переходи по меню або зміна параметру
3. RefreshDisplay() в якій власне виводиться інфа

ні в один з цих способів не вписується micromenu-v2

Подякували: taburyak1

30

Re: STM32, Atolic TrueStudio, CubeMX

VitekSVM написав:

Тепер відповідь на ваше питання.

PROGMEM замініть на const.
Думаю MENU_ITEM_READ_POINTER можна визначити так:

#define MENU_ITEM_READ_POINTER(Addr)   Addr

Example на https://github.com/abcminiuser/micromenu-v2 не найкращий

Дякую за пояснення. Трішки розвиднялось.

А який найкращий приклад меню?

31

Re: STM32, Atolic TrueStudio, CubeMX

VitekSVM написав:

ні в один з цих способів не вписується micromenu-v2

А що вписується?

Бо я не можу теоретично осягнути сам принцип, як побудувати програмно меню, саму структуру.
З самого початку думав зробити якусь структуру де будуть назва меню, значення параметру в який буде заноситись змінна яку міняємо і відображаємо на екрані, і до якої змінної прив'язаний параметр який міняємо (до якої змінної повернути поміняний параметр). І це все. Що з тим далі робить я не можу навіть в теорії оформити в думку. Не те що б скласти програмою. Зацікавився мікроменю бо там вже реалізований принцип "ходіння" по пунктам меню. До проблеми відображення динамічних даних в меню це ще дійти треба. Для цього треба мати робочий шмат коду з самим меню.

32

Re: STM32, Atolic TrueStudio, CubeMX

Все таки не можу я це зрозуміти і адаптувати під своє.

Є мікроменю для AVR https://github.com/abcminiuser/micromenu-v2

де в дефайнах є така конструкція:

#define MENU_ITEM_READ_POINTER(Addr)   (void*)pgm_read_word(Addr)

в додачу ще є таке:

/** Relative navigational menu entry for \ref Menu_Navigate(), to move to the menu parent. */
    #define MENU_PARENT         MENU_ITEM_READ_POINTER(&Menu_GetCurrentMenu()->Parent)

    /** Relative navigational menu entry for \ref Menu_Navigate(), to move to the menu child. */
    #define MENU_CHILD          MENU_ITEM_READ_POINTER(&Menu_GetCurrentMenu()->Child)

    /** Relative navigational menu entry for \ref Menu_Navigate(), to move to the next linked menu item. */
    #define MENU_NEXT           MENU_ITEM_READ_POINTER(&Menu_GetCurrentMenu()->Next)

    /** Relative navigational menu entry for \ref Menu_Navigate(), to move to the previous linked menu item. */
    #define MENU_PREVIOUS       MENU_ITEM_READ_POINTER(&Menu_GetCurrentMenu()->Previous)

Потім в функціях ще застосовується:

void Menu_Navigate(Menu_Item_t* const NewMenu)
{
    if ((NewMenu == &NULL_MENU) || (NewMenu == NULL))
        return;

    CurrentMenuItem = NewMenu;

    if (MenuWriteFunc)
        MenuWriteFunc(CurrentMenuItem->Text);

    void (*SelectCallback)(void) = MENU_ITEM_READ_POINTER(&CurrentMenuItem->SelectCallback);

    if (SelectCallback)
        SelectCallback();
}

void Menu_EnterCurrentItem(void)
{
    if ((CurrentMenuItem == &NULL_MENU) || (CurrentMenuItem == NULL))
        return;

    void (*EnterCallback)(void) = MENU_ITEM_READ_POINTER(&CurrentMenuItem->EnterCallback);

    if (EnterCallback)
        EnterCallback();
}

я так розумію що pgm_read_word це якась специфічна для АВРок функція щоб читати з ПЗП з конкретної адреси. А мені що з тим робити? Я не розумію.

33 Востаннє редагувалося taburyak (12.02.2015 14:29:15)

Re: STM32, Atolic TrueStudio, CubeMX

Щодо micromenu, надибав http://forum.easyelectronics.ru/viewtop … amp;t=7701

Щодо PROGMEM, то як підказав VitekSVM, поміняв на const - все добре
А щодо pgm_read_word, то виявляється його треба взагалі прибрати.

#define PREVIOUS   *((Menu_Item*)pgm_read_word(&CurrMenuItem->Previous))

міняти на

#define PREVIOUS   *((Menu_Item*)(CurrMenuItem->Previous))

Але в мікроменю2 є такий дефайн як

#define MENU_ITEM_READ_POINTER(Addr)   (void*)pgm_read_word(Addr)

щоб в програмі не використовувати цей дефайн, треба замість MENU_ITEM_READ_POINTER просто поставити *? Так? Чи просто MENU_ITEM_READ_POINTER прибрати? Без * в рядку компілятор свариться - warning: initialization from incompatible pointer type

void (*EnterCallback)(void) = (&CurrentMenuItem->EnterCallback); 

а так ні

void (*EnterCallback)(void) = *(&CurrentMenuItem->EnterCallback);

а тут що так

#define MENU_PARENT         *(&Menu_GetCurrentMenu()->Parent)

що так

#define MENU_PARENT         (&Menu_GetCurrentMenu()->Parent)

компілятор пропускає однаково, але я не розумію де правильно. це ще дуже складно для мене.

34

Re: STM32, Atolic TrueStudio, CubeMX

Не додивився  :-X

#define MENU_ITEM_READ_POINTER(Addr)   (void*)pgm_read_word(Addr)

замінити на

#define MENU_ITEM_READ_POINTER(Addr)   (void*)(Addr)
Подякували: taburyak1

35

Re: STM32, Atolic TrueStudio, CubeMX

VitekSVM написав:

замінити на

#define MENU_ITEM_READ_POINTER(Addr)   (void*)(Addr)

Дякую.

36

Re: STM32, Atolic TrueStudio, CubeMX

не можу я подолати це мікроменю, дуже складне воно  *WALL*
будь яке звертання до Menu_Navigate(&Menu_1); чи Menu_Navigate(MENU_PREVIOUS); і таке інше - повний зависон.
я не уявляю що робити з тим  %)

37

Re: STM32, Atolic TrueStudio, CubeMX

викладіть те що у вас вийшло.
і опишіть що значить зависає.

38 Востаннє редагувалося taburyak (20.02.2015 11:38:23)

Re: STM32, Atolic TrueStudio, CubeMX

main.c

Прихований текст

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

#include "hd44780.h"
#include "keyboard.h"
#include "MicroMenu.h"


void Periph_init(void);

MENU_ITEM(Menu_1, Menu_2, Menu_3, NULL_MENU, Menu_1_1,  NULL, NULL, "1");
MENU_ITEM(Menu_2, Menu_3, Menu_1, NULL_MENU, NULL_MENU, NULL, NULL, "2");
MENU_ITEM(Menu_3, Menu_1, Menu_2, NULL_MENU, NULL_MENU, NULL, NULL, "3");
MENU_ITEM(Menu_1_1, Menu_1_2, Menu_1_2, NULL_MENU, NULL_MENU, NULL, NULL, "1.1");
MENU_ITEM(Menu_1_2, Menu_1_1, Menu_1_1, NULL_MENU, NULL_MENU, NULL, NULL, "1.2");

int main(void)
{
    Periph_init();//ініціалізація периферії
    lcd_init();//ініціалізація дисплея
    lcd_setmode(VIEW_MODE_DispOn_BlkOff_CrsOff);
    lcd_clrscr();//Очищаємо дисплей
    LCD_BACKLIGHT_PORT->BSRR=LCD_BACKLIGHT;//Увімкнемо підсвітку екрану
    LED_SYS_PORT->BSRR=LED_SYS;

    /* Set up the default menu text write callback, and navigate to an absolute menu item entry. */
Menu_Navigate(&Menu_1);
    while(1)
    {
        switch (GetButtonPress())
        {
            case key_up:
                Menu_Navigate(MENU_PREVIOUS);
                break;
            case key_down:
                Menu_Navigate(MENU_NEXT);
                break;
            case key_set:
                Menu_Navigate(MENU_PARENT);
                break;
            case key_exit:
                Menu_Navigate(MENU_CHILD);
                break;
            case key_none:
                break;
            default:
                break;
        }
    }
}

Функцію повернення коду натиснутої кнопки не викладаю, бо працює як слід. Мікроменю теж без змін. Бібліотека LCD 1602 теж працює як слід.

Зависає на Menu_Navigate(&Menu_1); до while(1) не доходить. Як закоментувати рядок Menu_Navigate(&Menu_1);, то по натисканню будь якої кнопки зависає на Menu_Navigate().
Зависає значить зависає, я не знаю як пояснити. В режимі наладки debugger програма далі цих функцій не крокує. В файлі micromenu.c функції menu_navigate в рядку 49 SelectCallback(); дебагер пише No source available for "Menu_1()".

39 Востаннє редагувалося VitekSVM (21.02.2015 00:13:36)

Re: STM32, Atolic TrueStudio, CubeMX

В прикладі першими функціями є:

/* Set up the default menu text write callback, and navigate to an absolute menu item entry. */
    Menu_SetGenericWriteCallback(Generic_Write);
    Menu_Navigate(&Menu_1);

Перша показує якою функцією буде виводитись текст. (Обовязково потрібна)
Друга виводить перше меню.

У Вас є аналог Generic_Write() ?
Правда до while має доходити

40

Re: STM32, Atolic TrueStudio, CubeMX

VitekSVM написав:

Перша показує якою функцією буде виводитись текст. (Обовязково потрібна)
Друга виводить перше меню.

У Вас є аналог Generic_Write() ?
Правда до while має доходити

Ні, на жаль немає аналогу Generic_Write(), я не знав для чого це.
Хотів поки без виводу тексту, а просто щоб від кнопок бігало по меню (подивитись в режимі дебагер, щоб розібратись як працює), а воно висне. Вже потім додати функцію відображення тексту на екран.