Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: дефайны для побитного доступа к портам lpc23xx/24xx
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
sherr
Вот сделал набор дефайнов для битового доступа к портам lpc 2478 (годится и для других старших lpc 23-24xx, только FIO). Всё крайне тупо и
примитивно, но может кому и пригодится, в дальнейшем может быть дополню другими вариантами доступа к портам и примитивной нас-
тройкой кое - какой периферии .
p.s. ругайте !
esaulenka
ругаться тут можно на
а) FIOxSET, FIOxCLR перед записью читать не нужно!!
б) нестандартные имена
в) некрасивый, на мой взгляд, вызов макроса
предпочёл бы P0.0_IN(); вместо P0.0_IN;
г) супер-мега-монстр типа дефайн-внутри-дефайна у меня не удался smile.gif
но такой объем copy-paste... некрасиво...

я делал вот такую штуку

Код
// регистры Fast GPIO для LPC23xx
#define PORT0    0x3FFFC000
#define PORT1    0x3FFFC020
#define PORT2    0x3FFFC040
#define PORT3    0x3FFFC060
#define PORT4    0x3FFFC080
#define FIODIR(port)    (*(volatile unsigned long *)(port + 0x00))
#define FIOMASK(port)    (*(volatile unsigned long *)(port + 0x10))
#define FIOPIN(port)    (*(volatile unsigned long *)(port + 0x14))
#define FIOSET(port)    (*(volatile unsigned long *)(port + 0x18))
#define FIOCLR(port)    (*(volatile unsigned long *)(port + 0x1C))


а потом определял кучу однотипных функций (надо было обращаться "поштучно" к 40 пинам, хаотично разбросанным по всем портам)
Код
#define DefPin(PinName,Port,BitNo)            \
    void Set##PinName (int val)                    \
    {                                            \
        FIODIR(Port) |= BIT(BitNo);                \
        if (val) FIOSET(Port) = BIT(BitNo);        \
        else FIOCLR(Port) = BIT(BitNo);            \
    }                                            \
    int Get##PinName (void)                        \
    {                                            \
        FIODIR(Port) &= ~BIT(BitNo);            \
        return (FIOPIN(Port) & BIT(BitNo));        \
    }

DefPin (RST2, PORT1, 29);


можно расширить, скажем, так:
Код
#define PORT_IN(port,pin)    FIODIR(port) &= ~(1UL<<(pin))
#define PORT_SET(port,pin)    FIOSET(port) = (1UL<<(pin))

впрочем, эти макросы тоже заслуживают эпитетов "нестандартно" и "некрасиво" wink.gif
sherr
Спасибо! По первому примеру вашего кода - ясно, сам собираюсь добавить нечто аналогичное, да ещё в 2-3
разных вариантах, с разной степенью параметризации. За второй пример спасибо отдельное -- такие же про-
блемы, только пинов пока поменьше -- для клавы 5*6 + тачскрин + по мелочам кое - что. Буду рихтовать.


p.s. библиотечку бы низкоуровневую под АТ45DB321D буфер записать-прочитать -- скинуть в сектор --
забрать из сектора итд, без ФС.
sherr
Тот код что во вложении - не работает из-за точек в дефайнах. Вот рабочий.
esaulenka
Хех, слона с точками я не приметил smile.gif Точнее, поленился разбираться.


А что за трудности с датафлешем?
Если писать блоками, не вылезающими за пределы одной страницы - 264 (или сколько там, 528?) байт, то никаких проблем я не вижу.
Если писать сколько хочешь куда хочешь, получится чуть сложнее. Читать - без разницы.

Сам делал модуль для AT45DB011, но он получился сильно заточненым под мои данные.
Какие-то конкретные вопросы можно и обсудить smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.