Kolobokov 0 21 сентября, 2021 Опубликовано 21 сентября, 2021 · Жалоба Работающая конфигурация UART - PM->APBCMASK.reg |= PM_APBCMASK_SERCOM0; /* Enable peripheral Multiplexer */ PORT->Group[0].PINCFG[6].reg = 0 | 1 * PORT_PINCFG_PMUXEN; // TXD PORT->Group[0].PINCFG[5].reg = 0 // RXD | 1 * PORT_PINCFG_INEN | 1 * PORT_PINCFG_PULLEN | 1 * PORT_PINCFG_PMUXEN; /* Peripheral Function D selected */ PORT->Group[0].PMUX[6/2].bit.PMUXE = PORT_PMUX_PMUXE_D_Val; // TXD PORT->Group[0].PMUX[5/2].bit.PMUXO = PORT_PMUX_PMUXO_D_Val; // RXD /* Baudrate Register */ uint64_t BaudReg_S0 = (uint64_t)(65536 * (f_cpu - (16 * baud)) / f_cpu); /* */ GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0) | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE) | GCLK_CLKCTRL_CLKEN; /* */ SERCOM0->USART.CTRLA.reg = 0 | 1 * SERCOM_USART_CTRLA_DORD // Data Order LSB | SERCOM_USART_CTRLA_TXPO(0x1) // Transmit Data PA6 SERCOM0_PAD[2] | SERCOM_USART_CTRLA_RXPO(0x1) // Receive Data PA5 SERCOM0_PAD[1] | SERCOM_USART_CTRLA_SAMPR(0x0) // Sample Rate 16x | 1 * SERCOM_USART_CTRLA_RUNSTDBY // Run In Standby | 1 * SERCOM_USART_CTRLA_MODE_USART_INT_CLK; // Operating Mode, Internal Clock //while(SERCOM0->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE); // synchronization busy SERCOM0->USART.CTRLB.reg = 0 |SERCOM_USART_CTRLB_CHSIZE(0x0) // Character Size, 8 bits | 1 * SERCOM_USART_CTRLB_TXEN // TX Enable | 1 * SERCOM_USART_CTRLB_RXEN; // RX Enable while(SERCOM0->USART.SYNCBUSY.bit.CTRLB); // synchronization SERCOM0->USART.BAUD.reg = (uint16_t)BaudReg_S0; // Baudrate value SERCOM0->USART.CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE; // SERCOM0 peripheral enabled while(SERCOM0->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE); // synchronization busy Добавляю такой же конфиг для другого UART - зависает на последней строке while(SERCOM2->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE); // synchronization busy Где я ошибаюсь ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 22 сентября, 2021 Опубликовано 22 сентября, 2021 (изменено) · Жалоба 20 hours ago, Kolobokov said: зависает на последней строке while(SERCOM2->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE); // synchronization busy Где я ошибаюсь ? зависание на этой строке может происходить в случае если для соответствующего SERCOM не включено тактирование. Проверено личным, очень скромным, опытом. вероятно для второго уарта вот в этой строке GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0) | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE) | GCLK_CLKCTRL_CLKEN; у Вас не исправлено SERCOM0_GCLK_ID_CORE на SERCOM2_GCLK_ID_CORE, или что то в этом духе. По возможности, прошу отписаться, в этом ли была причина. Изменено 22 сентября, 2021 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kolobokov 0 25 сентября, 2021 Опубликовано 25 сентября, 2021 · Жалоба 22.09.2021 в 12:08, nanorobot сказал: вероятно для второго уарта вот в этой строке GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0) | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE) | GCLK_CLKCTRL_CLKEN; у Вас не исправлено SERCOM0_GCLK_ID_CORE на SERCOM2_GCLK_ID_CORE, или что то в этом духе. По возможности, прошу отписаться, в этом ли была причина. Нет, там был именно SERCOM2_GCLK_ID_CORE Причина была вот эта - GCLK->CLKCTRL.reg I= ... надо было - GCLK->CLKCTRL.reg = etc... теперь работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться