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.zip (2.03 MB, 下载次数: 31) 


from: http://www.51hei.com/bbs/dpj-84144-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值