DMA实验总结

一、RCC设置

没什么好写的之前USART的基本一样

     /****************************************************************************
    * Function Name : RCC_Configuration
    * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2
    * and PCLK1 prescalers.
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    void RCC_Configuration(void)
    {
        /* Deinitialize the RCC registers */
        RCC_DeInit();
        
        /* Enable the HSE */
        RCC_HSEConfig(RCC_HSE_ON);
        
        /* Wait till HSE is ready and if Time out is reached exit */
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
            /* Add here PLL ans system clock config */
            
            /* Enable The Prefetch Buffer */
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            
            /* Configure Tthe Latency cycle: Set 0 Latency cycles */
            FLASH_SetLatency(FLASH_Latency_2);
            
            /* Configure HCLK such as HCLK = SYSCLK */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);
            
            /* PCLK2 = HCLK */
            RCC_PCLK2Config(RCC_HCLK_Div1);
            
            /* PCLK1 = HCLK/2 */
            RCC_PCLK1Config(RCC_HCLK_Div2);
            
            /* ADCCLK = PCLK2/4 */
            RCC_ADCCLKConfig(RCC_PCLK2_Div4);
            
            /* PLLCLK = 8MHz * 9 = 72MHz */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
            
            /* Enable PLL */
            RCC_PLLCmd(ENABLE);
            
            /* Wait till PLL is ready */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
            
            /* Select PLL as system clock source */
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till HSE is used as system clock source */
            while(RCC_GetSYSCLKSource() != 0x08)
            {
                
            }
        }
    }

 


二、GPIO设置

 

设置AP9,AP10为串口。

     /****************************************************************************
    * Function Name : GPIO_Configuration
    * Description :
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    void GPIO_Configuration(void)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
    }

 

三、USART设置

 
     /*******************************************************************************
    * Function Name : USART_Configure
    * Description : Configures the USART
    * Input : None
    * Output : None
    * Return : None
    *******************************************************************************/
    void USART_Configuration(void)
    {
        USART_InitStructure.USART_BaudRate = 115200;                            //设置波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;             //设置为8位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                  //停止为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;         //设置RX和TX模式
        USART_Init(USART1, &USART_InitStructure);                               //初始化结构体
        USART_Cmd(USART1, ENABLE);                                              //开启串口
    }

 

四、DMA设置

 
     /*******************************************************************************
    * Function Name : DMA_Configure
    * Description : Configures the DMA
    * Input : None
    * Output : None
    * Return : None
    *******************************************************************************/
    void DMA_Configuration(void)
    {
        DMA_InitTypeDef DMA_InitStructure;                                         //定义DMA结构体
         
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                         //开启DMA的RCC
        
        DMA_InitStructure.DMA_PeripheralBaseAddr = APB2PERIPH_BASE + 0X3804;       //设置DMA外设基地址:串口1的地址+串口1的数据寄存器偏移量
        
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;                      //要发送的内容地址
        
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                         //设置外设作为数据传输的目的地
        
        DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;                          //指定DMA缓存大小
        
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;           //设置外设地址寄存器不递增
        
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                    //内存地址寄存器递增
        
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    //数据宽度为8位
        
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;            //数据宽度为8位
        
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                              //工作在正常缓存模式
        
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                      //设置DMA为中优先级
        
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                               //不设置为内存到内存传输
        
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);                               //初始化DMA结构体
        
        DMA_Cmd(DMA1_Channel4, ENABLE);                                            //开启DMA
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);                            //使能DMA1_Channel4作为中断通道,传输完成后中断屏蔽,使能
    }

 

五、设置中断

     /****************************************************************************
    * Function Name : NVIC_Configuration
    * Description : Configures Vector Table base location.
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    void NVIC_Configuration(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure;

    #ifdef VET_TAB_RAM
        /* Set the Vector Table base location at 0x2000 0000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    #else
        /* Set the Vector Table base location at 0x8000 0000 */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    #endif
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                           //设置为组1
        
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;                  //设置DMA1_Channel4为中断源
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;                 //优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                           //使能
        NVIC_Init(&NVIC_InitStructure);                                           //初始化
    }

在stm32f10x_it.c中加入:

 
     void DMA1_Channel4_IRQHandler(void)
    {
        if(DMA_GetFlagStatus(DMA1_FLAG_TC4) == SET)          //如果中断源是设置了
        {
            DMA_ClearFlag(DMA1_FLAG_TC4);                    //清除中断
        }
    }

 

六、main函数

 
     /****************************************************************************
    * Function Name : main
    * Description : Main program.
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    int main(void)
    {
        RCC_Configuration();
        
        NVIC_Configuration();
        
        GPIO_Configuration();
        
        USART_Configuration();
        
        DMA_Configuration();
        
        while(1)
        {
            GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)));
            fPutString("Hello World!", 13);
            Delay(0xffffff);
        }    
    }

    /****************************************************************************
    * Function Name : fPutString
    * Description : Send a string.
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    void fPutString(u8 *buf, u8 len)
    {
        u8 i;
        for(i=0;i<len;i++)
        {
            fPutChar(*buf++);
        }
    }

    /****************************************************************************
    * Function Name : fPutChar
    * Description : Send a byte
    * Input : None
    * Output : None
    * Return : None
    ****************************************************************************/
    u8 fPutChar(u8 ch)
    {
        USART_SendData(USART1, (u8) ch);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        {
            
        }
        return ch;
    }

 







  • /*******************************************************************************
  • * Function Name : USART_Configure
  • * Description : Configures the USART
  • * Input : None
  • * Output : None
  • * Return : None
  • *******************************************************************************/
  • void USART_Configuration(void)
  • {
  •     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_HardwareFlowControl = USART_HardwareFlowControl_None;
  •     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  •     USART_Init(USART1, &USART_InitStructure);
  •     USART_Cmd(USART1, ENABLE);
  • }

 

转载于:https://www.cnblogs.com/ch122633/p/7363269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值