历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2020年02月19日 | STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置

2020-02-19 来源:eefocus

本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作。

#include    "adc.h"  

#define DMA_BUFFER_SIZE     6  

uint8 sample_finish = 0;  

int16 adc_dma_tab[6] = { 0 };  

uint8 sample_index = 0;  

  

//采样点数据  

int16 sample_1[128] = { 0 };  

int16 sample_2[128] = { 0 };  

int16 sample_3[128] = { 0 };  

int16 sample_4[128] = { 0 };  

int16 sample_5[128] = { 0 };  

int16 sample_6[128] = { 0 };  

  

void user_adc_init()  

{  

    adc_gpio_init();  

    adc_config();               // 注意此处的初始化顺序,否则采样传输的数据容易出现数据错位的结果  

    adc_dma_init();             //  

    adc_timer_init();           //  

  

}  

  

void adc_config()  

{  

    ADC_InitTypeDef adc_init_structure;  

  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);            //使能ADC时钟  

  

    ADC_DeInit(ADC1);                                               //复位ADC  

    ADC_StructInit(&adc_init_structure);                            //初始化ADC结构体  

  

    adc_init_structure.ADC_ContinuousConvMode = DISABLE;            //禁用连续转换模式  

    adc_init_structure.ADC_DataAlign = ADC_DataAlign_Right;         //采样数据右对齐  

    adc_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO; //外部触发设置为TIM2  

    adc_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;//上升沿触发  

    adc_init_structure.ADC_Resolution = ADC_Resolution_12b;         //12位分辨率  

    adc_init_structure.ADC_ScanDirection = ADC_ScanDirection_Upward;//向上扫描0-18通道  

    ADC_Init(ADC1, &adc_init_structure);  

  

    ADC_OverrunModeCmd(ADC1, ENABLE);                               //使能数据覆盖模式  

    ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1 | ADC_Channel_2  

                          | ADC_Channel_8 | ADC_Channel_14 | ADC_Channel_15,  

                          ADC_SampleTime_13_5Cycles);               //配置采样通道,采样时间125nS  

    ADC_GetCalibrationFactor(ADC1);                                 //使能前校准ADC  

    ADC_Cmd(ADC1, ENABLE);                                          //使能ADC1  

    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET);         //等待ADC1使能完成  

  

    ADC_DMACmd(ADC1, ENABLE);                                       //使能ADC_DMA  

    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);           //配置DMA请求模式为循环模式  

    ADC_StartOfConversion(ADC1);                                    //开启一次转换(必须)  

}  

  

void adc_gpio_init()  

{  

    GPIO_InitTypeDef gpio_init_structure;  

    //使能GPIO时钟  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE);  

  

    GPIO_StructInit(&gpio_init_structure);  

    //GPIOA                                                         //PA-0~3用作ADC  

    gpio_init_structure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);  

    gpio_init_structure.GPIO_Mode = GPIO_Mode_AN;                   //使用附加(模拟)功能  

    gpio_init_structure.GPIO_OType = GPIO_OType_PP;                 //推挽输出  

    gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz;              //Fast speed  

    gpio_init_structure.GPIO_PuPd= GPIO_PuPd_UP;                    //上拉  

    GPIO_Init(GPIOA, &gpio_init_structure);  

    //GPIOB  

    gpio_init_structure.GPIO_Pin = GPIO_Pin_0;                      //PB-0 用作ADC  

    GPIO_Init(GPIOB, &gpio_init_structure);  

    //GPIOC  

    gpio_init_structure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5);       //PC-4~5用作ADC  

    GPIO_Init(GPIOC, &gpio_init_structure);  

}  

  

void adc_dma_init()  

{  

    DMA_InitTypeDef dma_init_structure;  

    NVIC_InitTypeDef nvic_init_structure;  

  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);              //使能DMA时钟  

  

    nvic_init_structure.NVIC_IRQChannel = DMA1_Channel1_IRQn;       //选择DMA1通道中断  

    nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;                //中断使能  

    nvic_init_structure.NVIC_IRQChannelPriority = 0;                //优先级设为0  

    NVIC_Init(&nvic_init_structure);  

  

    DMA_DeInit(DMA1_Channel1);                                      //复位DMA1_channel1  

    DMA_StructInit(&dma_init_structure);                            //初始化DMA结构体  

  

    dma_init_structure.DMA_BufferSize = DMA_BUFFER_SIZE;            //DMA缓存数组大小设置  

    dma_init_structure.DMA_DIR = DMA_DIR_PeripheralSRC;             //DMA方向:外设作为数据源  

    dma_init_structure.DMA_M2M = DISABLE;                           //内存到内存禁用  

    dma_init_structure.DMA_MemoryBaseAddr = (uint32)&adc_dma_tab[0];//缓存数据数组起始地址  

    dma_init_structure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据大小设置为Halfword  

    dma_init_structure.DMA_MemoryInc = DMA_MemoryInc_Enable;        //内存地址递增  

    dma_init_structure.DMA_Mode = DMA_Mode_Circular;                //DMA循环模式,即完成后重新开始覆盖  

    dma_init_structure.DMA_PeripheralBaseAddr = (uint32) &(ADC1->DR);//取值的外设地址  

    dma_init_structure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设取值大小设置为Halfword  

    dma_init_structure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址递增禁用  

    dma_init_structure.DMA_Priority = DMA_Priority_High;             //DMA优先级设置为高  

    DMA_Init(DMA1_Channel1, &dma_init_structure);  

  

    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);                  //使能DMA中断  

    DMA_ClearITPendingBit(DMA_IT_TC);                                //清除一次DMA中断标志  

    DMA_Cmd(DMA1_Channel1, ENABLE);                                  //使能DMA1  

}  

  

void adc_timer_init()  

{  

    TIM_TimeBaseInitTypeDef timer_init_structure;  

    NVIC_InitTypeDef nvic_init_structure;  

  

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  //使能TIM2时钟  

  

    nvic_init_structure.NVIC_IRQChannel = TIM2_IRQn;      //选择TIM2中断通道  

    nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;      //使能TIM2中断  

    nvic_init_structure.NVIC_IRQChannelPriority = 0;      //优先级为0  

    NVIC_Init(&nvic_init_structure);  

  

    TIM_DeInit(TIM2);                                     //复位TIM2  

推荐阅读

史海拾趣

极海半导体(Geehy)公司的发展小趣事

机顶盒,这一在现代家庭娱乐中占据重要地位的设备,全称为数字视频变换盒,它不仅是连接电视机与外部信号源的桥梁,更是数字电视技术与互联网融合创新的结晶。从广义上讲,机顶盒泛指所有与电视机连接的网络终端设备,它们能够接收来自有线电缆、卫星天线、宽带网络及地面广播的数字信号,并将其转换为适合电视播放的格式。

从功能划分上,机顶盒可分为数字机顶盒和网络机顶盒两大类。数字机顶盒主要负责数模转换,使模拟电视机也能收看数字电视节目;而网络机顶盒则进一步融入了互联网功能,提供更为丰富的互动娱乐体验,如在线视频、网络购物、社交媒体浏览等。近年来,随着技术的发展,网络机顶盒不断升级,支持高清、超高清视频播放,并集成人工智能技术,实现语音控制、智能推荐等功能,为用户带来更为便捷、智能的观影体验。

在技术层面,机顶盒的发展深受高清、超高清、云计算、边缘计算以及5G等新兴技术的推动。这些技术的应用不仅提升了机顶盒的性能,还为其内容的创新提供了强有力的支持。同时,随着市场竞争的加剧,机顶盒厂商不断优化产品设计,提升用户体验,以满足用户对高质量娱乐内容日益增长的需求。

综上所述,机顶盒作为家庭娱乐的重要组成部分,正通过技术的不断创新和市场的持续发展,为用户提供更加丰富、便捷、智能的观影体验。

意普(ESPE)公司的发展小趣事

为了提升产品质量和竞争力,意普(ESPE)公司开始注重品质管理,建立了严格的质量检测体系。同时,公司积极申请国际认证,成功获得了欧洲四级安全认证体系,进一步提升了产品的国际竞争力。这些努力不仅赢得了客户的信任,也为公司打开了国际市场的大门。

General Cable公司的发展小趣事
由于时钟频率是载波频率的2倍,因此需要根据选定的载波频率计算时钟频率。例如,若载波频率为38kHz,则时钟频率应为76kHz。
ETERNA公司的发展小趣事

1995年,ETERNA被保时捷家族收购,为公司的发展注入了新的活力。保时捷家族对制表业有着深厚的兴趣,他们投入大量资金用于研发和生产。在保时捷家族的支持下,ETERNA不断推出具有创新性的产品,如Spherodrive系统和超薄自动上炼机芯3030等。这些技术的成功应用,使ETERNA在制表业中取得了举足轻重的地位。同时,保时捷家族还通过全球营销战略,将ETERNA品牌推向了更广阔的市场。

CONEXANT公司的发展小趣事

2017年,电子行业迎来了一场引人瞩目的收购案。新思科技(Synaptics),一家在人机界面交互开发解决方案领域具有领导地位的公司,宣布以3.95亿美元现金和726,666只普通股收购科胜讯系统公司(Conexant Systems)。这一收购行动不仅增强了Synaptics在智能家居领域的语音和音频处理解决方案的能力,也标志着Conexant正式成为Synaptics大家庭的一员。通过此次收购,两家公司实现了技术资源和市场优势的互补,共同开启了新的发展篇章。

台湾奇力(Chip)公司的发展小趣事

奇力公司的成功离不开与奇美集团的紧密合作。奇美集团是台湾知名的面板生产厂家,拥有强大的技术实力和市场份额。奇力公司作为奇美集团的子公司,得到了奇美集团在技术、资金和市场等方面的全力支持。通过与奇美集团的紧密合作,奇力公司得以快速发展,并在LED芯片市场上取得了显著的成绩。

问答坊 | AI 解惑

快捷模块

系列功率模块资料…

查看全部问答>

HT1621 LCD液晶显示驱动芯片

大家介绍下这个芯片,再提供下“用AT89S51作为主控制器与 HT1621 组成显示系统的电路图!谢谢啊…

查看全部问答>

使用max3232 双工时,收发出现干扰现象!望达人指点!!

具体现象是这样,当我从max3232向PC机发数据时,此时如果从上位机PC 发数据到max3232,那么刚才从max3232发送到PC的数据就会被干扰。     用示波器观察过了,确实有一个字节的数据失真了,后面的字节没错。而且捕捉到的这个失真的数据 ...…

查看全部问答>

protel[1].2004.基础教程

protel[1].2004.基础教程…

查看全部问答>

Code Composer Studio™ IDE v4 免费试用版主要特性与优势

下载您的 Code Composer Studio™ IDE v4 免费试用版,获得 MSP430、C2000、C5000、C6000、Stellaris Cortex-M3、Sitara、Davinci 以及 OMAP 处理器的无缝支持!尊敬的客户,德州仪器 (TI)最新 Code Composer Studio™ 集成开发环境 ...…

查看全部问答>

请教!!

为什么我在解压uCOSV252之后,在C:\\SOFTWARE\\uCOS-II\\TEST_EX1_x86L\\BC45\\SOURCE里面并没有出现所谓的*.ink文件,不知道为什么,请知道的前辈帮解……谢谢!!…

查看全部问答>

这个电路为啥振荡不起来

这个电路为啥在CPLD上振荡不起来哈,请高手指点!~…

查看全部问答>

谁能说说这个像吉他拨片一样的东西具体有些什么作用?

看图片,拆解工具,具体怎么用?都有些什么作用?能弯曲撬么? …

查看全部问答>

ucos ii 串口调用是系统自带函数还是要自己创建串口程序?

ucos ii系统里面用串口收发数据的函数是系统自带的有?还是要自己像平常一样创建串口函数程序? 如果自己创建的函数程序,不会影响系统的同步性么?…

查看全部问答>