OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2475|回复: 1

USART的DMA接收

[复制链接]

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2016-4-5
在线时间
17 小时
发表于 2016-4-12 10:47:21 | 显示全部楼层 |阅读模式
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_dma.h"
#include "delay.h"


u8 USARTData1[10];
u16 DATA_LEN;

void HMISends(char *buf1)                  //×Ö·û′®·¢Ëíoˉêy
{
        u8 i=0;
        while(1)
        {
         if(buf1[i]!=0)
                 {
                        USART_SendData(USART3,buf1[i]);  //·¢Ëíò»¸ö×Ö½ú
                        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//μè′y·¢Ëí½áêø
                         i++;
                }
         else
         return ;

                }
        }
void HMISendb(u8 k)                         //×Ö½ú·¢Ëíoˉêy
{                 
        u8 i;
         for(i=0;i<3;i++)
         {
         if(k!=0)
                 {
                        USART_SendData(USART3,k);  //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
                        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//μè′y·¢&#203;í&#189;áê&#248;
                }
         else
         return ;

         }
}

void HMISendm(u8 k)
{
        if(k!=0)
                 {
                        USART_SendData(USART3,k);  //·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
                        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET){};//μè′y·¢&#203;í&#189;áê&#248;
                }
}

void HMISendstart(void)  //·¢&#203;í&#214;&#184;á&#238;3&#245;ê&#188;
        {
                 delay_ms(200);
                HMISendb(0xff);
                delay_ms(200);
        }


void LED_int()
{
        GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void uart3_init(){
    //GPIO&#182;&#203;&#191;úéè&#214;&#195;
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);        //ê1&#196;üUSART1£&#172;GPIOAê±&#214;ó
        USART_DeInit(USART3);  //&#184;′&#206;&#187;′&#174;&#191;ú1
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //3&#245;ê&#188;&#187;ˉPA9

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//&#184;&#161;&#191;&#213;ê&#228;è&#235;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //3&#245;ê&#188;&#187;ˉPA10

   //Usart1 NVIC &#197;&#228;&#214;&#195;

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //×óó&#197;&#207;è&#188;&#182;3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);        //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉVIC&#188;&#196;′&#230;&#198;÷

   //USART 3&#245;ê&#188;&#187;ˉéè&#214;&#195;

        USART_InitStructure.USART_BaudRate = 9600;//ò&#187;°&#227;éè&#214;&#195;&#206;a9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×&#214;3¤&#206;a8&#206;&#187;êy&#190;Y&#184;&#241;ê&#189;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò&#187;&#184;&#246;í£&#214;1&#206;&#187;
        USART_InitStructure.USART_Parity = USART_Parity_No;//&#206;T&#198;&#230;&#197;&#188;D£&#209;é&#206;&#187;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#206;Tó2&#188;têy&#190;Yá÷&#191;&#216;&#214;&#198;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //ê&#213;·¢&#196;£ê&#189;
       

    USART_Init(USART3, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú
    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//&#191;a&#198;&#244;&#191;&#213;&#207;D&#214;D&#182;&#207;
    USART_Cmd(USART3, ENABLE);                    //ê1&#196;ü′&#174;&#191;ú
}



void DMA_Configuration()
{
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        DMA_DeInit(DMA1_Channel3);

        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART3->DR;
        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)USARTData1;

        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize=10;

        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

       
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
        NVIC_Init(&NVIC_InitStructure);

        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

        DMA_Init(DMA1_Channel3,&DMA_InitStructure);
}

void USART3_IRQHandler(void)
{
        u8 j;
        if(USART_GetITStatus(USART3,USART_IT_IDLE)!=RESET)
        {
                USART_ClearITPendingBit(USART2, USART_IT_IDLE);
                DMA_Cmd(DMA1_Channel3,DISABLE);
                DATA_LEN=10-DMA_GetCurrDataCounter(DMA1_Channel3);
     if(DATA_LEN > 0)
                         {
                                 for(j=0;j<DATA_LEN;j++)
                                 {
                                         HMISendm(USARTData1[j]);
         }
         DMA_Cmd(DMA1_Channel3, DISABLE);
         DMA1_Channel3->CNDTR=DATA_LEN;//&#214;&#174;&#199;°&#197;&#228;&#214;&#195;buffer&#206;a10 ′&#203;′|&#184;&#196;&#206;a&#189;óê&#213;êy&#190;Yμ&#196;′óD&#161; &#207;&#194;&#195;&#230;&#212;ú&#184;&#196;&#187;&#216;10
         DMA_Cmd(DMA1_Channel3, ENABLE);
       }
          DMA_Cmd(DMA1_Channel3, DISABLE);
    DMA1_Channel3->CNDTR=10;
    DMA_Cmd(DMA1_Channel3, ENABLE);
    DMA_Cmd(DMA1_Channel3,ENABLE);               
  }
}


int main()
{
        delay_init();
  uart3_init();
  DMA_Configuration();       
        LED_int();
        GPIO_ResetBits(GPIOC,GPIO_Pin_13);
        delay_ms(20000);
        GPIO_SetBits(GPIOC,GPIO_Pin_13);
        delay_ms(20000);
        GPIO_ResetBits(GPIOC,GPIO_Pin_13);
        delay_ms(20000);
        GPIO_SetBits(GPIOC,GPIO_Pin_13);
        USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
        DMA_Cmd(DMA1_Channel3,ENABLE);
        while(1)
        {
  }
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2016-4-5
在线时间
17 小时
 楼主| 发表于 2016-4-12 10:49:37 | 显示全部楼层
自己琢磨的一个USART的DMA接收   望各位大神指教  格式不会搞见谅!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表