texnar (18.02.2016 17:04 - 19.02.2016 15:46, просмотров: 5116)
ATMEL ARM32 DAMD21 настройка UART Помогите пожалуйста разобраться с Atmel ARM32 SAMD21.
Приобрел плату, Ардуину, просто как готовую плату. Какой-то не дружелюбный АРМ, особенно после Миландра.
Не могу настроить Уарт через регистры,
попытка первая: прерывание возникает, на ножке тишина.
поппытка вторая: распотрошил ардуиновскую либу: один байт уходит и ... тишина. в прерывание не попадает. зависает.
код инициализации, прерывание и основной цикл:
это только верхушка айсберга. вся инициализация контроллера выполняется ардуиной
void SERCOM1_Hadler()
{
PORT->Group[0].OUTTGL.reg=1<<Q; //tglpin
if (SERCOM1->USART.INTFLAG.bit.RXC) {
uint8_t data = (uint8_t)SERCOM1->USART.DATA.bit.DATA;
}
if (SERCOM1->USART.INTFLAG.bit.TXC) {
SERCOM1->USART.INTFLAG.bit.TXC = 1;
}
}
void uart_config()
{
GCLK->CLKCTRL.bit.ID = GCM_SERCOM1_CORE;
GCLK->CLKCTRL.bit.GEN = GCLK_CLKCTRL_GEN_GCLK0;
GCLK->CLKCTRL.bit.CLKEN = 1;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY );
PM->APBCMASK.reg |= PM_APBCMASK_SERCOM1;
SERCOM1->USART.CTRLA.bit.MODE = 1;//internal clock
SERCOM1->USART.CTRLA.bit.SAMPR = 0;//16 samples
SERCOM1->USART.CTRLA.bit.TXPO = 1;//PA18 txpad2
SERCOM1->USART.CTRLA.bit.RXPO = 0;//PA16 rxpad0
SERCOM1->USART.CTRLA.bit.FORM = 0;//usart frame
SERCOM1->USART.CTRLA.bit.DORD = 1;//lsb_first
SERCOM1->USART.CTRLB.bit.TXEN = 1;
SERCOM1->USART.CTRLB.bit.RXEN = 1;
SERCOM1->USART.INTENSET.bit.RXC = 1;
SERCOM1->USART.INTENSET.bit.TXC = 1;
SERCOM1->USART.BAUD.reg = 65535.0f * ( 1.0f - 16.0f * (float)(baudrate) / (float)(SystemCoreClock));
SERCOM1->USART.CTRLA.bit.ENABLE = 1;
while(SERCOM1->USART.SYNCBUSY.bit.ENABLE);
NVIC_EnableIRQ(SERCOM1_IRQn);
NVIC_SetPriority (SERCOM1_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority */
}
в основном цикле с интервалом 100мс выполняется одна команда
SERCOM1->USART.DATA.bit.DATA='U';
В результате зацикливаюсь в обработчике прерывания по умолчанию Dummy_Handler().
Но как и почему?
Обработчик ведь существуют.