历史上的今天
返回首页

历史上的今天

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

正在发生

2018年12月10日 | STM32F103RCT6+串口DMA方式接收定长数据

2018-12-10 来源:eefocus

1.接收缓存数组初始化


#define USART_REC_LEN  100  //定义最大字节数 100

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.


2.串口初始化


void uart_init(u32 bound)

{

  //GPIO端口设置

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//使能

    USART1,GPIOA时钟

  

//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

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

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX  GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

 

  //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

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); //初始化串口1

 // USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口接受中断

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//使能DMA接收

  USART_Cmd(USART1, ENABLE);                    //使能串口1 

}


3.DMA配置


void Usart1_DMA_init()

{

    DMA_InitTypeDef DMA_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA1 时钟使能

  DMA_DeInit(DMA1_Channel5);//将DMA的通道5寄存器重设为缺省值  串口1对应的是DMA通道5(接收)

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;//DMA外设UASRT1->DR基地址

    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART_RX_BUF;//DMA内存基地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA方向  外设->内存

    DMA_InitStructure.DMA_BufferSize = sizeof(USART_RX_BUF);//DMA通道的DMA缓存的大小

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度为8位

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

    //DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)

    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA传送优先级为中等)

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输

    DMA_Init(DMA1_Channel5, &DMA_InitStructure);//初始化DMA1 通道5

    DMA_Cmd(DMA1_Channel5, ENABLE);  //启动DMA传输

  //DMA发送中断配置

  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能

  NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化VIC寄存器

DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);//使能DMA传输完成中断

}


 4.DMA中断服务程序


void DMA1_Channel5_IRQHandler(void)

{

if(DMA_GetFlagStatus(DMA1_FLAG_TC5)==SET)

   {

        DMA_ClearFlag(DMA1_FLAG_TC5);//清中断标志,否则会一直中断

  printf("进入DMA发送中断!\r\n");       

   }

}



可见,串口每接收100个字节产生一次DMA中断!


推荐阅读

史海拾趣

Hammond公司的发展小趣事

HALO Electronics公司的发展故事

故事一:初创与早期技术突破

HALO Electronics,全称HALO Electronics, Inc.,成立于1991年9月19日,总部位于美国德克萨斯州。公司自成立之初便专注于通信和功率磁性元件的设计与制造。在成立的早期,HALO便展现出了强大的技术创新能力。1993年,HALO推出了TnT™模块,这是首个具有成本效益的10base2模块,专为房地产敏感的薄网和背板应用设计,这一产品迅速在市场上获得了认可。紧接着,1994年,HALO又开发了一种专利的SMD变压器技术,为行业提供了更为强大的变压器解决方案,进一步巩固了其在磁性元件领域的地位。

故事二:与行业领先企业的合作

HALO Electronics的发展离不开与行业内领先企业的紧密合作。1995年,HALO与Maxim Integrated Products合作,共同开发了TGM-P3系列低成本PCMCIA变压器,这些变压器专为MAX253/845系列单片振荡器/功率驱动器设计,用于小型低成本DC/DC转换器。这一合作不仅提升了HALO产品的市场竞争力,也为其在高端应用领域的拓展奠定了坚实基础。

故事三:创新产品的持续推出

HALO Electronics一直致力于创新产品的研发与推出。1997年,公司推出了Quatra™系列首个四端口T1/E1磁性模块,这一产品是与Level One(Intel)共同开发的,提供了更高密度的T1/E1解决方案。随后,在1998年,HALO又创造了Ultra™系列变压器,这是当时最具成本效益和房地产效率的10/100base-TX变压器,其SOIC16封装成为了单端口快速以太网应用的行业标准。这些创新产品的推出,不断推动着HALO在电子行业的领先地位。

故事四:安全与效率并重的产品开发

HALO Electronics在产品开发过程中始终注重安全与效率。1999年,公司宣布了业界首个UL认可的4.5KV隔离变压器系列,这些变压器专为需要高度安全的以太网应用设计,满足了市场对高安全性产品的迫切需求。同年,HALO还推出了业界较小的双端口T1/E1变压器系列,进一步提升了产品的空间利用率和效率。这些举措不仅彰显了HALO在产品安全与效率方面的卓越追求,也为其赢得了更多客户的信赖和支持。

故事五:全球化布局与市场份额的扩大

随着业务的不断发展,HALO Electronics逐渐开始了全球化布局。公司在全球范围内建立了多个销售办事处和仓库,包括加州圣克拉拉、内华达州拉斯维加斯、香港和新加坡等地。同时,HALO还在北美、欧洲和亚洲的主要地区设立了卫星办公室,由区域经理负责开展工作。此外,HALO还在全球范围内拥有众多制造商代表和分销商,形成了完善的销售和服务网络。这些举措不仅提升了HALO的市场覆盖率和服务能力,也为其在全球范围内的市场份额扩大奠定了坚实基础。如今,HALO已成为电子行业中备受瞩目的磁性元件供应商之一。

Diamond SA公司的发展小趣事

在电子行业竞争日益激烈的背景下,Diamond SA公司开始寻求通过并购来实现规模扩张和资源整合。他们精心挑选了一些具有潜力的目标企业,通过谈判和交易成功完成了并购。这些并购不仅为Diamond SA公司带来了更多的技术资源和市场份额,还增强了公司的整体竞争力。

AMS公司的发展小趣事

在电子行业竞争日益激烈的背景下,Diamond SA公司开始寻求通过并购来实现规模扩张和资源整合。他们精心挑选了一些具有潜力的目标企业,通过谈判和交易成功完成了并购。这些并购不仅为Diamond SA公司带来了更多的技术资源和市场份额,还增强了公司的整体竞争力。

GPD Optoelectronics Corp公司的发展小趣事

Diamond SA公司深知创新是企业持续发展的动力源泉。因此,他们不断加大对研发的投入力度,积极引进和培养高端人才,建立了完善的研发体系。公司不断推出具有创新性和领先性的电子产品和技术解决方案,赢得了客户的广泛赞誉和认可。同时,他们还积极参与国际技术交流和合作,与全球顶尖的科研机构和企业建立了紧密的合作关系。

Acopian Power Supplies公司的发展小趣事

在电子行业的初期,Diamond SA公司以其卓越的技术研发能力脱颖而出。公司创始人对半导体技术的深入研究,引领了一场技术革命。他们成功开发出一种新型的芯片设计,大大提高了电子设备的性能和效率。这一创新技术迅速在市场上获得了认可,Diamond SA公司也因此逐渐崭露头角。

ERP Power公司的发展小趣事

在这个故事中,我们将关注ERP Power在国际市场的拓展情况。通过与国际知名企业的合作和交流,ERP Power系统成功打入国际市场并获得了广泛认可。这一过程中,ERP Power不仅提升了自身的技术实力和服务水平还积累了丰富的国际化经验。

问答坊 | AI 解惑

常见的嵌入式操作系统

DOS     微软一开始选用了派特森的Q-DOS “QUICK AND DISK OPERATING SYSTEM ”为基础然后再扩充功能而成 MS-DOS,主要是采用由IBM 提供的使用8088 微处理器的计算机作开发平台,它是以16 字节单人单工操作系统,特别适合一些功能简单 ...…

查看全部问答>

请教关于PXA270唤醒源的设置

专家好:    我的PDA前两天在公司测试部门发现,按键进入深度休眠后,不能马上按键唤醒,只有等5~6秒(大约值)后才能马上唤醒 我的按键休眠是设置的GPIO0,唤醒源也是GPIO0 具体的设置如下:          &nbs ...…

查看全部问答>

如何在win ce下设置图片的3D凸起效果?(C#) 谢谢了!

如何在win ce下设置图片的3D凸起效果?(C#) 谢谢了!…

查看全部问答>

关于TAPI的lineInitializeEx的困惑

Windows Embedded CE 6.0帮助文档中介绍,Establishing a Modem Connection的流程如下: lineInitializeEx      ↓ lineOpen      ↓ lineMakeCall      ↓ lineGetMessage & ...…

查看全部问答>

串口输出 程序调试

#include #include void main() { int i=7,j=2; float f=(float)i/j; SCON = 0x50; TMOD |= 0x20; TH1 = 0xf3; TR1 = 1; TI = 1; printf(\"%f\",f); while(1) {} } 这个程序为什么在运行的时候 在串口输入串口 没看到东西啊 ...…

查看全部问答>

全球首个太空机器人

$(\'swf_vSx\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/IJy11e9LXmk/v.swf\'), \'quality\', ...…

查看全部问答>

一个让人纠结的结果

最近玩单片机的时候谢了一个小代码,但是实在不知道出错在哪里。代码如下         ORG 0000H         ;程序从000H地址开始运行         LJMP        ...…

查看全部问答>

求教!新手求指点

若我有一台17KW  600V的无刷电机,控制器的驱动部分因该选用哪种IGBT和驱动芯片呀,求个型号以供参考,谢谢了…

查看全部问答>

Quartus II的用法

我写了两段不同的verilog代码来实现同一个功能,现在我想比较哪个代码在FPGA上跑的更快,我在Quartus II里如何看出来呢,请各位指导我一下,谢谢。…

查看全部问答>