STM32F103RCT6+串口DMA方式接收定长数据

发布者:cloudy德德最新更新时间:2018-12-10 来源: eefocus关键字:STM32F103RCT6  串口  DMA方式  定长数据 手机看文章 扫描二维码
随时随地手机看文章

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中断!


关键字:STM32F103RCT6  串口  DMA方式  定长数据 引用地址:STM32F103RCT6+串口DMA方式接收定长数据

上一篇:关于stm32串口不定长数据接收(hal库)的若干问题
下一篇:STM32的串口空闲中断接收不定长数据

推荐阅读最新更新时间:2024-03-16 16:19

XMEGA128学习笔记5-串口USART
Xmega128的串口非常强大,最多能支持8个串口。串口又有四种模式: 1、异步 2、同步 3、IRDA红外模式 4、SPI主模式 今天我们就使用CVAVR代码向导生成简单串口测试程序,实现每1s打印“HELLO WORLD”字符串,同时能将接收到数据回显到串口调试助手上。 第一步:打开中断,因为我们需要实现串口回显的功能。 第二步:从开发板的原理图可以看到串口是在PC2和PC3脚,所以需要设置GPIO,经过CVAVR的提示PC3初始输出电平为1能够更加稳定: 第三步设置串口:使能接收和发送功能,并开启接收中断。 第四步:最后生成代码,加入以下代码: 最后编译下载,复位后可以看到效果图:
[单片机]
XMEGA128学习笔记5-<font color='red'>串口</font>USART
51单片机串口通讯之中断法
程序讲解: /*---------------------------------------------------------------*/ //串口通讯 //按下按钮,单片机发送数据 Come On!\r\n 给主机 //单片机晶振:11.0592MHz //波特率: 9600bps /*-------------------------------------------------------------*/ //包含头文件 #include at89x52.h unsigned char co de tab ={ Come On!\r\n }; #define k1 P3_2 //对应开发板
[单片机]
STM32F103C8T6驱动ov2640拍照串口传输到上位机
使用环境(蓝色粗体字为特别注意内容) 1、软件环境:Keil MDK 5.15 2、硬件环境:STM32F103C8T6最小系统,OV2640摄像头模块 最近想玩玩摄像头,于是在网上找找性价比比较高的摄像头,之前用过OV7670这款摄像头,不过这款摄像头对单片机要求较高,一般的单片机驱动起来非常费劲,除非ARM级别的微处理器才能够胜任。要想使用低端单片机驱动的话需要加上FIFO模块,一加上这玩意价格就翻了3倍。。。。原来20块钱的东西涨到了70+,我的天。。。。于是找了大半天,终于找到OV2640这款摄像头,这摄像头是我目前遇到的性价比最高的摄像头了,竟然支持直接输出JPG格式的图片,最高支持1600*1200(200
[单片机]
STM32F103C8T6驱动ov2640拍照<font color='red'>串口</font>传输到上位机
S3C2440 Mini 2440 DMA方式实现Uart串口通信
搞了好久,终于完成了DMA方式实现串口通信。使用DMA不是很难,主要是DCONn的配置比较麻烦以及几种模式的理解。 DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。具体对应DCON 。 DMA DREQ/DACK PROTOCOL:DMA请求和应答的协议有两种,Demond mode 和 Handshake mode。两者对Request和Ack的时序定义有所不同: 在Demond模式下
[单片机]
STM32学习笔记之简易Bootloader串口升级设计
概念简介 在学习制作串口升级 Bootloader 之前,我们先了解一下STM32的 IAP (In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级. 设计这样的功能需要有两个项目代码: Bootloader 程序: 该部分代码用于实现通过某种通信方式(如 USB,USART)接收程序或数据,执行对第二部分代码的更新,通常存储于 Flash 的起始地址(0x08000000); App 程序: 该部分代码是产品实现业务逻辑正常运行的代码,该部分
[单片机]
STM32学习笔记之简易Bootloader<font color='red'>串口</font>升级设计
4412 串口编程
一、打开串口 串口在linux里都是设备,可以用open之类的函数操作 #include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include string.h void main() { int fd; char *uart3 = /dev/ttySAC3 ; fd = open(uart3, O_RDWR|O_CREAT, 0777); if(fd 0) { printf( open %s failed!n , uart3);
[单片机]
串口发送数据查询方式与中断方式
单片机采用中断或查询方式使用串口,这是根据实际应用的需要确定的,没有好/坏之分。有时之所以采用查询方式处理串口程序,是因为应用程序不苛刻单片机的时间资源,采用查询的方式就能满足应用的需要,所以没采用中断。 大量连续的向串口发送数据,就没有必要使用中断了,因为单片机根本没有时间去处理其它事务,这样采用查询的方式反而效率更高,实际应用中向串口发送数据很少使用中断,更多的是使用接收中断,除非单片机的时间资源特别的紧张,连等待一个数据的发送时间也得利用。 一般发送数据采用查询方式: 以stm32串口为例 void Send_String(uint8_t *str) { uint8_t index = 0; do
[单片机]
用8位单片机实现串口-以太网转换器
    摘要: 用8位单片机8031和ISA总线网卡,实现RS485串行设备与以太网的连接,以传送控制信令和数据文件。程序设计采用C51语言,便于移植和调试。     关键词: 以太网 串行通讯 单片机 C51 单片机或微控制器(MCU)(也称为嵌入式系统)已经在各个领域得到了广泛的应用。目前绝大多数系统都是以MCU为核心,与监测、伺服、指示设备配合实现一定的功能。以太网是当今最受欢迎的局域网之一,现已成为社会重要的基础信息设施,是信息流通的重要渠道。如果嵌入式系统能够连接到Internet,则可以方便、低廉地将信息传送到世界上的任何一个地方。 将嵌入式系统与Internet相连的主要困难在于:Inter
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved