0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM8L051F3的DMA相关知识

汽车电子技术 来源:物联网IoT开发 作者:光神 2023-02-14 09:42 次阅读

本文介绍STM8L051F3的DMA相关知识。内容分为以下几部分:

  • DMA简介
  • DMA传输ADC数据

DMA(Direct memory access):直接内存存储。DMA可以提高外设和内存以及内存到内存直接的传输速率,数据能不经过CPU任何的参与快速地移动,这样可以节省CPU去处理其他事情。以STM8L051F3为例,它的DMA控制器一共有4个人通道,每个通道专门用于从一个或多个外设内存访问请求,它也能仲裁DMA请求的优先级。DMA的主要特点如下:

  • 4个通道在多个外设之间共享
  • 数据传输可以从外设到内存、内存到外设、内存到内存
  • 硬件/软件可以根据每个通道的优先级进行仲裁
  • 编程传输数据量:最多达255个数据块(字节或字)
  • 递增和递减寻址模式
  • 可硬件和软件编程通道优先级
  • 在半发送和发送结束可选择中断
  • 可软件编程发送数据大小:8位或16位
  • 通道请求直接的优先级:可软件编程(非常高、高、中、低)或在相同的情况下硬件可编程
  • 软件触发器也支持内存通道,取决于硬件配置
  • 两个标志位(DMA半传输,DMA传输完成)对每个通道的单个中断请求进行逻辑上的或
  • 循环缓冲区管理(自动装载模式)
  • 挂起和重新开始DMA发送能力
  • 运行在低功耗模式能力(WFI或WFE)

DMA模块的框图如下:

图片

DMA传输。一个事件之后,外设发送一个请求信号到DMA控制器,DMA控制器根据通道的优先级来对请求进行处理,一旦DMA控制器访问外设,DMA控制器就会发送一个应答给外设,如果外设没有其他等待的请求,得到DMA控制器的应答后就会释放它的请求信号。

DMA通道。4个通道:3个普通通道(通道0、通道1、通道2)和一个内存通道(通道3)。普通通道处理位于固定地址的外设寄存器和一个自动递增/递减指针指向的内存地址范围之间的数据传输。内存通道也是一个普通通道,但是它可以处理两个内存指针指向的内存地址之间的数据传输。

可编程的数据大小。发送的数据大小(8位或16位)可以通过DMA_CXSPR寄存器的TSIZE位来控制(当运行在16位模式是,系统处理字节存储地址在递增或递减模式,目标和源指针必须包含MSB地址)。配置成16位模式,传输由4个连续的8位读写操作:

  • 从源数据的偶地址读取MSB
  • 从源数据的奇地址读取LSB
  • 往目标的偶地址写入MSB数据
  • 往目标的奇地址写入LSB数据

为了保证数据的连贯性,两个读操作和两个写操作是不可分割的。

指针增量。在内存到外设或外设到内存传输期间,每次传输后内存指针会自动地递增或递减,这取决于DMA_CXCR寄存器的MINCDEC位,而外设的地址是固定的。

通道配置步骤。可根据以下步骤配置DMA的通道x(x为通道号):

1)在DMA_CXPARL/H寄存器设置外设寄存器地址

2)在DMA_CXPARH/L和DMA_CXM0ARH/L寄存器设置内存地址

3)在DMA_CXNDTR寄存器配置发送数据的数量

4)在DMA_CXSPR寄存器的PL[1:0]位配置通道优先级

5)在DMA_CXCR寄存器配置数据传输方向、循环模式、内存递增/递减模式、发送数据大小、在半传输或传输完成中断等

6)在DMA_CXCR寄存器设置EN位激活通道

7)在所有通道配置完成后,配置DMA_GCSR寄存器GEN位使能DMA

其他的循环模式、内存到内存模式、DMA传输暂停、等相关的详细说明可以参考官方手册RM0031的第13章内容。DMA1(STM8L051F3的DMA外设是DMA1)通道请求映射如下:

图片

2、 DMA传输ADC数据

2.1 DMA配置

本小节介绍通过ADC采集电压数据,通过DMA把数据转送到内存,然后设置TIM3_CH1(接的是PB1,也就是LED1)为PWM1模式,再通过DMA把内存中ADC的数据传送到TIM3的CCR1寄存器上,实现根据ADC采集电压的变化来控制LED1的亮度。

实验的过程可以理解为:外设--DMA--内存--DMA--外设。实验使用三个外设功能:

  • ADC1--配置ADC1_CH22,连续转换模式,12位分辨率,使用DMA通道1(外设到内存)
  • TIM3--配置TIM3_CH1为PWM1模式,使用通道0(内存到外设)
  • DMA--配置通道0与通道1的模式、参数以及使能

使用的例程:STM8L051F3_12_DMA,ADC的配置步骤如下:

1)使能ADC1外设时钟

2)初始化ADC1通道22(PD0)IO口为浮空输入模式

3)初始化ADC1:连续转换模式,12位分辨率,ADC时钟2分频

4)配置ADC低速通道,采样周期384

5)使能ADC1

6)使能ADC1通道22

DMA的配置步骤如下(包括ADC-->内存与内存-->TIM3):

1)使能DMA1外设时钟

2)映射ADC1到DMA通道1

3)DMA初始化:通道1、内存地址BUFFER_ADDRESS、外设地址ADC1_DR_ADDRESS、数据大小BUFFER_SIZE、传输方向外设到内存、DMA模式循环、内存增长模式增长、DMA优先级高、内存数据大小半字

4)DMA初始化:通道0、内存地址BUFFER_ADDRESS、外设地址TIM3_CCR1_ADDRESS、数据大小BUFFER_SIZE、传输方向内存到外设、DMA模式循环、内存增长模式增长、DMA优先级高、内存数据大小半字

5)使能DMA1通道1

6)使能DMA1通道0

7)使能DMA1

TIM3配置(配置TIM3_CH1为PWM输出)步骤如下:

1)使TIM3外设时钟

2)TIM3基本配置:时钟分频1、向上计数、周期0xFFF

3)配置TIM3的通道1作为PWM输出

4)使能TIM3

5)配置TIM3_CH1(PB1)的GPIO

6)使能TIM3通道1的PWM输出

2.2 例程介绍

所有的函数实现都在main.c文件中,ADC配置函数如下:

static void ADC_Config ( void**)**

{

/* 使能 ADC1 时钟 */

CLK_PeripheralClockConfig ( CLK_Peripheral_ADC1**,** ENABLE**);**

//配置ADC1通道22的IO口为浮空输入模式

GPIO_Init ( GPIOD**,** GPIO_Pin_0**,** GPIO_Mode_In_FL_No_IT**);**

/* 初始化 ADC1 连续转换,12位分辨率, ADC时钟分频2 */

ADC_Init ( ADC1**,** ADC_ConversionMode_Continuous**,** ADC_Resolution_12Bit**,** ADC_Prescaler_2**);**

/* 配置ADC1 低速通道, 采样周期384 */

ADC_SamplingTimeConfig ( ADC1**,** ADC_Group_SlowChannels**,** ADC_SamplingTime_384Cycles**);**

/* 使能 ADC1 */

ADC_Cmd ( ADC1**,** ENABLE**);**

/* 使能ADC1通道22 */

ADC_ChannelCmd ( ADC1**,** ADC_Channel_22**,** ENABLE**);** /* connected to potentiometer */

}

TIM3的配置函数如下:

static void TIM3_Config ( void**)**

{

/* 使能 TIM3 时钟 */

CLK_PeripheralClockConfig ( CLK_Peripheral_TIM3**,** ENABLE**);**

/* TIM3基本配置:时钟分频:1,向上计数,周期:0xfff */

TIM3_TimeBaseInit ( TIM3_Prescaler_1**,** TIM3_CounterMode_Up**,** 0xFFF**);**

/* 配置TIM3_CH1作为PWM输出 */

TIM3_OC1Init ( TIM3_OCMode_PWM1**,** TIM3_OutputState_Enable**,**

0x7FF**,** TIM3_OCPolarity_Low**,**

           TIM3_OCIdleState_Set**);**

/* 使能 TIM3 */

TIM3_Cmd ( ENABLE**);**

/* 配置TIM3_CH1的GPIO (PD2)*/

GPIO_Init ( GPIOB**,** GPIO_Pin_1 , GPIO_Mode_Out_PP_Low_Fast**);**

/* 使能TIM3的PWM输出*/

TIM3_CtrlPWMOutputs ( ENABLE**);**

}

DMA配置函数如下:

static void DMA_Config ( void**)**

{

/* 使能 DMA1 时钟 */

CLK_PeripheralClockConfig ( CLK_Peripheral_DMA1**,** ENABLE**);**

/* 连接ADC1到DMA1通道1 */

SYSCFG_REMAPDMAChannelConfig ( REMAP_DMA1Channel_ADC1ToChannel1**);**

//*初始化DMA1通道1, 内存地址:BUFFER_ADDRESS,外设地址:ADC1_DR_ADDRESS,

//数据大小:BUFFER_SIZE,传输方向:外设到内存,DMA模式:循环,内存地址模式:增长,

//DMA优先级:高,内存数据大小:半字

DMA_Init ( DMA1_Channel1**,** BUFFER_ADDRESS**,** ADC1_DR_ADDRESS**,** BUFFER_SIZE**,** DMA_DIR_PeripheralToMemory**,**

DMA_Mode_Circular**,** DMA_MemoryIncMode_Inc**,** DMA_Priority_High**,**  DMA_MemoryDataSize_HalfWord**);**

// 初始化DMA1通道0, 内存地址:BUFFER_ADDRESS,外设地址:ADC1_DR_ADDRESS,

//数据大小:BUFFER_SIZE,传输方向:内存到外设,DMA模式:循环,内存地址模式:增长,

//DMA优先级:高,内存数据大小:半字

DMA_Init ( DMA1_Channel0**,** BUFFER_ADDRESS**,** TIM3_CCR1_ADDRESS**,** BUFFER_SIZE**,** DMA_DIR_MemoryToPeripheral**,**

DMA_Mode_Circular**,** DMA_MemoryIncMode_Inc**,** DMA_Priority_High**,** DMA_MemoryDataSize_HalfWord**);**

/* 使能DMA1通道1 */

DMA_Cmd ( DMA1_Channel1**,** ENABLE**);**

/* 使能DMA1通道0 */

DMA_Cmd ( DMA1_Channel0**,** ENABLE**);**

/* DMA1 使能 */

DMA_GlobalCmd ( ENABLE**);**

}

DMA配置相关的地址定义如下:

//定义内存与外设的地址,用于DMA传输

#define ADC1_DR_ADDRESS ((uint16_t)(ADC1_BASE + 0x04))

#define TIM3_CCR1_ADDRESS ((uint16_t)(TIM3_BASE + 0x11))

#define BUFFER_SIZE ((uint8_t) 0x01)

#define BUFFER_ADDRESS ((uint16_t)(&Buffer))

uint16_t Buffer = 0**;** //定义变量保存DMA数据,作为DMA传输内存地址

主函数如下:

void main ( void**)**

{

ADC_Config**();** //ADC配置

DMA_Config**();** //DMA配置

TIM3_Config (); //TIM3配置

/* 使能 ADC1 DMA 请求*/

ADC_DMACmd ( ADC1**,** ENABLE**);**

/* 使能 TIM1 DMA 请求*/

TIM3_DMACmd ( TIM3_DMASource_Update**,** ENABLE**);**

/* 起始ADC1转换*/

ADC_SoftwareStartConv ( ADC1**);**

while ( 1**)**

{

;

}

}

使用ST-LINK把程序下载到开发板,ADC1_CH22(PD0)采样电压越高LED1越亮,检测的测试方法:把PD0口接板子的GND,LED1灭;接板子的VCC,LED1亮(如果把PD0接电位器,那么LED1的亮度可以由电位器调节)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10412

    浏览量

    206467
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    98971
  • stm8l051f3
    +关注

    关注

    0

    文章

    4

    浏览量

    2206
收藏 人收藏

    评论

    相关推荐

    分享一下最近用的stm8l051f3库函数及数据手册

    最近在用STM8所以分享一下最近用的stm8l051f3库函数及数据手册
    发表于 08-03 13:02

    STM8L051F3的例程

    一定是STM8L051F3的例程,要直接操作寄存器的例程,有时钟、I/O的配置就可以了
    发表于 02-24 13:36

    可以用STM8L051F3的定时器2创建1 us周期吗?

    你好,我想用STM8L051F3的定时器2制作1个周期。目前我检查1毫秒是正确的,如果尝试使用1毫秒(如100美元或10美元),期间不正确....我用GPIO(LED)测量了这段时间......请
    发表于 11-07 09:57

    stm8l051f3可以做浮动操作?

    你好,我有一个问题是stm8L051F3是否可以执行/计算浮动操作,请帮忙告诉我,目前我无法用printf函数检查它,因为如果使用带有工具选项的库,我的大小超过错误,例子:float
    发表于 11-19 10:36

    STM8L051F3制作电路板无法控制任何与LED相关的端口

    嗨,我需要你的帮助才能找出问题的根本原因,请帮助检查问题,感谢您的支持,谢谢。问题,在尝试启动新板时,我们无法控制任何与LED相关的端口。芯片是STM8L051F3,与STVP,IAR嵌入式工作台
    发表于 12-26 16:26

    如何以最低功率运行STM8L051F3?我可以举个例子吗?

    我在用STM8L051F3为我的项目。我的项目使用10个LED,Timer2和1个输入引脚。从1针输入后,我将在LED 1上通过1.系统由电池供电,因此运行时电流应该最小。不使用睡眠,停止如何以最低
    发表于 05-27 15:06

    如何用STM8L051F3来开启/关闭微控制器?

    我们使用的是STM8L051F3,它有2个输入,这是我们用于我们应用的2键键盘。现在我想用那个键盘来开启/关闭微控制器。我怎么能这样做?我想在按下键盘按键时打开控制器电源,然后我也会将这些按键用于
    发表于 07-01 07:16

    怎样去新建一种STM8L051F3工程

    注意:stm8系列教程原创作者是我师兄:光光本文介绍基于IAR For STM8+ STM8L15x-16x-05x-AL31-L_StdPeriph_Lib(官方固件库)来新建STM8L05
    发表于 12-10 06:40

    为什么STM8L051/101F3开发板配置串口UART时其接收中断始终无法进入

    ,几乎排查所有可能的问题点。STM8L051/101F3开发板代码我这里的MCU是STM8L051F3,使用的STM8库开发,代码如下仅供参考:main.c#include "...
    发表于 02-21 06:34

    STM8L051F3串口接收中断超时判断数据结束相关资料分享

    目标:实现由PC的串口调试软件发一串任意长(小于512字节)的数据给STM8L051F3串口,然后STM8L051F3串口全部返回给PC串口调试软件.所需软件: XCOM V2.2串口调试助手
    发表于 02-21 07:19

    介绍STM8L051F3 PWR的低功耗模式与应用

    本章介绍STM8L051F3的PWR相关知识,并重点介绍它的低功耗模式与应用。内容分为以下几部分:低功耗模式介绍WFI模式应用1、低功耗模式介绍STM8L系列就是STM
    发表于 02-23 07:38

    STM8L051F3单片机用什么软件做开发?KEIL可以吗?

    STM8L051F3用什么软件做开发?KEIL可以吗?
    发表于 09-27 06:04

    STM8L051F3 STM8L151x2/x3 Errata

    STM8L051F3 STM8L151x2/x3 Errata sheet STM8L051F3 STM8L151x2 and STM8L151x3 revision Z device limitations
    发表于 03-20 10:27 35次下载

    STM8L051F3的TIM2相关知识

    本文主要介绍STM8L051F3的TIM4,TIM4是基本定时器,由一个8位的自动重装载的向上计数器和一个可编程预分频器组成,功能简单,一般用于基本计时,定时器溢出时可产生一个定时器溢出中断
    的头像 发表于 02-14 09:36 714次阅读
    <b class='flag-5'>STM8L051F3</b>的TIM2<b class='flag-5'>相关</b><b class='flag-5'>知识</b>

    STM8L051F3的ADC相关知识

    ADC(Analog-to-Digital Converter):模拟-数字转换,就是把模拟信号转换为数字信号。STM8L051F3的ADC可以执行在单次或连续模式
    发表于 02-14 09:38 1291次阅读
    <b class='flag-5'>STM8L051F3</b>的ADC<b class='flag-5'>相关</b><b class='flag-5'>知识</b>