|
|
  |
управление ножками, keil+mcb1200(lpc1227) |
|
|
|
Jul 30 2012, 10:15
|
Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105

|
Есть контроллер nxp lpc1227. Нужно управлять группой пинов, расположенной на разных портах. Можно определить их так, что на ноге выставлялась 1 после присвоения единицы переменной, а не LPC_GPIO0->SET= PIN[n]. Ну или есть ли какие-нибудь другие способы отойти от этой записи?
|
|
|
|
|
Jul 31 2012, 04:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105

|
Цитата(toweroff @ Jul 30 2012, 21:58)  Читайте даташит. Если можно как-то иначе, чем записью в определенный порт в определенный разряд единицы - напишите в NXP, Вам вышлют лоток контроллеров и пропишут Ваши изыскания в еррату Переопределениями - один паровоз, потянет он за собой несколько команд. Но не миллионы же раз это делать, правда? Что касаемо самой записи - чем она Вам не нравится? Имея даташит в руках, все лаконично и понятно не нравится тем, что была процедура для 51 контроллера, управляющая мультиплексором, выглядела так Код void MUX(char kanal) { A0=0x01&kanal; A1=0x02&kanal; A2=0x04&kanal; } а в версии для арм ножки сидят на разных портах и как написать продеруру не нагородив кучу if я что-то не понимаю
|
|
|
|
|
Jul 31 2012, 05:27
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Нужно использовать силу 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]; }
|
|
|
|
|
Jul 31 2012, 05:54
|
Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105

|
Цитата(toweroff @ Jul 31 2012, 08:28)  а вот о таких вещах нужно заботиться на этапе проектировки платы с другой стороны, у ARM скорость работы уж всяко поболее, чем у 51-го, так что даже с кучей if он выставит в порт нужный сигнал может даже и раза эдак в 2-3 быстрее  Даа, вот не подумали...тк с контроллерами дружу недавно, то думал что там так же можно выставить пины, ну и сказали при разводке, что пусть разводят, как удобнее) Вроде додумал, как поменьше процедуру написать, спасибо  Вот, может пригодится кому. Код 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); }
|
|
|
|
|
Jul 31 2012, 06:12
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Я так понимаю, что 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);
|
|
|
|
|
Jul 31 2012, 06:54
|
Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105

|
Цитата(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
|
|
|
|
|
Jul 31 2012, 07:13
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
да, все верно меня что-то смутило смещение и там, и там на 6 бит Но, в любом случае, нужно маскировать 2-й бит в kanal и переписать вот так: Код LPC_GPIO0->SET = ((kanal&0x03)<<6); одной строкой - два бита сразу
|
|
|
|
|
Jul 31 2012, 09:16
|
Группа: Новичок
Сообщений: 7
Регистрация: 7-07-11
Пользователь №: 66 105

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