STM32入门学习之DMA(STM32F030F4P6基于CooCox IDE)

发布者:蓝天飞行最新更新时间:2021-10-13 来源: eefocus关键字:STM32  DMA  CooCox  IDE 手机看文章 扫描二维码
随时随地手机看文章

本代码基于STM32F030F4P6,用例为DMA控制串口发送,需要注意以下几点


1、注意串口IO配置,包括IO配置和复用功能选择


2、STM32F030系列的DMA不支持外设到外设,STM32F030只有DMA1,没有DMA2


3、注意不同外设对应不同DMA通道,而且不同芯片的通道也不一定相同,注意看数据手册


直接代码如下:


#include "stm32_lib/inc/stm32f0xx_rcc.h"

#include "stm32_lib/inc/stm32f0xx_gpio.h"

#include "stm32_lib/inc/stm32f0xx_usart.h"

#include "stm32_lib/inc/stm32f0xx_dma.h"

 

//以下两种地址写法都可以

#define USART1_TDR_Address ((uint32_t)(USART1_BASE+0x28))

//#define USART1_TDR_Address (uint32_t)(&USART1->TDR)

 

unsigned char hellStr[]={'H','E','L','L','O'};

 

void RCC_Config(void);

void GPIO_Config(void);

void USART_Config(void);

void DMA_Config(void);

 

int main(void)

{

 

SystemInit();

 

RCC_Config();

GPIO_Config();

USART_Config();

DMA_Config();

 

//使能DMA通道2,意味着开始传输

DMA_Cmd(DMA1_Channel2,ENABLE);

 

while (1)

{

 

}

}

 

void RCC_Config(void)

{

//时钟配置

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

}

void GPIO_Config(void)

{

//选择引脚

//针对F030F4P6,TX有PA2和PA9可选,RX有PA3和PA10可选,特别注意查看文档是AF多少

//GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);

//GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

//引脚设置

GPIO_InitTypeDef PORT_UART1_TX; //定义TX脚,PORT_UART1_TX是自定义名称,可以任意

PORT_UART1_TX.GPIO_Pin = GPIO_Pin_9; //此参数根据上面选择的引脚来定

PORT_UART1_TX.GPIO_Speed = GPIO_Speed_10MHz;

PORT_UART1_TX.GPIO_Mode = GPIO_Mode_AF;

PORT_UART1_TX.GPIO_PuPd = GPIO_PuPd_NOPULL;

//IO初始化

GPIO_Init(GPIOA, &PORT_UART1_TX);

 

GPIO_InitTypeDef PORT_UART1_RX; //定义RX脚

PORT_UART1_RX.GPIO_Pin = GPIO_Pin_10; //此参数根据上面选择的引脚来定

PORT_UART1_RX.GPIO_Speed = GPIO_Speed_10MHz;

PORT_UART1_RX.GPIO_Mode = GPIO_Mode_AF;

PORT_UART1_RX.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &PORT_UART1_RX);

}

 

void USART_Config(void)

{

//串口参数配置

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 115200; //设置波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据长度

USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验

USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置流控制

USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //设置模式

USART_Init(USART1, &USART_InitStructure);

//使能DMA发送

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//串口1发射 DMA使能

//使能

USART_Cmd(USART1, ENABLE);

}

 

void DMA_Config(void)

{

//特别注意,对于STM32F030F4P6,USART1_TX对应通道2,注意看数据手册

DMA_DeInit(DMA1_Channel2);

DMA_InitTypeDef DMA_InitStructure;

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_TDR_Address;

DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)hellStr;

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;

DMA_InitStructure.DMA_BufferSize=5;

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_Normal;

DMA_InitStructure.DMA_Priority=DMA_Priority_High;

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;

DMA_Init(DMA1_Channel2,&DMA_InitStructure);

}

关键字:STM32  DMA  CooCox  IDE 引用地址:STM32入门学习之DMA(STM32F030F4P6基于CooCox IDE)

上一篇:关于STM32F0系列多路ADC单独采样数据相同问题的处理
下一篇:STM32入门学习之ADC(STM32F030F4P6基于CooCox IDE)

推荐阅读最新更新时间:2024-11-17 13:20

STM32 USB学习笔记2
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library STM32Cube库中提供了一些有关USB的例程,在其工程目录下的Applications目录中,这里打开STM3210E_EVAL目录,可以看到如下例程: 这里选取一个简单的例子CDC_Standalone,为一个USB通信例程,具体实现是一个USB转串口的功能,相当于USB串口线。把示例里面的inc和src目录下的文件拷贝到新建工程中,这里是把跟usb通信相关的文件放到了vcp目录下。文件目录结构如下: 其中B
[单片机]
<font color='red'>STM32</font> USB学习笔记2
stm32专题二:GPIO输入—按键检测
新建板级支持包bsp_key.c和bsp_key.h GPIO输入配置过程: 定义初始化结构体; 开启RCC时钟,非常重要; 写入引脚和模式配置,不需要配置速度; 调用初始化函数,将初始化结构体写入对应的GPIO端口。 bsp_key.c包含两个函数,一个是初始化函数,另一个是按键扫描函数,会按键被按下时,返回按键的状态。 bsp_key.c #include bsp_key.h /** * @brief 按键初始化函数 */ void KEY_GPIO_Config(void) { // 定义GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStruct; // 开
[单片机]
stm32编码器的接口模式
编码器是什么玩意呢,它可是一个好玩的东西,做小车测速必不可少的玩意,下面,我将从编码器的原理讲起,一直到用stm32的编码器接口模式,测出电机转速与方向。 1.编码器 图1 编码器示意图 图1为编码器的示意图,中间是一个带光栅的码盘,光通过光栅,接收管接收到高电平,没通过,接收到低电平。电机旋转一圈,码盘上有多少光栅,接受管就会接收多少个高电平。371电机中的码盘就是这样的,他是334线码盘,具有较高的测速精度,也就是电机转一圈输出334个脉冲,芯片上已集成了脉冲整形触发电路,输出的是矩形波,直接接单片机IO就OK。 增量式旋转编码器通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移
[单片机]
<font color='red'>stm32</font>编码器的接口模式
STM32 LibUsbDotNet 开发CDC记录
1,一定要注意端点是分方向的,在ST的USB库中使用类似如下方式来表示端点。 第7bit为1,0x80表示IN端点。为0表示OUT端点。 这里千万不要看到IN OUT 端点都是EP1就认为EP1是一个双向端点。按照USB规范,只有EP0是双向端点,其他都只能是单向端点,所以实际上,如下表示是两个不同的端点,这里千万不要混淆了。 #define CDC_IN_EP 0x81 /* EP1 for data IN */ #define CDC_OUT_EP 0x01 /* EP1 for data OUT */ 2,LibUsbDotNet在调用Read Wri
[单片机]
STM32 ADC多通道 关键代码
做了个上位机 #========================================================== define ADC1_DR_Address ((u32)0x4001244C) vu16 AD_Value ; ============================================================== 关键代码 void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Indepe
[单片机]
<font color='red'>STM32</font> ADC多通道 关键代码
STM32单片机Bootloader的实现
之前一篇的文章中,主要介绍了STM32的启动流程和内存主要空间的分配,这篇文章将在上一篇文章的基础上,来阐述一下STM32 Bootloader的实现。 STM32的内存划分 前面文章我们说了,STM32上电后会从0x08000000地址处开始运行,因此,如果我们想要使得STM32在上电之处直接进入进Bootloader,那么其内存的起始地址必须要从0x08000000处开始。这一步是由单片机的硬件所决定的,无法通过软件干预。 因此,在我们使用Keil软件设计STM32 Bootloader的时候,一定要在Keil的工程中设置这个地址,当然,如果你不设置也没关系,因为Keil默认就是将单片机的软件编译到此地址的。如图1
[单片机]
<font color='red'>STM32</font>单片机Bootloader的实现
STM32设计的嵌入式系统的智能控制网络终端方案
本文重点介绍基于STM32的智能嵌入式终端的网络控制功能的设计和实现。智能网络终端是实现智能化管理的嵌入式终端设备。通常具有安全门禁系统和自动化控制的基本功能。 1 通信实现方案 将嵌入式系统与Internet连接起来实现远距离信息获取和控制功能的本质是嵌入式系统本身能够实现TCP/IP网络通信协议。该协议的解决方案总体上可分为两大类。第一类是直接在嵌入式设备上实现TCP/IP,使之直接连上Internet。这实质上是由MCU及内部固化TCP/IP协议的芯片组成应用系统的核心,MCU可以直接拨号上网,这种方法的硬件电路相对简单,也不需要中间环节的支持。但是由于使用了TCP/IP协议芯片,因此需要大容量的程序存储器,而且要求MC
[单片机]
<font color='red'>STM32</font>设计的嵌入式系统的智能控制网络终端方案
STM32自学手册之GPIO
GPIO是STM32最常用的设备之一。STM32可以提供最多达80个双向IO口(视型号而定),他们分别分布在A-E五个端口中。每个端口有16个IO,每个IO口都可以承受最大为5V压降。通过GPIO的配置寄存器,我们可以把GPIO口配置成我们想要的工作模式,一共有如下8种模式: ● 浮空输入 ● 带上拉电阻的输入 ● 带下拉电阻的输入 ● 模拟输入 ● 开漏输出 ● 推挽输出 ● 复用推挽输出 ● 复用开漏输出 STM32的GPIO除了上述8种工作模式之外,还可以进行两种映射:外部中断映射和第二功能映射(也叫重映射)。当某个IO口映射为外部中断通道后,该IO口就成为一个外部中断源,我们可以在这个I
[单片机]
<font color='red'>STM32</font>自学手册之GPIO

推荐帖子

哎,msp430写红外解码不成功啊,又不知道问题出在哪,谁能指条明路啊,谢谢了
1红外解码子程序如下:a依次储存用户码、用户反码与键数据码、键数据反码2利用P1.7的下降沿触发中断,我写的注释蛮多的,应该很容易看清楚程序思路的3试过几次,就是不知道问题出在哪?先谢过了4定时器时钟选了8m,8分频以后,就是1m了,也就是说:计数一次的时间是1us#includemsp430x14x.h//数组a依次储存用户码、用户反码与键数据码、键数据反码unsignedchara;//a是8位的char型,与各位码的位数相同u
江汉大学南瓜 微控制器 MCU
我要为几天之后的电子设计大赛设计滤波器,频率比较高
论坛中的朋友们大家好,为了几天之后的电子设计大赛,我要设计一个矩形性质比较好的,较高频率的带通滤波器。老师提示我用L,C元件和集成运算放大器来设计,但是我接触到的资料都是RC有源滤波器,频率带宽等等条件不太满足,希望能得到各位的帮助。我要为几天之后的电子设计大赛设计滤波器,频率比较高参差放大器!它可以很好地满足所需。
张乡夫 模拟电子
bq34110无法烧写参数
电量计默认参数与实际电池参数不一致,需要通过bqstudio工具与调试器ev2400往电量计写入参数。目前readall是正常,能读取所有的寄存器参数,但是修改参数后执行writeall操作提示noparametermatchedaddress,尝试过点击unseal与unsealfullaccess,但是还是无法写入,写入时电量计处于充电状态。电量计是焊接在自己用得板子上,不是买的evm评估板来调试的,请问可能是什么原因导致参数无法写入bq34110无法烧写参数不
wenguang123361 电源技术
430学习总结
430单片机确实和51有些差别,低功耗模式非常适合当前的发展趋势。丰富的时钟选择,及内部和外部资源。都决定了它是一款难学,好用,方便的单片机。强大的功能又对它的稳定性提出了挑战通过自己的学习,以及这几天帮助同学解决其中的问题,我同时对430有了更加深入的认识,下面我也就对它简单做如下总结:430的学习中时钟是一个很重要的模块:首先有3个可选的时钟源.方便MCLK、SMCLK、ACLK的选择。对速度要求不同,选择不同的时钟可以降低功耗。减少不必要的开销。同时内部集成的很多模块丰富
Widic 微控制器 MCU
fpga快速系统原型设计权威指南--英文版
fpga快速系统原型设计权威指南--英文版markmark,看过别人翻译过其中几个章节 特权同学翻译过这本书 对的,好像是谢谢,英文版的,期待中文一看名字就是好书,顶楼主:time:thx
白丁 FPGA/CPLD
电机控制 - 步进电机概述
本帖最后由dontium于2015-1-2313:10编辑电机控制-步进电机概述步进电机是电机家族的“婴儿”,20世纪60年代早期才开始流行。最初构想是作为昂贵的位置控制应用中伺服电机的低成本替代产品,而新兴的计算机工业迅速将其采用到外设应用当中。步进电机的主要优势在于能提供开环位置控制,而成本只是需要反馈的伺服系统的几分之一。欲知更多精彩详情,请速速下载原文一探究竟~~~~电机控制-步进电机概述
德州仪器 模拟与混合信号
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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