Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DMA , зависает
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
go2winner
Камень stm32f407, работает на максимальной частоте, среда проектирования IAR.
Настроил DMA на передачу из памяти в переферию (USART). Передает буфер 1 раз и зависает после включения, выставляя флаг ошибки передачи в регистре прерываний.....в обработчик прерывания не попадает

CODE
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_usart.h"
#include "stm32f4xx_dma.h"

char buf[] = "Iam DMA";

#include "misc.h"
void led_init(void);
void delay(void)
{
volatile uint32_t i;
for (i=1; i != 0x10000; i++);
}

int main()
{

SystemInit(); // Установка тактирования
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // Тактирование порта А
led_init();
// Настройка RX TX UART
GPIO_InitTypeDef gpio;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2;
gpio.GPIO_Speed = GPIO_High_Speed;
GPIO_Init(GPIOA, &gpio);
GPIO_PinAFConfig( GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig( GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
USART_InitTypeDef usard;
usard.USART_BaudRate = 256000;
usard.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usard.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
usard.USART_Parity = USART_Parity_No;
usard.USART_StopBits = USART_StopBits_1;
usard.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2, &usard);
USART_Cmd(USART2, ENABLE);


//----------------------------------------------------—
//
// DMA setting for USART 2
// Но не включен сам DMA!?!? DMAcmd
//----------------------------------------------------—

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
DMA_InitTypeDef dma;
dma.DMA_Channel = DMA_Channel_4;
dma.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR);
dma.DMA_Memory0BaseAddr = (uint32_t)buf;
dma.DMA_DIR = DMA_DIR_MemoryToPeripheral;
dma.DMA_BufferSize = 1;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_Mode = DMA_Mode_Normal;
dma.DMA_Priority = DMA_Priority_Medium;
dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream6, &dma);
// USART 2 enable DMA
USART_DMACmd(USART2,USART_DMAReq_Tx, ENABLE);
// Intterup
NVIC_EnableIRQ(DMA1_Stream6_IRQn);
DMA_ITConfig(DMA1_Stream6, DMA_IT_TC, ENABLE);


while(1){

delay();
delay();
delay();
delay();
GPIOD->BSRRH |=0x2000;
delay();
delay();
delay();
delay();

//USART_SendData(USART2,'H');while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET){}
//USART_SendData(USART2, 'H');
DMA_Cmd(DMA1_Stream6, ENABLE);


}
return 0;
}

void DMA1_Stream6_IRQHandler( void ) {
if(DMA_GetITStatus(DMA1_Stream6, DMA_IT_TCIF6) == SET){
DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6);
GPIOD->BSRRL |=0x2000;
}
}

void led_init(void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitTypeDef gpio;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &gpio);
}



прилагаю скрины отладки пошаговой до входа в функцию разрешения потока и после выхода.
Если нажать break после остановки отладки, то меня уводит в старап файл в строку
Код
PUBWEAK DMA1_Stream6_IRQHandler
SECTION .text:CODE:REORDER:NOROOT(1)
DMA1_Stream6_IRQHandler
B DMA1_Stream6_IRQHandler


и там остаюсь вечно...есть идеи?
Программа зависает на выходе из DMA_Cmd, передав буфер 1 раз. и выставив флаг ошибки передачи(см картинки)




ЗЫ. код нмного не красив, пока искал причину переписывал несколько раз..
Aaron
У вас ответ в самом вопросе - используется заглушка DMA1_Stream6_IRQHandler вместо написанной вами функции. Почему - я не знаю, с IAR дел не имею.
go2winner
Цитата(Aaron @ Apr 6 2016, 14:36) *
У вас ответ в самом вопросе - используется заглушка DMA1_Stream6_IRQHandler вместо написанной вами функции. Почему - я не знаю, с IAR дел не имею.


Согласен с Вами. На Coocox тот же код заработал. Т.е. дело не в коде, а конфигурации проекта/файлов
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.