OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11511|回复: 9

小女子的DMA进不了中断!特地发帖求助!

[复制链接]

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
939
金钱
939
注册时间
2011-12-16
在线时间
59 小时
发表于 2012-3-6 12:04:17 | 显示全部楼层 |阅读模式

 

#include "stm32f10x.h"
 
#define DAC_DHR12RD_Address      0x40007420     //DAC地址
 
DAC_InitTypeDef           DAC_InitStructure;
DMA_InitTypeDef           DMA_InitStructure;
TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
uint32_t LeftNum;
uint32_t ADC1_val0[10];
uint32_t ADC2_val0[10];
uint32_t ADC1_val90[10];
uint32_t ADC2_val90[10];
uint32_t x=0;
uint32_t Re_sum=0;
uint32_t Im_sum=0;
uint32_t Re_average=0;
float Im_average=0;
uint32_t Cap;
uint32_t L;
 
const uint16_t Sine12bit[64]={//正弦波生成
2047,2248,2447,2642,2831,3012,3185,3346,3495,3630,3750,3853,3939,4007,4056,4085,4095,
4085,4056,4007,3853,3750,3630,3495,3346,3185,3012,2831,2642,2447,2248,2047,1846,1647,
1452,1263,1082,909,748,599,464,344,241,155,87,38,9,0,9,38,87,155,241,344,464,599,748,
909,1082,1263,1452,1647,1846,2047
};
 
/* 函数声明 -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void ADC_Configuration(void);
void DAC_Configuration(void);
 
int main(void)
{
  int i;
  int Re[10],Im[10];                      
  RCC_Configuration();  
  GPIO_Configuration();
  USART_Configuration();
  NVIC_Configuration();
  DAC_Configuration();
  ADC_Configuration();
  while (1)
  {
   if(x==10)
   {
    x=0;
         for(i=0;i<10;i++)
         {
          Re=-(ADC1_val0)/(-ADC2_val0);       
         Im=(ADC1_val0*(-ADC2_val90)-ADC1_val90*(-ADC2_val0))/
          (ADC2_val0*ADC2_val0+ADC2_val90*ADC2_val90);
          Re_sum+=Re;
          Im_sum+=Im;
         }
    Re_average=(Re_sum/10);         
    Im_average=(float)(Im_sum/10);
    Cap=((uint32_t)((-(1/(0.0001/(2*3.14159265)/Im_average)))*1000000000));//整数pF,1pF~1000uF
    L=Im_average/(0.0001/(2*3.14159265));
 
    USART_SendData(USART1, Re_average%65536/256);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
    USART_SendData(USART1, Re_average%65536%256);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
 
    USART_SendData(USART1, 0xCC); //分隔符CCCC
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
    USART_SendData(USART1, 0xCC);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
//-------------------------------------------------------------------------------
    USART_SendData(USART1, Cap%1000000%65536/256);//电容共6位,高3位
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
    USART_SendData(USART1, Cap%1000000%65536%256);//电容低3位
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
    USART_SendData(USART1, 0xFF); //分隔符FFFF
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
    USART_SendData(USART1, 0xFF);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。                          
 
   }               
  }
}
 
 
void RCC_Configuration(void)
{
/////////DAC时钟////////////// 
  /* DMA2 时钟使能 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
  /* GPIOA Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  /* TIM2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 
//////////ADC1时钟和ADC2时钟//////////////
  /* ADCCLK = PCLK2/4 */
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);//PCLK2四分频后作为ADC时钟(72÷4=18M)
  /* ADC1和GPIOC时钟使能 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE);
 
//////串口时钟//////////       a
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
 
}
 
 
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /***串口初始化***/
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;      //USART1 Tx
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);            //A端口
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;      //USART1 Rx
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //输入浮空
  GPIO_Init(GPIOA, &GPIO_InitStructure);//A端口
  
  /* ADC初始化 PC.00 (ADC 通道10)、PC.01(ADC 通道11) 为模拟输入 -------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /***DAC初始化***//*** 将PA.4和PA.5配置成AIN模式 ***/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
 
void DAC_Configuration(void)
{
  /* TIM2 Configuration */
  /* Time base configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 225;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
  TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
  /* TIM2 TRGO selection */
  TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
  /* DAC channel1 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  /* DAC channel2 Configuration */
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);
  /* DMA2 channel4 configuration */
  DMA_DeInit(DMA2_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address; //外设基地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;//存储器基地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设是目标数据
  DMA_InitStructure.DMA_BufferSize = 64; //32个数据
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不变
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址加
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//字(32位)
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//字(32位)
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA工作在循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存到内存,禁止
  DMA_Init(DMA2_Channel3, &DMA_InitStructure); //DMA2的通道3,这个需要根据参考手册DMA2控制器的表60来确定,并不是随便写的!
  /* 使能 DMA2 通道3 */
  DMA_Cmd(DMA2_Channel3, ENABLE);
  /* 使能DAC通道1 PA.04 */
  DAC_Cmd(DAC_Channel_1, ENABLE);
  /* Enable DMA for DAC Channel2 */
  DAC_DMACmd(DAC_Channel_1, ENABLE);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2,ENABLE);
}
 
/***【中断!】用NVIC务必要添加 misc.c 文件***/
void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
 NVIC_InitStructure.NVIC_IRQChannel=DMA2_Channel3_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}
 
 
void ADC_Configuration(void)
{
  ADC_InitTypeDef ADC_InitStructure;//定义ADC结构体变量
  /* ADC1 configuration
------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式(非双ADC模式)
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;       //非扫描模式
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //非连续模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不用外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 1; //ADC通道数
  ADC_Init(ADC1,&ADC_InitStructure);     //ADC1按上面的设置开始初始化
  ADC_Init(ADC2,&ADC_InitStructure);     //ADC2按上面的设置开始初始化
 
  /* ADC1 规则通道10配置 */
  //设置规则通道组通道14的转换顺序和转换时间
  //参数1表示是第1个转换,ADC通道14的采样周期为55.5周期
  ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
  ADC_Cmd(ADC1,ENABLE);     //ADC1上电(即ADON=1)
  ADC_ResetCalibration(ADC1);//复位校准寄存器
  while(ADC_GetResetCalibrationStatus(ADC1));//复位校准寄存器结束
  ADC_StartCalibration(ADC1);                //开始校准
  while(ADC_GetCalibrationStatus(ADC1));     //校准结束 
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);    //软件启动转换
 
  /* ADC2 规则通道11配置 */
  //设置规则通道组通道11的转换顺序和转换时间
  //参数1表示是第1个转换,ADC通道11的采样周期为55.5周期
  ADC_RegularChannelConfig(ADC2,ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
  ADC_Cmd(ADC2,ENABLE);     //ADC1上电(即ADON=1)
  ADC_ResetCalibration(ADC2);//复位校准寄存器
  while(ADC_GetResetCalibrationStatus(ADC2));//复位校准寄存器结束
  ADC_StartCalibration(ADC2);                //开始校准
  while(ADC_GetCalibrationStatus(ADC2));     //校准结束 
  ADC_SoftwareStartConvCmd(ADC2,ENABLE);    //软件启动转换
}
 
 
 
 
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;//速率115200bps
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位8位
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
  USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
  USART_Init(USART1, &USART_InitStructure); //配置串口1参数 
  USART_Cmd(USART1, ENABLE);//使能 USART1  
}
////////////////////////////////////////////
STM32F10X_IT.C
extern uint32_t LeftNum;
extern uint32_t ADC1_val0[10];
extern uint32_t ADC2_val0[10];
extern uint32_t ADC1_val90[10];
extern uint32_t ADC2_val90[10];
extern uint32_t x;
void DMA2_Channel3_IRQHandler(void)
{    
    x++; 
    LeftNum=DMA_GetCurrDataCounter(DMA2_Channel3);//返回当前DMA通道x剩余的待传输数据数目     
    if(LeftNum==63) 
    {     
 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动AD转换  
 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束  
 ADC1_val0[x]=ADC_GetConversionValue(ADC1); //读取转换结果    
 ADC_SoftwareStartConvCmd(ADC2,ENABLE); //启动AD转换  
 while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC)); //等待转换结束  
 ADC2_val0[x]=ADC_GetConversionValue(ADC2); //读取转换结果 
    }  if(LeftNum==47) 
    {   
 x++;  
 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动AD转换  
 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束  
 ADC1_val90[x]=ADC_GetConversionValue(ADC1); //读取转换结果    
 ADC_SoftwareStartConvCmd(ADC2,ENABLE); //启动AD转换  
 while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC)); //等待转换结束  
 ADC2_val90[x]=ADC_GetConversionValue(ADC2); //读取转换结果 
     }
}
 
 

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-6 13:40:44 | 显示全部楼层
软件仿真看看.
观察一下寄存器是否正确.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-10-16
在线时间
31 小时
发表于 2012-3-6 21:54:42 | 显示全部楼层
是不是女的 啊  不要为了博得同情而装女人啊!!!!!!!!!!
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-8 13:06:43 | 显示全部楼层
楼主是女的?
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-3-8 21:29:02 | 显示全部楼层
楼开始歪了,希望下面的扶好,女工程师不简单啊。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2012-3-8 23:19:48 | 显示全部楼层
回复【5楼】zenghi:
---------------------------------
帮你扶正,男女欢迎,呵呵。我公司里就有女的软件工程师。其实我们一些IC VENDOR也有蛮多女工程师的。其实这个行业男女都能正常学,也都能学好。之所以女的从事这方面的工作相对少,是因为大多数女生对这方面的工作不是很感兴趣。希望能帮你扶正哈…………
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-9 07:40:58 | 显示全部楼层
回复【6楼】螃蟹爱虫:
---------------------------------
同意螃蟹,就像很多人认为会计适合女人做,但我是男人,我会计也很牛比。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-9 07:42:24 | 显示全部楼层
楼主,感兴趣可以玩玩我的PDA:http://www.openedv.com/posts/list/2754.htm
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

98

主题

253

帖子

1

精华

高级会员

Rank: 4

积分
939
金钱
939
注册时间
2011-12-16
在线时间
59 小时
 楼主| 发表于 2012-3-9 11:22:01 | 显示全部楼层
回复【8楼】Tardis:
---------------------------------
太牛逼了!!!楼主花了多久做出来的?
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-3-9 12:41:29 | 显示全部楼层
回复【9楼】kexuexyz:
---------------------------------
你说的是我那个PDA吗?用了两个月左右吧 其实不牛,这作品还没做完,没用系统的说。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 16:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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