找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8520|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STM32 DMA傳輸 中斷方式配置 源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


stm32單片機(jī)源程序:
  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();        //系統(tǒng)時(shí)鐘初始化
  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);//實(shí)際電壓值
  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; //外設(shè)地址,源地址
  124.         DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADCData;                        //目標(biāo)地址

  125.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;                        //外設(shè)作為數(shù)據(jù)的來源
  126.         DMA_InitStructure.DMA_BufferSize=50;                                                        //和數(shù)組大小一樣大

  127.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;        //ADC->DR地址是固定的         外設(shè)存儲(chǔ)地址不變
  128.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;                //數(shù)組地址遞增的                        內(nèi)存的地址是遞增的

  129.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;        //外設(shè)的數(shù)據(jù)寬度 16位的
  130.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;                                //內(nèi)存的數(shù)據(jù)寬度=外設(shè)的數(shù)據(jù)寬度

  131.         DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;                //工作模式:連續(xù)的,讓DMA不斷的采集
  132.         DMA_InitStructure.DMA_Priority=DMA_Priority_High;        //優(yōu)先級(jí):高
  133.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;                        //外設(shè)到內(nèi)存



  134. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………

復(fù)制代碼

完整代碼下載:
中斷方法DMA.7z (186.66 KB, 下載次數(shù): 302)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:360024 發(fā)表于 2018-6-27 10:22 | 只看該作者
感謝作者
回復(fù)

使用道具 舉報(bào)

板凳
ID:249942 發(fā)表于 2019-1-3 18:59 | 只看該作者
DMA的中斷具體的工作是什么呢?或者說有什么工作是非要在DMA中斷里面執(zhí)行的呢?還有一個(gè)問題就是DMA的中斷什么時(shí)候進(jìn)入?
回復(fù)

使用道具 舉報(bào)

地板
ID:605886 發(fā)表于 2019-8-31 19:04 | 只看該作者
感謝分享,感謝作者,拿來學(xué)一學(xué)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表