关于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
}
【关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现】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亮灭的功能实现
文章图片

在此中断函数中不可使用以下函数,否则会出现串口回显空
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

    推荐阅读