关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

 

主函数中代码如下:

#include "stm32f10x.h"
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
void NVIC_Config(void);
void LED1_ON(void);
void LED2_ON(void);
void LED3_ON(void);
void LED4_ON(void);
void LED_ALL_OFF(void);
void delay(void);
uint8_t DMA_BUFFER[1]; 
int main()
{

    
    GPIO_Config();
    USART_Config();
    DMA_Config();
    NVIC_Config();
    USART_DMACmd(USART1,USART_DMAReq_Rx, ENABLE);//使能DMA接收
    while(1)
    {
      switch(DMA_BUFFER[0])
        {
            case '1' :LED1_ON();break;//点亮LED1
            case '2' :LED2_ON();break;//点亮LED2
            case '3' :LED3_ON();break;//点亮LED3
            case '4' :LED4_ON();break;//点亮LED4
            case '5' :LED_ALL_OFF();break;//熄灭所有LED
        }
        
        
    }
}

void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStr;//定义GPIO初始化结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC, ENABLE);//使能相关GPIO、AFIO时钟
    
      GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//使能USART1的重映射
      /*设置Tx管脚*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_6; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_AF_PP;
      GPIO_Init( GPIOB, &GPIO_InitStr);
      /* 设置Rx管脚*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_7; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_IN_FLOATING;
      GPIO_Init( GPIOB, &GPIO_InitStr);
      /*设置指示状态用的PC6*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_6; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_Init( GPIOC, &GPIO_InitStr);
      GPIO_SetBits( GPIOC, GPIO_Pin_6);
      /*设置指示状态用的PC7*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_7; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_Init( GPIOC, &GPIO_InitStr);
        GPIO_SetBits( GPIOC, GPIO_Pin_7);
        /*设置指示状态用的PC8*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_8; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_Init( GPIOC, &GPIO_InitStr);
        GPIO_SetBits( GPIOC, GPIO_Pin_8);
        /*设置指示状态用的PC9*/
      GPIO_InitStr.GPIO_Pin=GPIO_Pin_9; 
      GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz; 
      GPIO_InitStr.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_Init( GPIOC, &GPIO_InitStr);
      GPIO_SetBits( GPIOC, GPIO_Pin_9);
}

void USART_Config(void)
{
   USART_InitTypeDef USART_InitStr;//定义串口初始化结构体
    
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能USART1的时钟
 /*设置波特率115200,8位数据位,1位停止位,无校验,无硬件流控制,收发双工*/
     USART_InitStr.USART_BaudRate=115200; 
     USART_InitStr.USART_WordLength=USART_WordLength_8b;   
     USART_InitStr.USART_StopBits=USART_StopBits_1;   
     USART_InitStr.USART_Parity=USART_Parity_No;     
     USART_InitStr.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;    
     USART_InitStr.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
     USART_Init(USART1,&USART_InitStr);//初始化USART1
     USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);//使能串口1的输入中断
     USART_Cmd( USART1,ENABLE);//使能USART1

}
void DMA_Config(void)
{
     DMA_InitTypeDef DMA_InitStr; //定义DMA_InitTypeDef类型初始化结构体 
    
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA1的时钟
    
     DMA_InitStr.DMA_PeripheralBaseAddr= (uint32_t)(&(USART1->DR));//外设地址为USART1的DR寄存器
     DMA_InitStr.DMA_MemoryBaseAddr=(uint32_t)&DMA_BUFFER;//内存地址为DMA_BUFFER[1]的首地址
     DMA_InitStr.DMA_DIR=DMA_DIR_PeripheralSRC;//外设向内存传输  
     DMA_InitStr.DMA_BufferSize=1;//传送数目为1
     DMA_InitStr.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地址不增加
     DMA_InitStr.DMA_MemoryInc=DMA_MemoryInc_Enable;   //内存地址自动加1
     DMA_InitStr.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//外设数据宽度为byte,即8位
     DMA_InitStr.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; //内存数据宽度byte
     DMA_InitStr.DMA_Mode=DMA_Mode_Circular;  //DMA模式为循环模式
     DMA_InitStr.DMA_Priority=DMA_Priority_High;  //优先级为高
     DMA_InitStr.DMA_M2M=DMA_M2M_Disable;  //禁用内存至内存模式
     DMA_Init(DMA1_Channel5, &DMA_InitStr);//初始化USART1的Rx所在的DMA1的通道5
     DMA_Cmd(DMA1_Channel5, ENABLE);//使能DMA1的通道5
      
  
}

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStr;

    /*使能串口1的中断向量*/
    NVIC_InitStr.NVIC_IRQChannel=USART1_IRQn; 
    
    NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStr.NVIC_IRQChannelSubPriority=0; 
    NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE ;  
    NVIC_Init(&NVIC_InitStr);
}

void delay(void)
{
   unsigned int i;
    for(i=500000;i>0;i--);

}

void LED1_ON(void)
{
   GPIO_ResetBits(GPIOC, GPIO_Pin_6);//点亮LED1
}

void LED2_ON(void)
{
  GPIO_ResetBits(GPIOC, GPIO_Pin_7);//点亮LED2

}

void LED3_ON(void)
{
  GPIO_ResetBits(GPIOC, GPIO_Pin_8);//点亮LED3

}

void LED4_ON(void)
{
  GPIO_ResetBits(GPIOC, GPIO_Pin_9);//点亮LED4

}

void LED_ALL_OFF(void)
{

  GPIO_SetBits( GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //熄灭所有LED

}

在stm32f10x_it.c文件代码如下:

extern uint8_t DMA_BUFFER[1]; 
void USART1_IRQHandler(void)//USART1中断服务函数
{
   USART_SendData(USART1,DMA_BUFFER[0]);//显示向内存发送的字符
}

 

关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现_第1张图片

在此中断函数中不可使用以下函数,否则会出现串口回显空

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

 

你可能感兴趣的:(关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现)