stm32的DMA空闲中断数据配置

发布者:ww313618最新更新时间:2016-10-05 来源: eefocus关键字:stm32  DMA  空闲中断  数据配置 手机看文章 扫描二维码
随时随地手机看文章
对于串口2的示例:

void USART2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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(USART2, &USART_InitStructure);
//////////////////中断的相关配置////////////////////////////
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //允许中断方式
USART_Cmd(USART2, ENABLE);

DMA_DeInit(DMA1_Channel6);
DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 512;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel6, &DMA_InitStructure);
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel6, ENABLE);
USART_ITConfig(USART2, USART_IT_IDLE , ENABLE);
}

中断部分:

void USART2_IRQHandler(void)
{
// uint8_t data;
int i = 0;
// static u8 usart2_i;
int DATA_LEN;
OSIntEnter();
// if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
// {
// USART_ClearITPendingBit(USART2,USART_IT_RXNE);
// data = USART_ReceiveData ( USART2 ) ;
// // USART_SendData(USART1, data);
// // printf("%c",data);
// // usart2_buffer[usart2_i] = data;
// }
if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
DMA_Cmd(DMA1_Channel6, DISABLE);
i = USART2->DR;

//防止不必要的错误出现
if( DMA_GetCurrDataCounter(DMA1_Channel6) > 512)
{
return;
}

DATA_LEN = 512 - DMA_GetCurrDataCounter(DMA1_Channel6);

for(i=0;i < DATA_LEN;i ++ )
{
USART2_SEND_DATA[i] = USART2_RECEIVE_DATA[i];
}
usart2_received_data(USART2_SEND_DATA);
//printf("%s",USART2_SEND_DATA);
DMA1_Channel6->CNDTR = 512;
DMA_Cmd(DMA1_Channel6, ENABLE);
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
}
memset(USART2_SEND_DATA,'\0' ,sizeof(USART2_SEND_DATA));
memset(USART2_RECEIVE_DATA,'\0' ,sizeof(USART2_RECEIVE_DATA));
OSIntExit();
}

 

关键字:stm32  DMA  空闲中断  数据配置 引用地址:stm32的DMA空闲中断数据配置

上一篇:stm32的RTC操作
下一篇:stm32函数放入段section中

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

STM32/STM8L/STM8S系列之一、流水灯
一、STM32F103点亮LED 1、电路图: 2、代码: //FUNCTION:LED初始化 //PARA :无 //RETURN :无 void LED_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE); //使能AFIO和GPIOB端口 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭PB3 PB4的复用功能,使能通用IO功能
[单片机]
<font color='red'>STM32</font>/STM8L/STM8S系列之一、流水灯
STM32学习笔记 之绪论
学习STM32也有些日子了。作为初学者,从最初的一无所知,到现在略知皮毛之皮毛,感觉着实不容易。 下面把自己的体会以及自认为初学者不易掌握的要点和大家分享一下,有错误的地方,欢迎大家指正。 一、关于学习方法 初学STM32给我的一个感觉就是,概念繁多而且很多都可以继续深究下去,教程对此又不可能都很详细的论述,但于我来说如鱼鲠喉实在不爽。 因为我喜欢刨根问底,网络资料又实在繁杂,如此又耗费精力,又打击学习积极性。 终于有一天,我转变了心态,如果STM32犹如枝繁叶茂的大树(整个嵌入式体系亦如此),我要做的不是连每一个叶子都明了,而是暂时只要知晓其主干及一些必要的干支即可。其他的枝叶等有时间再去深究,
[单片机]
<font color='red'>STM32</font>学习笔记  之绪论
STM32之GPIO按键实验
实验板:带有按键的Stm32开发板一块,本人用得是Open107V实验板,型号是107的 库函数:STM32官方3.5的库 其他材料:ST-LINK、跳线若干 实验原理:按键实验和LED实验类似, GPIO点灯是向led的pin脚输出高低电平, 而按键则是向pin口输入高低电平。 对于按键有两种输入模式可以选择, 一,采用上拉输入模式,二,采用浮动浮空输入模式,上拉输入模式在没有按键按下的时候是默认是高电平。符合这个要求。原理图如下: 实验描述:PE5连接到key1,用扫描的方式查询是否有按键按下,key1按下时,LED1状态取反。 库文件:startup/start_stm32f10x_cl.s CMSIS/cor
[单片机]
触控屏的控制电路制作小记(附STM32的驱动)
触控屏已经不是什么新鲜的东西,现在的电子产品基本上都带有一个大大的彩色液晶,加上一个轻触式的触控屏。使用起来非常方便,可以完全取代以往那种固定式的按键。 下面就介绍一种触控屏的驱动电路,我也是一个小时前才把这个小板子做出来,测试成功后马上发表这篇日志,新鲜热辣的哦! 首先,介绍以下触控屏幕的构造,它是由一块触控屏幕和一块液晶显示屏幕粘合在一起的。液晶显示屏幕按色彩、材料、成像原理等多种方式分类,种类繁多,这里对液晶屏幕不做详细介绍,本文图片中所使用的是16Bit半透明反射式TFT液晶点阵显示屏。而触摸屏幕主要分为两大类,分别是电容式和电阻式。 电容式触控屏利用人体的电流感应进行工作,优点是使用寿命长,触摸时不需用力,面板坚
[单片机]
触控屏的控制电路制作小记(附<font color='red'>STM32</font>的驱动)
STM32多路adc检测
首先先上一图,自己做的检测8位adc.测量八个adc传感器 1.12位分辨率 在STM32所有系列芯片中只有少部分是16位的,如:F373芯片。 12位分辨率意味着我们采集电压的精度可以达到:Vref /4096。 采集电压 = Vref * ADC_DR / 4096; Vref:参考电压 ADC_DR:读取到ADC数据寄存器的值 由于寄存器是32位的,在配置的时候分左对齐和右对齐,一般我们使用右对齐,也就是对低12位数据为有效数据。 2.转换模式 A.单次和连续转换 单次:单通道单次转换、多通道单次(分多次)转换; 连续:单通道连续转换、多通道连续(循环)转换; B.双ADC模式
[单片机]
<font color='red'>STM32</font>多路adc检测
STM32之串口原理
串口通信定义   串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信原理   串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信
[单片机]
STM32 断言的使用
由于进入岁末,放假还有几天,无事可做便开始玩玩STM32芯片。 以前虽然也使用过ST8系列的8位单片机,但是相对于32位的STM32系列单片机来讲,还是稍微复杂一点的。但ST半导体出品的CPU都提供固件库给大家使用,这使得开发周期缩短了很多。在仔细阅读官方下载的固件库时,发现ST的技术人员编写的固件库很值得我们学习。 1、首先它的封装很独立,便于移植,功能模块独立; 2、通过 include.h 对包含的固件库头文件进行剪裁,方便加载需要的头文件; 3、在功能函数中都进行断言判断,以便设计人员在开发调试阶段进行稳定性测试; 。。。。。。 /* Exported ty
[单片机]
STM32学习笔记之电容触摸2
(4)在led.c文件中添加以下代码 (5)在tpad.c文件内添加以下代码 #include tpad.h #include delay.h /*************************************************** Name :TPAD_Get_Value Function :触摸按键值获取 Paramater :None Return :获取的充电时间 ***************************************************/ u16 TPAD_Get_Value() { //电容放电 GPIOA- CRL &= 0xFFF
[单片机]
<font color='red'>STM32</font>学习笔记之电容触摸2
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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