历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2019年09月10日 | 关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

2019-09-10 来源:eefocus

主函数中代码如下:


#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]);//显示向内存发送的字符

}


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


ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

推荐阅读

史海拾趣

ELEKTRO-PLAST NASIELSK公司的发展小趣事

随着环保意识的提高和可持续发展理念的普及,电子行业对环保要求也越来越高。ELEKTRO-PLAST NASIELSK公司积极响应这一趋势,将绿色环保理念贯穿于产品研发和生产过程中。公司采用环保材料和工艺生产产品,并推动供应链中的合作伙伴共同践行环保理念。此外,公司还积极推广可回收利用和循环再生的理念,为保护环境做出了积极贡献。

HANBIT Electronics公司的发展小趣事

随着公司规模的扩大和市场竞争的加剧,ELEKTRO-PLAST NASIELSK公司意识到必须实施全球化战略以拓展市场。公司开始在国际市场寻找合作伙伴,建立生产基地和销售网络。通过与国际知名企业的合作,公司不仅提升了技术水平,还获得了更多的市场份额。同时,公司还积极参与国际行业标准的制定和推广工作,提升了在国际市场上的影响力。

AMICC [AMIC TECHNOLOGY]公司的发展小趣事

近年来,电子行业面临着技术升级、市场变革等多重挑战。AMICC积极应对这些挑战,不断调整战略和业务模式。公司加大了对新兴技术的研发投入,加快了产品更新换代的速度。同时,AMICC还加强了与产业链上下游企业的合作,共同应对市场变化。这些措施使AMICC在行业中保持了领先地位,实现了持续稳健的发展。

EPT公司的发展小趣事

随着市场需求的不断变化,EPT意识到传统生产线已无法满足高容量、高耗能电池的生产需求。因此,公司投入巨资引进了全自动生产线,并采用了特殊的电池成型技术。这一举措不仅提高了生产效率,还保证了产品的稳定性和一致性。同时,EPT还针对不同类型的电池设计了专门的生产线,以满足市场的多样化需求。这一转型使得EPT在电子行业中脱颖而出,赢得了众多客户的青睐。

FCI connector [富加宜连接器]公司的发展小趣事

在大中华区市场,FCI展现出了强劲的增长势头。公司积极布局中国市场,特别是在3G产业领域,FCI投入大量人力资源研发相关产品,为通信设备厂商提供优异的连接器解决方案。随着中国3G牌照的发放,FCI的业绩得到了强劲增长。几乎所有的12.5GHz局端通信设备制造商都采用了FCI的连接器解决方案,这使得FCI在大中华区的市场份额不断攀升。

ACP Optoelectronic Technology Co Ltd公司的发展小趣事

在国内市场取得一定成绩后,ACP Optoelectronic Technology Co Ltd开始积极拓展国际市场。公司积极参加国际电子展会和技术交流活动,与海外企业建立合作关系,拓展销售渠道。经过几年的努力,ACP Optoelectronic Technology Co Ltd的产品已经成功打入多个国际市场,公司也逐渐发展成为一家具有国际影响力的光电企业。

问答坊 | AI 解惑

pcb 基礎

这个可是基础.要重示.…

查看全部问答>

s3c2410 lcd滚屏程序

看了好久一直没明白!问一下各位: 系统缓冲区,帧缓冲区,和LCDBASEU.LCDBANK,LCDBASEL是什么关系啊 如果可以的话能不能提供一下lcd的驱动程序啊 谢谢…

查看全部问答>

dependency scanner问题

问一下cmake、scons等自动生成makefile工具都有自己的dependency scanner 哪个是可以自己修改的?怎么增加一个自己定义的依赖?…

查看全部问答>

wince中录音应该使用哪个DLL文件,哪些函数,是Coredll.dll吗?

wince中录音应该使用哪个DLL文件,哪些函数,是Coredll.dll吗?开始做这个,不想走重复路…

查看全部问答>

ARM2440的触摸屏校准问题

各位,请问一下,触摸屏校准问题,我使用的是友善之臂的s3c2440的开发板,在qtopia core4.3.5做的图形代码, 现在在板子上跑,发现一个问题,就是触摸屏可以响应,左右划动是正确的,但是上下划动则是想相反的,请各位给予帮助 我认为是坐标校准 ...…

查看全部问答>

【求助】I2S中 _WrL3Data(0xf2,0);是什么意思?

本人比较小白 实在看不懂下面这段代码 希望大侠 能帮分析下~~~谢谢了~ 代码如下:         _WrL3Addr(0x14 + 0);         //DATA0 (000101xx+00)         _WrL3Data(0xc2,0);  ...…

查看全部问答>

WinCE里进行文件的压缩与解压缩

我需要在EVC写一个程序,对ZIP文件进行解压,请问应该怎么做?听说SharpZipLib这个DLL能实现,但是网上只有C#的(我对C#不熟悉,只用过C++),不知道在WINCE下能否调用?最好能说一下思路,谢谢!…

查看全部问答>

关于串口转发的问题

一台电脑有两个串口com1,com2 com1口接受外部的电报信息,转发到com2口后再通过com2口传递给其他电脑 现在,com1口的接收与COM2的发送都已经没有问题了. 请问大家,有什么现成的软件可以实现由\"com1接到数据后自动转移到com2\"的过程? (由于这台 ...…

查看全部问答>

virtex系列的gtp和lvds高速信号管脚是否可以作为普通IO管脚使用?

virtex系列的gtp和lvds高速信号管脚是否可以作为普通IO管脚使用?…

查看全部问答>

MSP430F5438下载求助

近日利用IAR5.3大模式对MSP430F5438进行编程,程序、全局变量和const常量大约各自分别为12K、7K和1K,前时一直顺利,可最近却常常在编译、连接均一切正常情况下无法完全下载并调试。反复排查时好时坏,好时能够下载但增加几行程序原现象再次发生, ...…

查看全部问答>