php开发外设,DMA可以从外设到外设吗?

本文介绍了如何在STM32F103微控制器上配置USART2通过DMA与TIM2和TIM3协同工作,实现每秒通过USART2发送一个字符。通过设置TIM2作为主定时器,TIM3为从定时器,利用DMA在TIM2溢出时将TIM3的计数值传输到USART2的数据寄存器,从而达到定时发送数据的目的。
摘要由CSDN通过智能技术生成

呃实际上这个是可以的啊。

和外设到内存是一样的设置,但目标地址写外设寄存器。

这段程序是在 F103 上设置 USART2 在 PA2 脚做 Tx;TIM2 每秒溢出一次,级联 TIM3(TIM3每秒向上计数一次),同时 TIM2 溢出时触发 DMA1 从 TIM3->CNT 到 USART2->DR 传输一个字节。

我是在 Nucleo 上做的,连电脑可以看到每秒收到一个字符。

9ab0d145981181eb4d24efc18bb23a49.gif

DMA.png (31.55 KB, 下载次数: 1)

2016-8-17 14:57 上传

[mw_shl_code=cpp,true]#include "stm32f10x.h"

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

DMA_InitTypeDef DMA_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

int main (void)

{

/* System clocks configuration ---------------------------------------------*/

/* TIM2, TIM3 and USART2 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_USART2, ENABLE);

/* GPIOA clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* Enable DMA1 clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Configure USART2 Tx as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART2 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Transmit enabled

*/

USART_InitStructure.USART_BaudRate = 115200;

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

USART_Init(USART2, &USART_InitStructure);

/* Enable the USART2 */

USART_Cmd(USART2, ENABLE);

/* TIM2 is configured as Master Timer:

- The TIM2 Update event is used as Trigger Output

TIM3 is slave for TIM2,

- The ITR1(TIM2) is used as input trigger

- Gated mode is used, so start and stop of slave counter are

controlled by the Master trigger output signal(TIM2 update event).

*/

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = SystemCoreClock / 5000;

TIM_TimeBaseStructure.TIM_Prescaler = 5000;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 'z';

TIM_TimeBaseStructure.TIM_Prescaler = 0;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

/* Select the Master Slave Mode */

TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

/* Master Mode selection */

TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

/* Slave Mode selection: TIM3 */

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);

TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);

/* TIM2 Update DMA Request enable */

TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);

/* TIM enable counter */

TIM_SetCounter(TIM3, ' ');

TIM_Cmd(TIM3, ENABLE);

TIM_Cmd(TIM2, ENABLE);

/* DMA1 channel1 configuration ----------------------------------------------*/

DMA_DeInit(DMA1_Channel2);

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(TIM3->CNT);

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&(USART2->DR);

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize = 1;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

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_Channel2, &DMA_InitStructure);

/* Enable DMA1 channel1 */

DMA_Cmd(DMA1_Channel2, ENABLE);

while(1);

}[/mw_shl_code]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值