你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

小白敲的DMA

[复制链接]
在路上11111111 发布时间:2017-3-2 09:50
本帖最后由 在路上11111111 于 2017-3-2 18:29 编辑

#include "stm32f10x.h"
#include "stdio.h"

uint8_t Tx_Buffer[520];
uint32_t Rx_length=0;
uint32_t Rx_xiaobiao=0;
uint32_t Rx_have_done = 0;
uint8_t RxBuffer[64];


typedef enum
{
    GPIO_PIN_One,
    GPIO_PIN_Two,
    GPIO_PIN_Three,
    GPIO_PIN_Four,
    GPIO_PIN_Five,
    GPIO_PIN_Six,
    GPIO_PIN_Seven
}GPIO;

uint16_t PIN[16]={GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_6,GPIO_Pin_7,GPIO_Pin_8,GPIO_Pin_9,GPIO_Pin_10,GPIO_Pin_11,GPIO_Pin_12,GPIO_Pin_13,GPIO_Pin_14,GPIO_Pin_15};

GPIO_TypeDef* GPIOX[7]={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG};

void Delay(unsigned int nCount)
{
     while(nCount--);
}

void STM32LED(GPIO gpio,unsigned char pin)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = PIN[pin];
   
    GPIO_Init(GPIOX[gpio],&GPIO_InitStructure);
    GPIOD->BSRR = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_7;
   
}

void STM32_USART_Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);
   
    GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
   
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
   
    USART_Init(USART2,&USART_InitStructure);
    USART_Cmd(USART2,ENABLE);
    printf("\n\r ############ WWW.ARMJISHU.COM! ############ \n");

}
   
#ifndef MicroLIB
  #pragma import(__use_no_semihosting)
struct __FILE
{
    int handle;
};
FILE  __stdout;
_sys_exit(int x)
{
    x= x;
}
int fputc(int ch,FILE *f)
{
     while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET)
     {}
     USART_SendData(USART2,(uint8_t) ch);
     return ch;
}

int ferror(FILE *f)
{
      return EOF;
}

#endif

FILE  __stdin;

int fgetc(FILE *fp)
{
    int ch = 0;
    while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET)
    {}
    ch = (int)USART2->DR & 0XFF;
  putchar(ch);
    return ch;
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file,uint32_t line
{
    printf("Wrong parameters Value:file %s on line %d\r\n",file,line);
    while(1)
    {
    }
}11
#endif

void UsartIrqHandlerUser(void)
{
    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
        RxBuffer[Rx_length] = USART2->DR;
        Rx_length++;
        if(USART2->DR == '\r' || Rx_length >= 64)
        {
            Rx_have_done = 1;
        }
    }
//     else if(USART_GetITStatus(USART2,USART_IT_TC) != RESET)
//     {
//         USART_ClearITPendingBit(USART2,USART_IT_TC);
//     }
        
        
}
void NVIC_GroupConfig(void)
{
    GPIOD->BRR= GPIO_Pin_4;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
}
void NVIC_COMConfiguration(void)
{
     
     NVIC_InitTypeDef NVIC_InitStructure;
   
     GPIOD->BRR= GPIO_Pin_3;
     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
     
     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   
     NVIC_Init(&NVIC_InitStructure);
}
uint32_t  UsartReadData(uint8_t* Buffer)
{
    uint32_t uartDataLength = 0,i;
    if(Rx_length != 0)
    {
        uartDataLength = Rx_length ;
        Rx_length = 0;
        Rx_have_done = 0;
        for(i=0;i<uartDataLength;i++)
        {
            Buffer = RxBuffer;
        }
        Buffer = '\0';
    }
    return uartDataLength ;

}
void USART2_IRQHandler(void)
{
    //__disable_irq();
    GPIOD->BRR= GPIO_Pin_2;
    UsartIrqHandlerUser();
    GPIOD->BRR= GPIO_Pin_2;
    //__enable_irq();
}
/*DMA的配置步骤:
   1:先打开相关的时钟;
   2:然后配置的是DMA结构体的东西,注意的是目标地址和原地址是否要进行地址的自动加的功能;
   3:使能DMA(DMA_Cmd());
   4:打开USART的使能;
    ******/
void STM32_DMA_Init()
{
    DMA_InitTypeDef DMA_InitStructure;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
  //打开DMA 的使能时钟
   
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR;
//DMA 的设数据寄存器的基地址;这个可以是目标地址,也可以是原地址;
这里的是使用USART2外设,
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Tx_Buffer;
//DMA 的保存了内存的基地址,这个可以作为传输的源或者目标
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
//保存了DMA数据传输方向,可以选择是外设到内存还是内存到外设。 这里选的是内存到外设
    DMA_InitStructure.DMA_BufferSize = 520;
//传输数据的大小,这里是520;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//外设地址是否要进行自增;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//内存地址是否要进行自增;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
//外设数据单元的大小;这里可以是Byte(uint_8),也可以是halfword(uint_16);也可以是word(uint_32);
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
//内存数据单元的大小;这里可以是Byte(uint_8),也可以是halfword(uint_16);也可以是word(uint_32);
    /*uint8_t 代表的是一个Byte,uint16_t  代表的是一个halfword,uint32_t 代表的是一个word*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
//DMA的工作模式;Normal是指只发送完一次数据(你定义发送的数据)
//  Circular 是指发送完一次数据以后,继续发送(一次数据是指发送完你所定义发送的所有数据
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
//DMA的优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   //DMA 的内存到内存模式
    DMA_Init(DMA1_Channel7,&DMA_InitStructure);
   
   
}
   
int main(void)
{
    unsigned int i;//unsigned int 在printf打印的时候可以以%d或者%u的形式进行打印
   
    uint8_t ucStr[65];
    for(i=0;i<520;i++)
    {
        Tx_Buffer = 'w';
    }
   
    STM32LED(GPIO_PIN_Four,2);
    STM32LED(GPIO_PIN_Four,3);
    STM32LED(GPIO_PIN_Four,4);
    STM32LED(GPIO_PIN_Four,7);
    //配置串口的时候,应该先配置串口方面,再去配置串口的优先级问题;
    STM32_USART_Init();
    NVIC_GroupConfig();
  NVIC_COMConfiguration();
   
    //printf("\r\n%s\r\n",Tx_Buffer);
   
    STM32_DMA_Init();
   
    DMA_Cmd(DMA1_Channel7,ENABLE);
    //使能DMA
    USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
    //将USART2与DMA1的相捆绑,并且使用的是USART2的Tx功能(USART_DMAReq_Tx);
   
    while(1)
     {
        if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET)
        {
            DMA_ClearFlag(DMA1_FLAG_TC7);
        }
    }
   
}

   

评分

参与人数 1 ST金币 +3 收起 理由
MrJiu + 3 很给力!

查看全部评分

收藏 1 评论4 发布时间:2017-3-2 09:50

举报

4个回答
MrJiu 回答时间:2017-3-2 10:33:16
加一个注释和说明或许更好呢!!!
zoomdy 回答时间:2017-3-2 12:40:34
全是乱码,想干嘛呢?
在路上11111111 回答时间:2017-3-2 18:30:38
MrJiu 发表于 2017-3-2 10:33
加一个注释和说明或许更好呢!!!

十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。
在路上11111111 回答时间:2017-3-2 18:30:58
zoomdy 发表于 2017-3-2 12:40
全是乱码,想干嘛呢?

十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版