СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №4/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 41 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 4 2015 unsigned char BuffTxd[64]; Тогда адрес буфера в памяти можно задать так: DMA1_Channel4->CMAR = (uint32_t)&BuffTxd[0]; // Адрес буфера в памяти Далее укажем количество байт, кото- рое следует передать: DMA1_Channel4->CNDTR = 64; // Количество данных для передачи На этом настройка адресов источни- ка и приёмника канала DMA заканчи- вается и далее необходимо настроить режимы работы канала. Листинг 1 unsigned char BuffTxd[32]; // Инициализация буфера передатчика // Функция инициализации DMA1 для передачи в порт USART1 void USART1_TX_DMA1_Init (void) { // Включить тактирование DMA1 if ((RCC->AHBENR & RCC_AHBENR_DMA1EN) != RCC_AHBENR_DMA1EN) RCC->AHBENR |= RCC_AHBENR_DMA1EN; // Задать адрес источника и приемника и количество данных для обмена DMA1_Channel4->CPAR = (uint32_t)&USART1->DR; // Задать адрес реги- стра периферии DMA1_Channel4->CMAR = (uint32_t)&BuffTxd[0]; // Задать адрес буфера в памяти DMA1_Channel4->CNDTR = 32; // Задать количество данных для обмена // Настройка конфигурации DMA1_Channel4->CCR = 0; // Обнуление регистра конфигурации DMA1_Channel4->CCR &= ~DMA_CCR4_CIRC; // Отключить циклический режим DMA1_Channel4->CCR |= DMA_CCR4_DIR; // Задать направление чтения из памяти // Настроить работу с периферийным устройством DMA1_Channel4->CCR &= ~DMA_CCR4_PSIZE; // Задать размерность данных 8 бит DMA1_Channel4->CCR &= ~DMA_CCR4_PINC; // Запретить инкремент указателя // Настроить работу с памятью DMA1_Channel4->CCR &= ~DMA_CCR4_MSIZE; // Задать размерность данных 8 бит DMA1_Channel4->CCR |= DMA_CCR4_MINC; // Включить инкремент указателя USART1->CR3 |= USART_CR3_DMAT; // Разрешить передачу USART1 через DMA } // Функция проверки флага окончания обмена в канале // Результат: 0 - обмен не завершен, 1 - обмен завершен unsigned char GetStateDMAChannel4(void) { if(DMA1->ISR & DMA_ISR_TCIF4) return 1; // Если флаг TCIF установлен – обмен завершен return 0; // Иначе – обмен продолжается } // Функция запуска обмена в канале // Аргумент LengthBufer – количество данных для обмена void StartDMAChannel4(unsigned int LengthBufer) { DMA1_Channel4->CCR &= ~DMA_CCR4_EN; // Запретить работу канала DMA1_Channel4->CNDTR = LengthBufer; // Загрузить количество данных для обмена DMA1->IFCR |= DMA_IFCR_CTCIF4; // Обнулить флаг окончания обмена DMA1_Channel4->CCR |= DMA_CCR4_EN; // Разрешить работу канала } ЭКСКЛЮЗИВНЫЙ ДИСТРИБЬЮТОР ПРОДУКЦИИ CRANE ELECTRONICS Interpoint TM Products Реклама © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy