OpenEdv-开源电子网

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

[阿波罗F429] 分享:阿波罗429的四路ADC和四路ADC+DMA

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-6-22 17:13:01 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-12-10 19:57 编辑

本程序可以串口显示和屏幕显示四路
1.阿波罗429 4路ADC+DMA实验.zip”:用的ADC1,操作的PA5,PA6,PA7,PC4
2.阿波罗429 四路ADC实验.zip:用的ADC1,操作的PA5,PA6,PA7,PC4
1)main.c
  1. #define N 4
  2. extern uint32_t ADC_ConvertedValue[4];
  3. extern u16  value[N];
  4. int main(void)
  5. {
  6.     u16 adcx;
  7.         float temp[6];
  8.         int i,k,j;
  9. //    Cache_Enable();                 //打开L1-Cache
  10.     HAL_Init();                                        //初始化HAL库
  11.     Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
  12.     delay_init(216);                //延时初始化
  13.         uart_init(115200);                        //串口初始化
  14.     LED_Init();                     //初始化LED
  15.     KEY_Init();                     //初始化按键
  16.     SDRAM_Init();                   //初始化SDRAM
  17.     LCD_Init();                     //LCD初始化
  18.     MY_ADC_Init();                  //初始化ADC1通道5
  19.     DMA_Config();
  20.         POINT_COLOR=RED;
  21.         LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");        
  22.         LCD_ShowString(30,70,200,16,16,"ADC TEST");        
  23.         LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  24.         LCD_ShowString(30,110,200,16,16,"2016/7/12");         
  25.         POINT_COLOR=BLUE;//设置字体为蓝色
  26.         LCD_ShowString(30,130,200,16,16,"ADC1_PA7_VAL:");
  27.         LCD_ShowString(30,150,200,16,16,"ADC1_PC4_VAL:");
  28.         LCD_ShowString(30,170,200,16,16,"ADC1_PA6_VAL:");
  29.         LCD_ShowString(30,190,200,16,16,"ADC1_PA5_VAL:");
  30.         LCD_ShowString(30,210,200,16,16,"ADC1_PA7_VOL:0.000V");        //先在固定位置显示小数点
  31.         LCD_ShowString(30,230,200,16,16,"ADC1_PC4_VOL:0.000V");        //先在固定位置显示小数点
  32.         LCD_ShowString(30,250,200,16,16,"ADC1_PA6_VOL:0.000V");        //先在固定位置显示小数点
  33.         LCD_ShowString(30,270,200,16,16,"ADC1_PA5_VOL:0.000V");        //先在固定位置显示小数点
  34.         while(1)
  35.         {                        
  36.                
  37.             for(j=0;j<4;j++)
  38.                         {
  39.                                 value[j] = (u16)(ADC_ConvertedValue[j]);
  40.                                 LCD_ShowxNum(134,130+20*j,value[j],4,16,0); //显示ADCC采样后的原始值
  41.                         }
  42.                   
  43.                         for(k=0; k<4; k++)
  44.                         {
  45.                                 temp[k]=(float)value[k]*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
  46.                                 adcx=temp[k];                            //赋值整数部分给adcx变量,因为adcx为u16整形
  47.                                 LCD_ShowxNum(134,210+20*k,adcx,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
  48.                                 temp[k]-=adcx;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
  49.                                 temp[k]*=1000;                           //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
  50.                                 LCD_ShowxNum(150,210+20*k,temp[k],3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
  51.                                 printf("\r\n 编号%d \t 编号%d \t AD值: %d\r\n", k,i, value[k]);
  52.                         }
  53.             delay_ms(500);
  54. //                        HAL_ADC_Stop_DMA(&ADC1_Handler);      //传输完成以后关闭串口DMA
  55.         }

  56. }
复制代码


2)adc.c
  1. #define M 8 //定义M
  2. #define N 4
  3. u16  value[N];
  4. //uint32_t ADC_ConvertedValueRead[4];


  5. ADC_HandleTypeDef ADC1_Handler;//ADC句柄
  6. //DMA_HandleTypeDef  ADC1TxDMA_Handler;      //DMA句柄


  7. //ADC底层驱动,引脚配置,时钟使能
  8. //此函数会被HAL_ADC_Init()调用
  9. //hadc:ADC句柄
  10. //初始化ADC
  11. void MY_ADC_Init(void)
  12. {
  13. //ADC1引脚配置
  14.     GPIO_InitTypeDef GPIO_Initure;
  15.         ADC_ChannelConfTypeDef ADC1_ChanConf;
  16.     __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
  17.     __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
  18.         __HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟
  19.         
  20.     GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_6;            //PA5
  21.     GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
  22.     GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
  23.     HAL_GPIO_Init(GPIOA,&GPIO_Initure);
  24.         
  25.         GPIO_Initure.Pin=GPIO_PIN_4; //|GPIO_PIN_5;
  26.     GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
  27.     GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
  28.     HAL_GPIO_Init(GPIOC,&GPIO_Initure);
  29. //ADC1功能配置        
  30.         ADC1_Handler.Instance=ADC1;
  31.     ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=108/4=27MHZ
  32.     ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
  33.     ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
  34.     ADC1_Handler.Init.ScanConvMode=ENABLE;                      //扫描模式
  35.     ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
  36.     ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //关闭连续转换
  37.     ADC1_Handler.Init.NbrOfConversion=4;                         //4个转换在规则序列中 也就是只转换规则序列1
  38.     ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
  39.     ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
  40.     ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
  41.     ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
  42.     ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //开启DMA请求
  43.         ADC1_Handler.DMA_Handle=&ADC1TxDMA_Handler;
  44.     HAL_ADC_Init(&ADC1_Handler);
  45. //采样通道、顺序配置
  46.     ADC1_ChanConf.Channel=ADC_CHANNEL_7;                                   //通道
  47.     ADC1_ChanConf.Rank=1;                                       //1个序列
  48.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
  49.     ADC1_ChanConf.Offset=0;                 
  50.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  51.         
  52.         ADC1_ChanConf.Channel=ADC_CHANNEL_14;                                   //通道
  53.     ADC1_ChanConf.Rank=2;                                       //1个序列
  54.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
  55.     ADC1_ChanConf.Offset=0;                 
  56.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  57.         
  58.         ADC1_ChanConf.Channel=ADC_CHANNEL_6;                                   //通道
  59.     ADC1_ChanConf.Rank=3;                                       //1个序列
  60.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
  61.     ADC1_ChanConf.Offset=0;                 
  62.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  63.         
  64.         ADC1_ChanConf.Channel=ADC_CHANNEL_5;                                   //通道
  65.     ADC1_ChanConf.Rank=4;                                       //1个序列
  66.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
  67.     ADC1_ChanConf.Offset=0;                 
  68.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  69.         
  70. }
复制代码


3)dma.c
  1. DMA传输采用的是从外设到内存,
  2. 内存:ADC_ConvertedValueRead
  3. 外设:ADC>DR寄存器
  4. 在HAL_ADC_Start_DMA(&ADC1_Handler,&ADC_ConvertedValue[0],4);有对应的ADC>DR寄存器
  5. HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
  6. DMA 数据流 x 外设地址寄存器 (DMA_SxPAR)
  7. [mw_shl_code=c,true]uint32_t ADC_ConvertedValue[4];
  8. //DMA_HandleTypeDef  UART1TxDMA_Handler;      //DMA句柄
  9. DMA_HandleTypeDef  ADC1TxDMA_Handler;      //DMA句柄
  10. //DMAx的各通道配置
  11. //这里的传输形式是固定的,这点要根据不同的情况来修改
  12. //从存储器->外设模式/8位数据宽度/存储器增量模式
  13. //DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
  14. //chx:DMA通道选择,@ref DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
  15. void DMA_Config(void)
  16. {

  17.     __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能   
  18.    
  19.     //Tx DMA配置
  20.     ADC1TxDMA_Handler.Instance=DMA2_Stream0;                            //数据流选择
  21.     ADC1TxDMA_Handler.Init.Channel=DMA_CHANNEL_0;                       //通道选择
  22.     ADC1TxDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到存储器
  23.     ADC1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
  24.     ADC1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
  25.     ADC1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;    //外设数据长度:32位
  26.     ADC1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;       //存储器数据长度:32位
  27.     ADC1TxDMA_Handler.Init.Mode=DMA_CIRCULAR;                            //外设流控模式
  28.     ADC1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
  29.     ADC1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
  30.     ADC1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
  31.     ADC1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
  32.     ADC1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
  33.     ADC1TxDMA_Handler.XferCpltCallback = HAL_DMA_IRQHandler;
  34.    
  35.     HAL_DMA_DeInit(&ADC1TxDMA_Handler);   
  36.     HAL_DMA_Init(&ADC1TxDMA_Handler);
  37.     HAL_ADC_Start_DMA(&ADC1_Handler,&ADC_ConvertedValue[0],4);
  38.     __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1TxDMA_Handler);    //将ADC与DMA联系起来(发送DMA)
  39.     HAL_NVIC_SetPriority(DMA2_Stream0_IRQn,0,0);
  40.     HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
  41. //    HAL_ADC_Stop_DMA(&ADC1_Handler);      //传输完成以后关闭串口DMA

  42. }
  43. void DMA2_Stream0_IRQHandler(void)
  44. {
  45.     HAL_DMA_IRQHandler(&ADC1TxDMA_Handler);
  46. }
复制代码





阿波罗429 4路ADC+DMA实验.zip

15.65 MB, 下载次数: 1483

阿波罗429 四路ADC实验.zip

15.21 MB, 下载次数: 466

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-7-16
在线时间
1 小时
发表于 2019-7-27 11:11:30 | 显示全部楼层
非常谢谢你,再生父母啊
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-5-9
在线时间
69 小时
发表于 2019-7-27 13:11:51 | 显示全部楼层
可以留一个联系方式吗?
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10565
金钱
10565
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-8-10 18:05:01 | 显示全部楼层
1.阿波罗429 4路ADC+DMA实验.zip”:用的ADC1,操作的PA5,PA6,PA7,PC4
2.阿波罗429 四路ADC实验.zip:用的ADC1,操作的PA5,PA6,PA7,PC4
回复 支持 反对

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17693
金钱
17693
注册时间
2018-3-3
在线时间
523 小时
发表于 2020-3-10 12:19:06 | 显示全部楼层
666刚好用到
/*
*
*
*
*
*
*/
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2020-3-11 15:31:12 | 显示全部楼层

哈哈哈!如你所愿
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10565
金钱
10565
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-3-11 16:47:59 | 显示全部楼层

我的天
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14383
金钱
14383
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-3-11 17:15:53 | 显示全部楼层

优秀胜
啊哈~加油!!
回复 支持 反对

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2015-10-28
在线时间
56 小时
发表于 2020-3-30 15:30:44 | 显示全部楼层
感谢了
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-3-11
在线时间
22 小时
发表于 2020-5-25 16:25:15 | 显示全部楼层
楼主  谢谢分享  很受益
回复 支持 反对

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
发表于 2020-6-10 16:21:51 | 显示全部楼层
楼主DMA中断里面你没有做处理吗?还是说DMA里面会自动覆盖原来的数值?
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-5-18
在线时间
35 小时
发表于 2020-6-17 17:08:09 | 显示全部楼层
大佬,为什么我按照你的写,检测到的数据都是0阿
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-6-12
在线时间
8 小时
发表于 2020-9-22 17:31:10 | 显示全部楼层
谢谢大佬移植到767也能用
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-5 10:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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