Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: управление ножками
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Tsyganoks
Есть контроллер nxp lpc1227. Нужно управлять группой пинов, расположенной на разных портах. Можно определить их так, что на ноге выставлялась 1 после присвоения единицы переменной, а не LPC_GPIO0->SET= PIN[n].
Ну или есть ли какие-нибудь другие способы отойти от этой записи?
toweroff
Читайте даташит. Если можно как-то иначе, чем записью в определенный порт в определенный разряд единицы - напишите в NXP, Вам вышлют лоток контроллеров и пропишут Ваши изыскания в еррату
Переопределениями - один паровоз, потянет он за собой несколько команд. Но не миллионы же раз это делать, правда?
Что касаемо самой записи - чем она Вам не нравится? Имея даташит в руках, все лаконично и понятно
Tsyganoks
Цитата(toweroff @ Jul 30 2012, 21:58) *
Читайте даташит. Если можно как-то иначе, чем записью в определенный порт в определенный разряд единицы - напишите в NXP, Вам вышлют лоток контроллеров и пропишут Ваши изыскания в еррату
Переопределениями - один паровоз, потянет он за собой несколько команд. Но не миллионы же раз это делать, правда?
Что касаемо самой записи - чем она Вам не нравится? Имея даташит в руках, все лаконично и понятно

не нравится тем, что была процедура для 51 контроллера, управляющая мультиплексором, выглядела так
Код
void MUX(char kanal)
         {
            A0=0x01&kanal;
            A1=0x02&kanal;
            A2=0x04&kanal;
          }

а в версии для арм ножки сидят на разных портах и как написать продеруру не нагородив кучу if я что-то не понимаю
andrewlekar
Нужно использовать силу C и библиотек от NXP.

Вот пример для LPC1114 (там ножки совсем перепутаны):

Код
//соответствие физических адресов порту 0
static uint32_t volatile * const lpc11xx_io_port0[] =
{
  &LPC_IOCON->RESET_PIO0_0,
  &LPC_IOCON->PIO0_1,
  &LPC_IOCON->PIO0_2,
  &LPC_IOCON->PIO0_3,
  &LPC_IOCON->PIO0_4,
  &LPC_IOCON->PIO0_5,
  &LPC_IOCON->PIO0_6,
  &LPC_IOCON->PIO0_7,
  &LPC_IOCON->PIO0_8,
  &LPC_IOCON->PIO0_9,
  &LPC_IOCON->JTAG_TCK_PIO0_10,
  &LPC_IOCON->JTAG_TDI_PIO0_11
};

//соответствие физических адресов порту 1
static uint32_t volatile * const lpc11xx_io_port1[] =
{
  &LPC_IOCON->JTAG_TMS_PIO1_0,
  &LPC_IOCON->JTAG_TDO_PIO1_1,
  &LPC_IOCON->JTAG_nTRST_PIO1_2,
  &LPC_IOCON->ARM_SWDIO_PIO1_3,
  &LPC_IOCON->PIO1_4,
  &LPC_IOCON->PIO1_5,
  &LPC_IOCON->PIO1_6,
  &LPC_IOCON->PIO1_7,
  &LPC_IOCON->PIO1_8,
  &LPC_IOCON->PIO1_9,
  &LPC_IOCON->PIO1_10,
  &LPC_IOCON->PIO1_11
};

//соответствие физических адресов порту 2
static uint32_t volatile * const lpc11xx_io_port2[] =
{
  &LPC_IOCON->PIO2_0,
  &LPC_IOCON->PIO2_1,
  &LPC_IOCON->PIO2_2,
  &LPC_IOCON->PIO2_3,
  &LPC_IOCON->PIO2_4,
  &LPC_IOCON->PIO2_5,
  &LPC_IOCON->PIO2_6,
  &LPC_IOCON->PIO2_7,
  &LPC_IOCON->PIO2_8,
  &LPC_IOCON->PIO2_9,
  &LPC_IOCON->PIO2_10,
  &LPC_IOCON->PIO2_11
};

//соответствие физических адресов порту 3
static uint32_t volatile * const lpc11xx_io_port3[] =
{
  &LPC_IOCON->PIO3_0,
  &LPC_IOCON->PIO3_1,
  &LPC_IOCON->PIO3_2,
  &LPC_IOCON->PIO3_3,
  &LPC_IOCON->PIO3_4,
  &LPC_IOCON->PIO3_5
};

//массив используемых портов.
//Осторожно! Порт 3 содержит только 6 регистров
static uint32_t volatile * const * const lpc11xx_io_matrix[] =
{
    lpc11xx_io_port0,
    lpc11xx_io_port1,
    lpc11xx_io_port2,
    lpc11xx_io_port3
};

/* Public Functions ----------------------------------------------------------- */
/** @addtogroup PINSEL_Public_Functions
* @{
*/

static uint32_t volatile *iocon_GetPinByName(uint8_t portnum, uint8_t pinnum)
{
  return lpc11xx_io_matrix[portnum][pinnum];
}
toweroff
Цитата(Tsyganoks @ Jul 31 2012, 08:38) *
а в версии для арм ножки сидят на разных портах и как написать продеруру не нагородив кучу if я что-то не понимаю

а вот о таких вещах нужно заботиться на этапе проектировки платы
с другой стороны, у ARM скорость работы уж всяко поболее, чем у 51-го, так что даже с кучей if он выставит в порт нужный сигнал может даже и раза эдак в 2-3 быстрее biggrin.gif
Tsyganoks
Цитата(toweroff @ Jul 31 2012, 08:28) *
а вот о таких вещах нужно заботиться на этапе проектировки платы
с другой стороны, у ARM скорость работы уж всяко поболее, чем у 51-го, так что даже с кучей if он выставит в порт нужный сигнал может даже и раза эдак в 2-3 быстрее biggrin.gif

Даа, вот не подумали...тк с контроллерами дружу недавно, то думал что там так же можно выставить пины, ну и сказали при разводке, что пусть разводят, как удобнее) Вроде додумал, как поменьше процедуру написать, спасибоsm.gif

Вот, может пригодится кому.
Код
void MUX_OFF (void)
{
    LPC_GPIO0->CLR = PIN[6];
    LPC_GPIO0->CLR = PIN[7];
    LPC_GPIO2->CLR = PIN[0];    
}

void MUX (unsigned long kanal)
{
    MUX_OFF();
    LPC_GPIO0->SET = PIN[6]&(kanal<<6);
    LPC_GPIO0->SET = PIN[7]&(kanal<<6);
    LPC_GPIO2->SET = PIN[0]&(kanal>>2);    
}
toweroff
Я так понимаю, что PIN[x] определено как
Код
#define PIN[x]    (1UL<<x)


тогда MUX_OFF() можно переписать как
Код
LPC_GPIO0->CLR = PIN[6] | PIN[7];
LPC_GPIO2->CLR = PIN[0];


И что-то не совсем я понял вот это:
Код
LPC_GPIO0->SET = PIN[6]&(kanal<<6);
LPC_GPIO0->SET = PIN[7]&(kanal<<6);

Tsyganoks
Цитата(toweroff @ Jul 31 2012, 09:12) *
Я так понимаю, что PIN[x] определено как
Код
#define PIN[x]    (1UL<<x)


тогда MUX_OFF() можно переписать как
Код
LPC_GPIO0->CLR = PIN[6] | PIN[7];
LPC_GPIO2->CLR = PIN[0];


И что-то не совсем я понял вот это:
Код
LPC_GPIO0->SET = PIN[6]&(kanal<<6);
LPC_GPIO0->SET = PIN[7]&(kanal<<6);


Да, можно)

GPIO0_6, GPIO0_7, GPIO2_0 соответствуют А0 А1 А2 на мультиплексоре. я смещаю полученное число на столько бит, на сколько смещен бит PIN[6]. что бы при сравнении, при наличии младшего бита, PIN[6] ставился в 1
toweroff
да, все верно
меня что-то смутило смещение и там, и там на 6 бит
Но, в любом случае, нужно маскировать 2-й бит в kanal и переписать вот так:
Код
LPC_GPIO0->SET = ((kanal&0x03)<<6);

одной строкой - два бита сразу
Tsyganoks
Цитата(toweroff @ Jul 31 2012, 10:13) *
да, все верно
меня что-то смутило смещение и там, и там на 6 бит
Но, в любом случае, нужно маскировать 2-й бит в kanal и переписать вот так:
Код
LPC_GPIO0->SET = ((kanal&0x03)<<6);

одной строкой - два бита сразу

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