历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2018年09月11日 | STM32串口+DMA的使用2

2018-09-11 来源:eefocus


uint8_t UART4_Rx_buffer[512],UART4_Rx_num;  

 

void UART4_Config(void)  

{  

    GPIO_InitTypeDef GPIO_InitStructure;               

    USART_InitTypeDef USART_InitStructure;  

    NVIC_InitTypeDef NVIC_InitStructure;  

    DMA_InitTypeDef DMA_InitStructure;      

          

//  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);      //选择NVIC优先级分组0    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);  

  

    //串口4所使用管脚输出输入定义  

    //定义UART4 Tx (PC.10)脚为复用推挽输出  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;         //IO口的第2脚  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //IO口复用推挽输出  

    GPIO_Init(GPIOC, &GPIO_InitStructure);            //初始化串口1输出IO口  

      

    //定义 UART4 Rx (PC.11)为悬空输入   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;           //IO口的第3脚  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入  

    GPIO_Init(GPIOC, &GPIO_InitStructure);               //初始化串口1输入IO口  

  

    //串口4参数初始化定义部分,串口1参数为9600 , 8 ,1 ,N  接收中断方式    

    USART_InitStructure.USART_BaudRate = 9600;                  //设定传输速率  

    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(UART4, &USART_InitStructure);      //初始化串口4  

      

    USART_ITConfig(UART4, USART_IT_IDLE,ENABLE);  //使能串口4接收中断     

    USART_Cmd(UART4, ENABLE);                     //使能串口4     

    USART_ClearFlag(UART4, USART_FLAG_TC);        // 清标志(后增加)  

  

    DMA_DeInit(DMA2_Channel3);   //重置DMA 2通道配置    

    DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004C04;   //外设地址    

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)UART4_Rx_buffer;     //内存地址    

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   //外设作为数据目的地   

    DMA_InitStructure.DMA_BufferSize = 512;  //DMA缓存大小:BufferSize   

    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_PeripheralDataSize_Byte;  //内存数据宽度为8位   

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在正常缓存模式   

    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;  //设置DMA通道优先级为高   

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     //禁止DMA通道设置为内存至内存传输   

    DMA_Init(DMA2_Channel3, &DMA_InitStructure);     //初始化  

        

    DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);  

    DMA_ITConfig(DMA2_Channel3, DMA_IT_TE, ENABLE);  

  

    USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE);  

    DMA_Cmd(DMA2_Channel3, ENABLE);  

    //使能串口4中断  

    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

    NVIC_Init(&NVIC_InitStructure);   

  

    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel3_IRQn;   

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   

    NVIC_Init(&NVIC_InitStructure);  

 }  

 

void UART4_IRQHandler(void)  

{  

    uint16_t i;  

    uint16_t Data_Len;  

if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET)    //如果为中断  

 {    

    DMA_Cmd(DMA2_Channel3, DISABLE);  

    Data_Len=512-DMA_GetCurrDataCounter(DMA2_Channel3);  

    USART_PutStr(USART1,UART4_Rx_buffer,Data_Len);    

    UART4_Rx_num=0;  

    DMA_ClearFlag(DMA2_FLAG_GL3 | DMA2_FLAG_TC3 | DMA2_FLAG_TE3 | DMA2_FLAG_HT3); //清标志  

    DMA2_Channel3->CNDTR = 512;                //重装填  

    DMA_Cmd(DMA2_Channel3, ENABLE);            //处理完,重开DMA  

    //读SR后读DR清除IDLE  

    i = UART4->SR;  

    i = UART4->DR;  

    if(i) i=0;  

    if(Data_Len) Data_Len=0; 

 }

}    

 

if(USART_GetITStatus(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)

{    //出错  

    USART_ClearITPendingBit(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE);  

    USART_ClearITPendingBit(UART4, USART_IT_TC);  

    USART_ClearITPendingBit(UART4, USART_IT_IDLE);

    void DMA2_Channel3_IRQHandler(void)  

    USART_PutStr(USART1," DMA23:\r\n",9);  

    DMA_ClearITPendingBit(DMA2_IT_TC3);  

    DMA_ClearITPendingBit(DMA2_IT_TE3);  

    DMA_Cmd(DMA2_Channel3, DISABLE);         //关闭DMA,防止处理其间有数据  

    DMA2_Channel3->CNDTR = 512;              //重装填  

    DMA_Cmd(DMA2_Channel3, ENABLE);          //处理完,重开DMA  

}


推荐阅读

史海拾趣

American Custom Components公司的发展小趣事

随着全球环境问题的日益严重,American Custom Components公司开始关注可持续发展和社会责任。公司积极推行绿色生产,采用环保材料和节能技术,减少生产过程中的环境污染。同时,公司还参与了一系列公益活动,支持当地社区的发展和环境保护事业。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

这些故事只是基于电子行业常规实践虚构的示例,并不代表American Custom Components公司的真实发展历程。如需了解该公司的真实情况,建议查阅相关资料或访问公司官方网站。

Avalon Photonics公司的发展小趣事

随着Avalon Photonics的不断发展壮大,公司开始更加关注社会责任和可持续发展。公司积极参与公益活动,支持教育事业和科技创新。同时,Avalon也致力于研发更加环保、节能的产品,为推动电子行业的可持续发展贡献力量。通过积极履行社会责任,Avalon Photonics不仅赢得了社会各界的认可,也为公司的长远发展奠定了坚实的基础。


以上五个故事均基于虚构的Avalon Photonics公司背景创作,旨在展示一个电子行业公司在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、国际合作、产品创新、研发投入和社会责任等途径实现快速发展。这些故事均遵循了只描述事实、不做褒贬的原则。

中电熊猫(CEC)公司的发展小趣事

在发展过程中,中电熊猫积极寻求与国际巨头的合作。2009年,中电熊猫与日本夏普公司签署协议,引进第六代液晶面板项目。这一合作不仅为中电熊猫带来了先进的技术和管理经验,也为其后续的高世代液晶面板线布局提供了有力支持。通过与夏普等国际巨头的合作,中电熊猫逐渐在液晶显示产业中崭露头角。

EAO公司的发展小趣事

在技术创新方面,EAO公司一直走在行业前列。公司拥有一支高素质的研发团队,不断探索新技术、新材料和新工艺在电子产品中的应用。通过技术创新,EAO公司不断推出具有市场竞争力的新产品,满足客户不断变化的需求。同时,公司还积极与高校、科研机构等合作,共同推动电子行业的科技进步。

Hitachi Metals公司的发展小趣事

自1956年成立以来,Hitachi Metals便逐步在电子材料领域建立了坚实的基础。公司早期便专注于研发和生产用于电子设备的核心部件,如磁性材料。随着电子行业的蓬勃发展,日立金属迅速抓住了市场机遇,推出了高性能的Nd-Fe-B系列烧结磁石和高性能铁氧体烧结磁石,这些材料广泛应用于计算机、半导体集成电路器件及平板显示屏等高科技产品中。凭借其卓越的产品质量和稳定的市场供应,Hitachi Metals在电子材料市场上赢得了广泛的认可。

C&K Switches公司的发展小趣事

C&K Switches公司一直致力于技术创新和研发。它不断投入资金和资源,研发出了一系列具有高性能和可靠性的开关产品。这些产品不仅提高了设备的运行效率和稳定性,还降低了故障率和维修成本。同时,C&K还积极与合作伙伴和客户进行技术交流和合作,共同推动电子行业的发展。这种技术突破和创新精神使得C&K在激烈的市场竞争中保持领先地位。

问答坊 | AI 解惑

使用VxWorks时出现了问题,请教各位,给点儿建议!cpu是MPC862

自己编了个小程序,在Tornador里结合VxWorks一起. 程序很简单,就是读存储器! xd0 = *(unsigned int *)(SDRAM_ADR); xd1 = *(unsigned int *)(BOOTFLASH_ADR); xd2 = *(unsigned short int *)(FLASH_ADR); 我的存储器有三种,一个是SDRAM,32位;一 ...…

查看全部问答>

提供bc++45下载,想下的同学抓紧了~

最近开始学习\"劭贝贝\"的,里面的例子需要bc45,费了好大劲终于找到了.现提供连接如下:           borland c++ v4.5 Part3 http://www.tomore.com/3/23811.html           borland ...…

查看全部问答>

热地和冷地,你听过吗?

热地:开关电源无需使用变压器,其开关电路的“地”和市电电网有关,既所谓的“热地”,它是带电的 冷地:由于开关电源的高频变压器将输入、输出端隔离;又由于其反馈电路常用光电耦合、既能传送反馈信号又将双方的“地”隔离;所以输出端的地称之 ...…

查看全部问答>

STM32101VCT6SRAM(62256)cpld7128lcd12232测试版电路

attach]20052[/attach]原理图 这个是62256的电路,贴出来 下载 (950.99 KB) 2010-3-26 10:05 电路描述:FSMC_NADV经非门后接573的锁存脚,FSMC_NE1接62256的片选/CS,FSMC_NOE接62256的/OE,FSMC_NOE接62256的/WE STM ...…

查看全部问答>

【晒经典】集成运算放大电路篇

本帖最后由 dontium 于 2015-1-23 11:43 编辑 本帖主要回顾集成运放在电路中的使用,即集成运算放大电路,前两贴作为此贴的基础,我采用循序渐进的阐述方法   1.F007放大电路   F007是通用型集成运放,它由正负15V两路电源供电。从+ ...…

查看全部问答>

飞思卡尔单片机与rf905的通信spi通信问题

我是一个新人,对飞思卡尔单片机使用的不是很熟,最近在使用飞思卡尔128单片机和nrf905之间做一个无线传输的小协议,选择飞思卡尔为主机模式,并且作为接收终端,用于接收我的发送数据。我的发送端是用51做到已经好使了,没有问题了(发送端暂且不 ...…

查看全部问答>

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊

请求 继续团购 MSP430 LaunchPad MSP-EXP430G2  25元不用包邮啊 30元 也可以试试 [ 本帖最后由 ppiicc 于 2012-5-3 22:53 编辑 ]…

查看全部问答>

常用晶振封装尺寸

画430PCB的时候,发现以前没做过32768Hz的手表晶体的封装,然后再网上找到这样一个有很多晶振封装的网页,转成了PDF跟大家分享下。 …

查看全部问答>

protel99se软件

小弟想学习线路板设计,谁有protel99se 的软件,帮帮忙给上传一份…

查看全部问答>

晒设计方案+STM32F429i开发板之未完成部分

     这个算是个遗憾帖吧。     本来还准备了两个实验,但鉴于时间问题,不能在活动结束前完成了。不过等做完我会来让大家看看的。      其中一个是GPS的实验,模块已经买回来了,只 ...…

查看全部问答>