The program can't run into the interrupt function, as I send some hex number to stm32? I try to use the function DMA_GetCurrDataCounter(), but the value change strangely.

int main(void)
{
        /* 程序来到main函数之前,启动文件:statup_stm32f4xx.s已经调用
        * SystemInit()函数把系统时钟初始化成168MHZ
        * SystemInit()在system_stm32f4xx.c中定义
        * 如果用户想修改系统时钟,可自行编写程序修改
        */
          /* add your code here ^_^. */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    bsp_USART_init();
    bsp_USART_dma_init();
//    char i='1';
      while(1)
      {

          bsp_Usart_SendByte(USART1, DMA_GetCurrDataCounter(DMA2_Stream5));
          delay_ms(1000);
          if(flag == 1)
          {
              bsp_Usart_SendByte(USART1, usart_buffer[0]);
              bsp_Usart_SendByte(USART1, usart_buffer[1]);
              bsp_Usart_SendByte(USART1, usart_buffer[2]);
              bsp_Usart_SendByte(USART1, usart_buffer[3]);
          }
      }

}
void bsp_USART_init()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    GPIO_InitTypeDef    gpio_initstructure;
        gpio_initstructure.GPIO_Pin = GPIO_Pin_9;
        gpio_initstructure.GPIO_Mode = GPIO_Mode_AF;
        gpio_initstructure.GPIO_Speed = GPIO_Speed_50MHz;
        gpio_initstructure.GPIO_OType = GPIO_OType_PP;
        gpio_initstructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &gpio_initstructure);
    
        gpio_initstructure.GPIO_Pin = GPIO_Pin_10;
        gpio_initstructure.GPIO_Mode = GPIO_Mode_AF;
        gpio_initstructure.GPIO_Speed = GPIO_Speed_50MHz;
        gpio_initstructure.GPIO_OType = GPIO_OType_PP;
        gpio_initstructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &gpio_initstructure);
    
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    
    USART_InitTypeDef   USART_InitTypeDef;
        USART_InitTypeDef.USART_BaudRate = 115200;
        USART_InitTypeDef.USART_WordLength = USART_WordLength_8b;
        USART_InitTypeDef.USART_StopBits = USART_StopBits_1;
        USART_InitTypeDef.USART_Parity = USART_Parity_No;
        USART_InitTypeDef.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
        USART_InitTypeDef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART1, &USART_InitTypeDef);
    USART_Cmd(USART1,ENABLE);
    
//    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//    NVIC_InitTypeDef    nvic_initstructure;
//        nvic_initstructure.NVIC_IRQChannel = USART1_IRQn;
//        nvic_initstructure.NVIC_IRQChannelPreemptionPriority = 2;
//        nvic_initstructure.NVIC_IRQChannelSubPriority = 2;
//        nvic_initstructure.NVIC_IRQChannelCmd = ENABLE;
    
//    NVIC_Init(&nvic_initstructure);
}
void bsp_USART_dma_init()
{
    DMA_DeInit(DMA2_Stream5);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
    while (DMA_GetCmdStatus(DMA2_Stream5) != DISABLE);
    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
    DMA_InitTypeDef     dma_initstructure;
        dma_initstructure.DMA_Channel = DMA_Channel_4;
        dma_initstructure.DMA_PeripheralBaseAddr = USART1_BASE;
        dma_initstructure.DMA_Memory0BaseAddr = (uint32_t)usart_buffer;
        dma_initstructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        dma_initstructure.DMA_BufferSize = 4;
        dma_initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        dma_initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        dma_initstructure.DMA_PeripheralDataSize = 8;
        dma_initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        dma_initstructure.DMA_Mode = DMA_Mode_Normal;
        dma_initstructure.DMA_Priority = DMA_Priority_VeryHigh;
        dma_initstructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_Init(DMA2_Stream5, &dma_initstructure);
    DMA_Cmd(DMA2_Stream5, ENABLE);
    
    DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, ENABLE);
    
    while(DMA_GetCmdStatus(DMA2_Stream5) != ENABLE);
}
extern uint8_t flag;
void DMA2_IRQHandler()
{
//    bsp_Usart_SendByte(USART1, 0xA1);
    DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5);
    flag = 1;
}

The program can't run into the interrupt function, as I send some hex number to stm32? I try to use the function DMA_GetCurrDataCounter(), but the value change strangely.

0

There are 0 best solutions below