一、初始化dma傳輸
dma_inittypedef dma_initstructure; //定義結構體
rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable); //開啟dma時鐘
dma_deinit(dma1_channel1);
//決定資料從**來到**去
dma_initstructure.dma_peripheralbaseaddr = (uint32_t)(&( adc1->dr )); //外設位址
dma_initstructure.dma_memorybaseaddr = (uint32_t)&adc_value; //儲存器位址
dma_initstructure.dma_dir = dma_dir_peripheralsrc; //傳輸方向
//資料要傳多少,傳的單位是什麼
dma_initstructure.dma_buffersize = adc_count ; //傳輸數目
dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; //外設位址遞增模式
dma_initstructure.dma_memoryinc = dma_memoryinc_enable; //儲存器位址遞增模式
dma_initstructure.dma_memorydatasize = dma_memorydatasize_halfword; //外設資料寬度
dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_halfword; //儲存器資料寬度
dma_initstructure.dma_mode = dma_mode_circular ; //傳輸模式是否迴圈
dma_initstructure.dma_priority = dma_priority_high; //通道優先順序
dma_initstructure.dma_m2m = dma_m2m_disable; //儲存器到儲存器模式
dma_init(dma1_channel1, &dma_initstructure); //呼叫庫函式將值寫入
dma_clearflag(dma1_flag_tc2); //清除標誌位
dma_cmd(dma1_channel1, enable); //dma使能
二、adc轉換配置
//轉換規則 adc號 通道號 轉換順序 取樣時間
adc_regularchannelconfig(adc_x , adc_channel_10 , 1, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc_x , adc_channel_11 , 2, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc_x , adc_channel_12 , 3, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc_x , adc_channel_13 , 4, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc_x , adc_channel_14 , 5, adc_sampletime_55cycles5);
adc_regularchannelconfig(adc_x , adc_channel_15 , 6, adc_sampletime_55cycles5);
三、程式原始碼
1、bsp_adc.h檔案
#ifndef __bsp_adc_h
#define __bsp_adc_h
#include "stm32f10x.h"
//adc相關gpio 時鐘 外設
#define rcc_gpio_clock rcc_apb2periphclockcmd
#define rcc_gpio_periph rcc_apb2periph_gpioc
#define gpio_port gpioc
#define gpio_ch0_pin gpio_pin_0
#define gpio_ch1_pin gpio_pin_1
#define gpio_ch2_pin gpio_pin_2
#define gpio_ch3_pin gpio_pin_3
#define gpio_ch4_pin gpio_pin_4
#define gpio_ch5_pin gpio_pin_5
#define rcc_adc_clock rcc_apb2periphclockcmd
#define rcc_adc_periph rcc_apb2periph_adc1
#define adc_x adc1
#define adc_count 6
#define adc_irqn adc1_2_irqn
void adc_init_config(void);
#endif /* __bsp_adc_h */
2、bsp_adc.c檔案
#include "bsp_adc.h"
__io uint16_t adc_value[adc_count];
static void adc_gpio_config(void)
static void adc_mpde_config(void)
void adc_init_config(void)
3、main.c檔案
#include "stm32f10x.h" // 相當於51微控制器中的 #include #include "bsp_led.h"
#include "usart.h"
#include "bsp_adc.h"
extern __io uint16_t adc_value[adc_count];
float value[adc_count];
void delay(u32 i)
int main(void)
}
STM32多通道ADC操作
自 今天嘗試了下stm32的adc取樣,並利用dma實現取樣資料的直接搬運儲存,這樣就不用cpu去參與操作了。找了不少例子參考,adc和dma的設定了解了個大概,並直接利用開發板來做一些實驗來驗證相關的操作,保證自己對各部分設定的理解。我這裡用了3路的adc通道,1路外部變阻器輸入,另外兩路是內部的...
adc 取樣 通道
今天學習stm32的adc部分,adc1有18個通道,其中adc16和adc17是內部通道,分別接內部溫度計和vrefint。在做a d轉換的時候,16個多路通道可以分為兩組 規則組和注入組。不知道大家怎麼看,也許是我看的不夠專注,反正我覺得stm32的參考手冊真是晦澀難懂,就像 一樣。就規則組這個...
STM32的ADC取樣與多通道ADC取樣
stm32庫開發實戰指南 劉火良,楊森著 原理性質的東西還是少講,因為上面那本書裡面講解的很詳細了,直接來看硬體電路圖 這裡使用的是3362電位器 10k 即用stm32來測量pb0和gnd兩端的電壓,這樣的電路設計比較簡單也容易理解,但是存在一定的弊端,下面給出 stm32庫開發實戰指南 上面配套...