新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32學(xué)習(xí)筆記之ADC--DMA方式

STM32學(xué)習(xí)筆記之ADC--DMA方式

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
程序功能是把ADC1模塊里通道14的輸入電壓轉(zhuǎn)換后通過USART2發(fā)送到PC,在PC機(jī)上用串口調(diào)試助手觀察接收數(shù)據(jù):

本文引用地址:http://butianyuan.cn/article/201611/322988.htm

STM32是12位ADC,測量結(jié)果基本還可以!程序用了DMA來傳輸ADC轉(zhuǎn)換值,調(diào)高了讀取速度。串口部分用是上一篇串口調(diào)試筆記里的代碼。


#include
#include

#define ADC1_DR_Address((u32)0x4001244C)

#ifdef __GNUC__

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

vu16 ADC_ConvertedValue;

void RCC_Config(void);
void GPIO_Config(void);
void USART_Config(void);
void DMA_Config(void);
void ADC_Config(void);
void Put_String(u8 *p);
void Delay(vu32 nCount);
int main(void)
{
RCC_Config();
GPIO_Config();
USART_Config();
DMA_Config();
ADC_Config();


while(1)
{

Delay(0x8FFFF);
printf("ADC = %X Volt = %d mvrn", ADC_ConvertedValue, ADC_ConvertedValue*3300/4096);

}
}

void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;//定義外部高速晶體啟動狀態(tài)枚舉變量
RCC_DeInit();//復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
RCC_HSEConfig(RCC_HSE_ON); //打開外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速時鐘準(zhǔn)備好
if(HSEStartUpStatus == SUCCESS)//外部高速時鐘已經(jīng)準(zhǔn)別好
{

RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)時鐘=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)鐘=AHB時鐘
RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)鐘=AHB 1/2時鐘
RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC時鐘=PCLK2 1/4

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//配置PLL時鐘 == 外部高速晶體時鐘*9
RCC_ADCCLKConfig(RCC_PCLK2_Div4);//配置ADC時鐘= PCLK2/4

RCC_PLLCmd(ENABLE);//使能PLL時鐘
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL時鐘就緒
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系統(tǒng)時鐘 = PLL時鐘

while(RCC_GetSYSCLKSource() != 0x08) //檢查PLL時鐘是否作為系統(tǒng)時鐘
{
}
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);//使能DMA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
//使能ADC1,GPIOC時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
//打開GPIOD和AFIO時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//使能串口2時鐘
}

void GPIO_Config(void)
{
//設(shè)置RTS(PD.04),Tx(PD.05)為推拉輸出模式
GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO初始化結(jié)構(gòu)體
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//使能GPIO端口映射USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//選擇PIN4 PIN5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引腳頻率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//引腳設(shè)置推拉輸出
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD
//配置CTS (PD.03),USART2 Rx (PD.06)為浮點輸入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
//配置PC4為模擬輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}


上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉