找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7736|回复: 3
打印 上一主题 下一主题
收起左侧

STM32 DMA传输 中断方式配置 源代码

[复制链接]
跳转到指定楼层
楼主


stm32单片机源程序:
  1. #include "pbdata.h"

  2. void RCC_Configuration(void);
  3. void GPIO_Configuration(void);
  4. void NVIC_Configuration(void);
  5. void USART_Configuration(void);
  6. void ADC_Configuration(void);
  7. void DMA_Configuration(void);

  8. u16 ADCData[50];
  9. u8 ADC_Ok=0;
  10. int fputc(int ch,FILE *f)
  11. {
  12.         USART_SendData(USART1,(u8)ch);
  13.         while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
  14.         return ch;
  15. }

  16. int main(void)
  17. {
  18.    u32 ad=0;
  19.    u8 i=0;

  20.    RCC_Configuration();        //系统时钟初始化
  21.    GPIO_Configuration();//端口初始化
  22.    USART_Configuration();
  23.    NVIC_Configuration();
  24.    ADC_Configuration();
  25.    DMA_Configuration();
  26.         
  27.    while(1)
  28.    {                        
  29.                 ad=0;        
  30.                 if(ADC_Ok==1)        //通道一传输完成否?
  31.                         {
  32.                                 ADC_Ok=0;
  33.                                 for(i=0;i<50;i++)
  34.                                 {
  35.                                         ad=ad+ADCData[i];
  36.                                 }

  37.                                 ad=ad/50;

  38.                                 printf("ad =%f\r\n",3.3/4095*ad);//实际电压值
  39.                                 delay_ms(1000);
  40.                         }  
  41.    }        
  42. }

  43. void RCC_Configuration(void)
  44. {
  45.    SystemInit();//72m
  46.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  47.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  48.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  49.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  50.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);        
  51.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M  最大14M
  52.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
  53. }

  54. void GPIO_Configuration(void)
  55. {
  56.     GPIO_InitTypeDef GPIO_InitStructure;        
  57.         //LED
  58.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX
  59.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  60.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  61.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  62.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX
  63.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  64.         GPIO_Init(GPIOA,&GPIO_InitStructure);

  65.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//AD
  66.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
  67.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  68. }

  69. void NVIC_Configuration(void)
  70. {
  71.            NVIC_InitTypeDef NVIC_InitStructure;

  72.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  73.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  74.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  75.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  76.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  77.         NVIC_Init(&NVIC_InitStructure);
  78.         
  79.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  80.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  81.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  82.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  83.         NVIC_Init(&NVIC_InitStructure);
  84. }

  85. void USART_Configuration(void)
  86. {
  87.     USART_InitTypeDef  USART_InitStructure;

  88.         USART_InitStructure.USART_BaudRate=9600;
  89.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  90.         USART_InitStructure.USART_StopBits=USART_StopBits_1;
  91.         USART_InitStructure.USART_Parity=USART_Parity_No;
  92.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  93.         USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

  94.         USART_Init(USART1,&USART_InitStructure);
  95.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  96.         USART_Cmd(USART1,ENABLE);
  97.         USART_ClearFlag(USART1,USART_FLAG_TC);
  98. }

  99. void ADC_Configuration(void)
  100. {
  101.         ADC_InitTypeDef ADC_InitStructure;

  102.         ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
  103.         ADC_InitStructure.ADC_ScanConvMode=DISABLE;
  104.         ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//////////////////////////////
  105.         ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
  106.         ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
  107.         ADC_InitStructure.ADC_NbrOfChannel=1;

  108.         ADC_Init(ADC1,&ADC_InitStructure);

  109.         ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_239Cycles5);

  110.         ADC_DMACmd(ADC1,ENABLE);//重要
  111.         
  112.         ADC_Cmd(ADC1,ENABLE);


  113.         ADC_ResetCalibration(ADC1);
  114.         while(ADC_GetResetCalibrationStatus(ADC1));

  115.         ADC_StartCalibration(ADC1);
  116.         while(ADC_GetCalibrationStatus(ADC1));

  117.         ADC_SoftwareStartConvCmd(ADC1,ENABLE);

  118. }

  119. void DMA_Configuration(void)
  120. {
  121.         DMA_InitTypeDef DMA_InitStructure;

  122.         DMA_DeInit(DMA1_Channel1);        //通道一连接ADC1        

  123.         DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR; //外设地址,源地址
  124.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADCData;                        //目标地址

  125.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;                        //外设作为数据的来源
  126.         DMA_InitStructure.DMA_BufferSize=50;                                                        //和数组大小一样大

  127.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;        //ADC->DR地址是固定的         外设存储地址不变
  128.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;                //数组地址递增的                        内存的地址是递增的

  129.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;        //外设的数据宽度 16位的
  130.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;                                //内存的数据宽度=外设的数据宽度

  131.         DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                //工作模式:连续的,让DMA不断的采集
  132.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;        //优先级:高
  133.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                        //外设到内存



  134. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

完整代码下载:
中断方法DMA.7z (186.66 KB, 下载次数: 301)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:360024 发表于 2018-6-27 10:22 | 只看该作者
感谢作者
回复

使用道具 举报

板凳
ID:249942 发表于 2019-1-3 18:59 | 只看该作者
DMA的中断具体的工作是什么呢?或者说有什么工作是非要在DMA中断里面执行的呢?还有一个问题就是DMA的中断什么时候进入?
回复

使用道具 举报

地板
ID:605886 发表于 2019-8-31 19:04 | 只看该作者
感谢分享,感谢作者,拿来学一学
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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