单片机
返回首页

stm系列--USART-DMA应用

2025-09-08 来源:cnblogs

void uart_dma_init(u32 bound){

    //GPIO端口设置

   GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

     DMA_InitTypeDef        DMA_InitStructure;

    

     USART_DeInit(USART1);  //复位串口1

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟

    //USART1_TX   PA.9

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

 

    //USART1_RX      PA.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//浮空输入 GPIO_Mode_IN_FLOATING

    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);    //使能USART1,GPIOA时钟

//USART 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

  USART_Init(USART1, &USART_InitStructure); //初始化串口

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

   

     //Usart1 NVIC 配置


  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

    

      /*DMA发送中断设置*/

    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

   

         /*DMA1通道4配置发送*/

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    DMA_DeInit(DMA1_Channel4);

    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART_TX_BUF;

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

    DMA_InitStructure.DMA_BufferSize = 200;

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

    DMA_InitStructure.DMA_Priority = DMA_Priority_High;

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    DMA_Init(DMA1_Channel4,&DMA_InitStructure);

    DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);

    //DMA_Cmd(DMA1_Channel4, ENABLE);//使能通道4,一般发送的时候再使能

  //采用DMA方式发送

    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

  USART_Cmd(USART1, ENABLE);                    //使能串口 


}


void USART1_IRQHandler(void)                    //串口1中断服务程序

    {

     u8 sbuf;

    if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != sbufET)来判断  

    {  

            sbuf=USART_ReceiveData(USART1);  

    } 

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0xbb 结尾)

    {

        sbuf =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据

        

        if( myusart.reflag==0)

        {

            myusart.timout=10;

            if(myusart.recount<_maxbuf) 

            {

                myusart.rcbuf[myusart.recount++]=sbuf;

            }

        }            

        USART_ClearITPendingBit(USART1,USART_IT_RXNE);                    

    } 

}


void uart_dma_send_enable(uint16_t size)

{

    DMA1_Channel4->CNDTR = (uint16_t)size; 

    DMA_Cmd(DMA1_Channel4, ENABLE);       

}    


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章