智能车制作

 找回密码
 注册

扫一扫,访问微社区

STM32论坛
查看: 8313|回复: 4
打印 上一主题 下一主题

STM32F4演示例程之USART_DMA代码

[复制链接]

489

主题

1691

帖子

1

精华

管理员

网站创始人&站长

Rank: 11Rank: 11Rank: 11Rank: 11

积分
85932

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
56988
贡献
17374
兑换币
13144
注册时间
2007-6-8
在线时间
5785 小时
跳转到指定楼层
1#
发表于 2012-5-15 00:19:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/*********************************************
    标题:操作DMA的练习
    软件平台:IAR for ARM6.21
    硬件平台:stm32f4-discovery
    主频:168M

    描述:从其他设备接收数据,再把数据发送出去
          USART3接收中断,发射用DMA
    author:小船
    data:2012-02-03
**********************************************/

#include <stm32f4xx.h>

u8 USART_DMA_Completed;
u8 Rx_Completed;
u8 Rx_data_counter;
u8 usart3_buffer[100];

void USART3_DMA_config(void);
void USART3_config(void);

void main ()
{

  SCB->AIRCR = 0x05AF0000 | 0x400;  //中断优先级分组 抢占:响应=3:1

  RCC->AHB1ENR |= ( (1<<3) | (1<<21) ); //使能GPIOD时钟,使能DMA1时钟
  RCC->APB1ENR |= (1<<18);  //使能usart3时钟

  USART3_DMA_config();
  USART3_config();

  USART_DMA_Completed = 1;

  while(1)
  {  
    if(USART_DMA_Completed & Rx_Completed)  //之前数据已经发送完成,接收到新的数据
    {  
      DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3
      while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置     
      DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志      
      DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量
      if((USART3->SR & (1<<7))) //发送数据寄存器空
      {
        USART3->CR3 &= ~(1<<7);//除能usartdma发送
        USART_DMA_Completed = 0;
        DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量
        DMA1_Stream3->CR |= 1;//使能dma
        USART3->CR3 |= (1<<7);//使能usartdma发送
        Rx_Completed = 0;
        Rx_data_counter = 0;
      }
    }
  }
}

/****************************************
  函数名:USART3_DMA_config
  参数:无
  返回值:无
  功能:DMA1数据流3与usart3关联的相关配置
****************************************/
void USART3_DMA_config(void)
{
  DMA1_Stream3->CR &= 0xFFFFFFFE; //除能DMA1_Stream3
  while(DMA1_Stream3->CR & 0x00000001);//确保DMA可以被设置

  DMA1->LIFCR |= 0x0f800000;//传送前清空DMA1_Stream3所有中断标志

  DMA1_Stream3->PAR = (uint32_t)&USART3->DR;//设置外设地址USART3->DR地址0x40004804
  DMA1_Stream3->M0AR = (uint32_t)usart3_buffer; //设置内存地址
  DMA1_Stream3->NDTR = Rx_data_counter; //设置dma传输数据的数量
  //DMA1_Stream3->FCR |= 0x00000007;//设置fifo
  /*
    设置dma通道4,即usart3tx
    优先级Medium
    传输方向内存到外设
    内存递增模式
    传输完成中断使能
  */
  DMA1_Stream3->CR |= ( 0x08000000 |0x00010000 | (1<<6)
                        | (1<<10) | (1<<4) );

  USART3->CR3 &= ~(1<<7);//usart3 dma发送模式除能

  NVIC->IP[14] = 0xA0;
  NVIC->ISER[0] |= (1<<14);

}

/**************************
  函数名:USART3_config
  参数:无
  返回值:无
  功能:配置usart3
************************/
void USART3_config(void)
{
  USART3->BRR = 0x0000016C;   //波特率115200
  /*
   使能usart3
  usart3发送使能
  usart3接收使能
  接收缓冲区非空中断使能
  8bit
  一位停止位
  无校验
  */
  USART3->CR1 |= (( 1<<13 ) | ( 1<<3 ) | ( 1<<2 ) | ( 1<<5 ));

  GPIOD->AFR[1] |= 0x00000077;//选择PD8,9复用功能

  GPIOD->MODER &= 0xFFF0FFFF; //设置PD8,9,复用模式
  GPIOD->MODER |= 0x000A0000;

//  GPIOD->OTYPER &= 0xFFFFDFFF; //设置PD9推挽输出

  GPIOD->OSPEEDR &= 0xFFFCFFFF; //PD8速度50m
  GPIOD->OSPEEDR |= 0x00020000;

  GPIOD->PUPDR &= 0xFFFCFFFF; //PD8
  GPIOD->PUPDR |= 0x00010000;

  NVIC->IP[39] = 0xf0; //最低抢占优先级,最低响应优先级1111
  NVIC->ISER[1] |= (1<<(39-32)); //使能中断线39,也就是usart3中断
}


void USART3_IRQHandler(void)
{
  if(USART3->SR & (1<<5)) //接收数据寄存器非空
  {
    usart3_buffer[Rx_data_counter] = USART3->DR;
    Rx_data_counter++;
    if(usart3_buffer[Rx_data_counter - 1] == '\0')
    {
      USART3->CR1 &= ~(1<<5); //除能接收中断
      Rx_Completed = 1;
    }
   }
}

void DMA1_Stream3_IRQHandler(void)
{
  if(DMA1->LISR & 0x08000000)//DMA传输完成
  {
    USART_DMA_Completed = 1;
    USART3->CR1 |= 1<<5;  //使能usart3接收中断
    DMA1->LIFCR |= 0x08000000;//清除中断标志
  }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
2#
发表于 2012-5-15 00:43:46 | 只看该作者
l 我们也在弄 STM32F4 ,不过芯片太贵,官方的板子太便宜,影响到我们开发板的推出。

事实上,我们的例程都整理得差不多,开发板也测试得差不多了,还差教程还没写好……没问题的话,就会短时间内推出 STM32F4 开发板
回复 支持 反对

使用道具 举报

4

主题

239

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2113
威望
1263
贡献
242
兑换币
20
注册时间
2011-10-15
在线时间
304 小时
3#
发表于 2012-5-15 00:53:18 | 只看该作者
野火 发表于 2012-5-15 00:43
l 我们也在弄 STM32F4 ,不过芯片太贵,官方的板子太便宜,影响到我们开发 ...

竟然看到了野火!!!
回复 支持 反对

使用道具 举报

22

主题

1613

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6784
QQ
威望
2910
贡献
1540
兑换币
1579
注册时间
2012-3-17
在线时间
1167 小时
4#
发表于 2012-5-15 01:00:06 | 只看该作者
Goolloo 发表于 2012-5-15 00:53
竟然看到了野火!!!

你看不到我……你看不到我……
回复 支持 反对

使用道具 举报

20

主题

531

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3796
威望
1906
贡献
1056
兑换币
202
注册时间
2011-8-12
在线时间
417 小时
5#
发表于 2012-5-15 18:03:37 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 18:06 , Processed in 0.043626 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表