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)

推荐阅读

STM32入门系列-开发工具keil5安装
主要介绍如下三部分内容:keil5软件获取keil5安装安装STM32芯片包软件获取可以通过搜索引擎搜索关键字“KEIL5下载”,找到其官方网站http://www.keil.com。我们这里使用MDK5.14版本,如果后面出了更高的版本选择性升级即可,不过也没有必要什么都追求最新的,这一个软件用着习惯就行。登录armkeil官方网站,网站首页有软件下载连接,在这里我们选择MDK-Arm。会让你先注册,注册完成之后就可以开始下载了。软件安装安装此软件时一定要注意以下几点:安装路径不能带中文,必须是英文路径。安装目录不能跟51的KEIL或者KEIL4冲突,三者目录必须分开。KEIL5的安装比起KEIL4多了一个步骤,必须添加芯片包,不
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-开发工具keil5安装
STM32入门系列-存储器与寄存介绍
介绍两部分内容:什么是存储器映射什么是寄存器及寄存器映射为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础。等明白了如何使用 C 语言封装底层寄存器,也就为后面学习库函数的开发做好了铺垫。什么是存储器映射程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。这就是我们曾提到过的被控总线的连接部分,而编程时就是操作这一块地方。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 STM32F103ZET6 数据手册中存储器映射图如下所示。从上图中可以看到 ARM 把这 4GB 的存储
发表于 2022-11-18
STM32入门系列-GPIO概念介绍
GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过 GPIO 最简单的应用还属点亮 LED 灯了,只需通过软件控制 GPIO 输出高低电平即可。当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。其中STM32F103xC、STM32F103xD和STM32F103xE有144个引脚的芯片如下图所示。那么是不是所有引脚都是 GPIO 呢?当然不是,STM32 引脚可以分为这么几大类:电源引脚:引脚图中的 VDD、V
发表于 2022-11-18
STM32入门系列-GPIO结构
已经了解了STM32 GPIO的基本概念及引脚分类。现在来看下STM32 GPIO内部的结构是怎样的。IO端口位的基本结构如下图所示。从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO结构图理解好,那么关于GPIO的各种应用模式将非常清楚。图中最右端I/O端口就是STM32芯片的引脚,其它部分都在STM32芯片内部。上图中我们将每部分都用红色数字标号了,按照顺序我们逐一讲解。保护二极管引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT或VDD时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管STM32芯片内部有
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-GPIO结构
STM32入门系列-创建寄存模板
介绍如何使用 KEIL5 软件创建寄存器模板, 方便之后使用寄存器方式来操作STM32开发板上的LED,让大家创建属于自己的寄存器工程模板。获取工程模板的基础文件首先我们在电脑任意位置创建一个文件夹,命名为“寄存器模板创建”,然后在其下面新建 2 个文件夹,如下:Obj 文件夹: 用于存放编译产生的 c/汇编/链接的列表清单、 调试信息、hex文件、预览信息、封装库等文件。User 文件夹: 用于存放用户编写的 main.c、 STM32F1 启动文件、stm32f10x.h头文件。我们需要将寄存器工程模板所需的基础文件 main.c、STM32F1 启动文件及stm32f10x.h 头文件放入到 User 文件夹内。在工程实例的U
发表于 2022-11-18
<font color='red'>STM32</font>入门系列-创建寄存<font color='red'>器</font>模板
STM32入门系列-使用C语言封装寄存
前面介绍了存储器映射、寄存器和寄存器映射,这些都是为了介绍使用 C语言封装寄存器做铺垫。这里我们通过一个实例来对 C 语言封装寄存器进行介绍。具体实例:控制 GPIOC 端口的第 0 管脚输出一个低电平。首先我们需要知道GPIOC 端口外设是挂接在哪个总线上的,然后根据总线基地址和本身的偏移地址得到 GPIOC 外设基地址,最后通过这个外设基地址得到里面各种寄存器基地址。总线和外设基地址封装根据寄存器的概念,我们可以使用 C 语言中的宏定义对寄存器进行定义。具体代码如下://定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义 APB2 总线基地址#define A
发表于 2022-11-18

推荐帖子

有人用过PADS9.5的HyperLynx做电路仿真 吗 ?
请问: 有人用过PADS9.5的HyperLynx做电路仿真吗?用着咋样? 谢谢! 有人用过PADS9.5的HyperLynx做电路仿真吗?
yhye2world 综合技术交流
高压电源
各位大侠我想问一下这个电路是否可行如果可行可以说一下原理么?高压电源
s285934675 电源技术
电感选型
手上有个不知名的电感,上面标识821NL16321.这是820nH吗?1632跟封装有关?要求选个封装差不多13mmX13mmX6.2mm(或者更小的)电感,电流20A以上,一体式电感 1.我该怎么选哪样的呢?自谐振频率怎么选? 饱和和温升电流选多大的。 2.有推荐型号吗 谢谢! 电感选型
大发明家 PCB设计
求购闲置飞思卡尔智能车s128最小系统、B型车模、摄像头
本帖最后由ddllxxrr于2016-1-716:29编辑有哪位前辈有意出售的吗?现在我们急需这些,为明年的比赛做准备,谢谢各位了,有闲置的也有意出售的请联系qq362313998,谢谢求购闲置飞思卡尔智能车s128最小系统、B型车模、摄像头
hh376158101 淘e淘
LPC43xx EMC的Buffer enabled问题
在使用LPC4357的EMC-CS0外接K9F1G08U0E这个NAND时。 如果在配置EMC的时候,启用了Bufferenable这个功能的话,即 将STATICCONFIG0-(StaticMemoryConfigurationregisters:0x40005200)寄存器的19bit 设置为1时。 这时,对NAND的操作就会存在问题。导致读出的数据错误。 需要在read/writenand的操作,始ALE/CLE和DATA的操作中都需要插入延时,才能保证读出的数
jplzl10000 NXP MCU
OLED测试&&坐等打样归来
这两天出差一个字就是累,年纪大了座几个小时的车感觉得晕一天。 总结一下这几天得工作,首先就是测试了一下I2C驱动了一个OLED屏,只是大概看了一下文档,之所以敢这样还是得感谢之前坛友总结的代码,再次感谢@ljj3166文链接http://bbs.eeworld.com.cn/thread-925896-1-1.html。所以这里我只放我的测试图片了,I2C的初始化、读写代码基本上就是复制过来的只不过改了一下不用的存储地址而已。 然后呢就是画了一块PCB顶板,尺寸和GD32F
908508455a GD32 MCU
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

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