Тема: PIC32MK...
Показать сообщение отдельно
Старый 17.06.2018, 22:58   #20
Iptash
Senior Member
 
Регистрация: 29.03.2008
Возраст: 53
Сообщений: 400
Вес репутации: 330/46
Iptash is a jewel in the roughIptash is a jewel in the roughIptash is a jewel in the roughIptash is a jewel in the rough
По умолчанию Re: PIC32MK...

Пытаюсь освоить DMA. Пока не получается) Написал код для передачи по UART1.
Цитата:
void DMAinit(void)
{
IEC2bits.DMA0IE = 0; // отключаем прерывания DMA0
IFS2bits.DMA0IF = 0; // сбрасываем флаг прерывания

DMACONSET = 0x8000; // влючаем DMA
DCH0CON = 0x63;



DCH0ECONbits.CHSIRQ = 40; // Старт вектор прерывания UART1TX
DCH0ECONbits.SIRQEN = 1; // включить начало передачи
DCH0ECONbits.PATEN = 1;
DCH0DATbits.CHPDAT = 0;

DCH0SSAbits.CHSSA = KVA_TO_PA(&buff[0]); // адрес источника
DCH0DSAbits.CHDSA = KVA_TO_PA(&U1TXREG); // адрес приемника
DCH0SSIZbits.CHSSIZ = sizeof(buff); // размер источника
DCH0DSIZbits.CHDSIZ = 1; // размер приемника
DCH0CSIZbits.CHCSIZ = 1; // передача по 1 байту

DCH0INTCLR = 0xFF00FF; // очистка регистра прерываний
DCH0INTbits.CHSDIE = 1; // прерывание по завершению приемника ??



IPC18bits.DMA0IP = 4; // приоритет прерывания 4
IPC18bits.DMA0IS = 3; // суббприоритет 3
IEC2bits.DMA0IE = 1; // включаем прерывания DMA0

DCH0CONbits.CHAEN = 1; // включить канал
}
инициализация DMA.

Инициализация UART1 в обычном режиме передача нормально идет.
Цитата:
void UART1Init(void)
{
U1RXRbits.U1RXR = 0b0101; // Конфигурируем пин RPC6 как U1RX
RPC7Rbits.RPC7R = 0b0001; // Конфигурируем пин RPC7 как U1TX



U1BRG = 390; // Устанавливаем 9600 бод
U1STA = 0; // Очищаем регистр статуса

U1MODEbits.ON = 1; // Включить UART

U1STAbits.URXEN = 1; // Включить приемник
U1STAbits.UTXEN = 1; // Включить передатчик
IPC10bits.U1TXIP = 3;

IEC1CLR = 0x1C0;
IFS1bits.U1TXIF = 0;
IEC1bits.U1TXIE = 0;
}
Все ли я сделал? И еще. Какинициировать передачу DMA?. Пробовал флаг прерывания UART1 IFS1bits.U1TXIF = 1; устанавливать и вот так DCH0ECONbits.CFORCE = 1;
Iptash вне форума   Ответить с цитированием