STM32学习笔记

STM32学习笔记数组


GPIO

GPIO初始化

void GPIO_Configuration(void)缓存

{函数

GPIO_InitTypeDef   GPIO_InitStructure;//声明结构体学习

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开功能时钟 (再写这句程序的时候,必须进行时钟系统初始化的操做)ui

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//指明操做对象引脚es5

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置IO口时钟为50MHz/10MHz/2MHzspa

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置推挽输出code

/*GPIO_Mode_AIN                     模拟输入 对象

GPIO_Mode_IN_FLOATING               浮空输入 (通常为中断所使用)。事件

GPIO_Mode_IPD                       下拉输入 

GPIO_Mode_IPU                       上拉输入 

GPIO_Mode_Out_OD                    开漏输出 

GPIO_Mode_Out_PP                    推挽输出 

GPIO_Mode_AF_OD                    复用开漏输出 

GPIO_Mode_AF_PP                    复用推挽输出 */  通常用在点灯)。   

  GPIO_Init(GPIOA, &GPIO_InitStructure);  //执行初始化IO

}

GPIO经常使用函数

GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置高IO

GPIO_ResetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置低IO

GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)));//翻转IO

GPIOA->ODR = 0X0010 ;//IO口直接赋值语句

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)(读取该口的电压值,至关于AVRpin)。若IO口为高电平,则这个函数返回为1,为低电平时返回为0.


SysTick系统时钟

SysTick配置函数

  if (SysTick_Config(SystemCoreClock / 3000))//配置时钟的频率,改变数字可改变频率,数字越大频率越快

  { 

    /* Capture error */ 

    while (1);

  } 


EXTI中断

外部中断

外部中断IO口设置

void GPIO_EXTI_Configuration(void)

{

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);//使能时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能复用IO时钟

GPIO_InitTypeDef   GPIO_InitStructure;//声明IO口初始化结构体

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//指定PD.06为操做对象

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置模式为浮空输入

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化IO

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; //指定PD.13,14为操做对象

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置模式为浮空输入

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化IO

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); //PC.06映射到外部中断       

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13); //PD.13映射到外部中断  

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource14); //PD.14映射到外部中断

}

外部中断初始化

 void EXTI_Configuration(void)

{

  EXTI_InitTypeDef   EXTI_InitStructure;//声明外部中断初始化结构体

  EXTI_InitStructure.EXTI_Line = EXTI_Line6|EXTI_Line13|EXTI_Line14;//使能外部中断线路6,13,14

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置EXTI线路模式为中断

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//设置触发方式为上升沿

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线路

  EXTI_Init(&EXTI_InitStructure);//初始化结构体

}

外部中断向量&优先级设定

void NVIC_EXTI_Configuration(void)

{

  NVIC_InitTypeDef   NVIC_InitStructure;//声明中断向量&优先级设定结构体

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断向量组别为2

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//指定外部中断向量

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置该中断的先占优先级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置该中断的从优先级         

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能该外部中断

  NVIC_Init(&NVIC_InitStructure);//初始化外部中断

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;// 指定外部中断向量

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置该中断的先占优先级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置该中断的从优先级

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能该外部中断

  NVIC_Init(&NVIC_InitStructure); //初始化外部中断

}

由抢先优先级和从优先级实现了中断嵌套,进而使程序即便处理更加要紧的事情。且高的抢先优先级能够打断低的抢先优先级,当抢先优先级相同时,那就比较从优先级,先响应高的。当两者都相同时,先响应物理地址低的中断。

外部中断函数

/*example1*/

void EXTI9_5_IRQHandler(void)

{

  if(EXTI_GetITStatus(EXTI_Line6) != RESET)

//若是对应的中断线路触发事件,注意能够一个中断向量对应多个中断引脚

  {

    /*add code */

    EXTI_ClearITPendingBit(EXTI_Line6);//清中断标志

  }

}

/*example2*/

void EXTI15_10_IRQHandler(void)

{

  if(EXTI_GetITStatus(EXTI_Line13) != RESET)

//若是对应的中断线路13触发事件,注意能够一个中断向量对应多个中断引脚

  {

    /* add code */

    EXTI_ClearITPendingBit(EXTI_Line13);//清中断标志位

  }

 if(EXTI_GetITStatus(EXTI_Line14) != RESET)

//若是对应的中断线路14触发事件,注意能够一个中断向量对应多个中断引脚

  {

    /* add code */

    EXTI_ClearITPendingBit(EXTI_Line14); //清中断标志位

  }

}

中断channel

WWDG_IRQChannel   窗口看门狗中断                                0x00

PVD_IRQChannel   PVD 经过 EXTI 探测中断 

TAMPER_IRQChannel   篡改中断 

RTC_IRQChannel   RTC 全局中断 

FlashItf_IRQChannel       FLASH全局中断 

RCC_IRQChannel     RCC 全局中断 

EXTI0_IRQChannel   外部中断线 中断 

EXTI1_IRQChannel   外部中断线 中断 

EXTI2_IRQChannel   外部中断线 中断 

EXTI3_IRQChannel   外部中断线 中断 

EXTI4_IRQChannel   外部中断线 中断 

DMAChannel1_IRQChannel     DMA通道 1中断 

DMAChannel2_IRQChannel   DMA通道 2中断 

DMAChannel3_IRQChannel   DMA通道 3中断 

DMAChannel4_IRQChannel   DMA通道 4中断 

DMAChannel5_IRQChannel   DMA通道 5中断 

DMAChannel6_IRQChannel   DMA通道 6中断 

DMAChannel7_IRQChannel   DMA通道 7中断 

ADC_IRQChannel  ADC  全局中断 

USB_HP_CANTX_IRQChannel   USB 高优先级或者 CAN发送中断 

USB_LP_CAN_RX0_IRQChannel   USB 低优先级或者 CAN接收 中断 

CAN_RX1_IRQChannel   CAN接收 1中断 

CAN_SCE_IRQChannel   CAN SCE 中断

EXTI9_5_IRQChannel   外部中断线 9-5 中断 (59对应一个中断源)。

TIM1_BRK_IRQChannel   TIM1 暂停中断 

TIM1_UP_IRQChannel   TIM1 刷新中断 

TIM1_TRG_COM_IRQChannel   TIM1 触发和通信中断 

TIM1_CC_IRQChannel   TIM1 捕获比较中断 

TIM2_IRQChannel   TIM2 全局中断 

TIM3_IRQChannel     TIM3 全局中断 

TIM4_IRQChannel   TIM4 全局中断 

I2C1_EV_IRQChannel     I2C1 事件中断 

I2C1_ER_IRQChannel     I2C1 错误中断 

I2C2_EV_IRQChannel    I2C2 事件中断 

I2C2_ER_IRQChannel   I2C2 错误中断 

SPI1_IRQChannel   SPI1 全局中断 

SPI2_IRQChannel   SPI2 全局中断 

USART1_IRQChannel   USART1 全局中断 

USART2_IRQChannel   USART2 全局中断 

USART3_IRQChannel   USART3 全局中断 

EXTI15_10_IRQChannel   外部中断线 15-10 中断 

RTCAlarm_IRQChannel   RTC 闹钟经过 EXTI线中断 

USBWakeUp_IRQChannel   USB 经过 EXTI线从悬挂唤醒中断

EXIT中断分为三种:一种为04,一种为59,一种为1015.

中断优先级表

NVIC_PriorityGroup

NVIC_IRQChanne

的先占优先级

NVIC_IRQChann

的从优先级

描述

NVIC_PriorityGroup_0

0

0-15

先占优先级 位 

从优先级 4

NVIC_PriorityGroup_1

0-1

0-7

先占优先级 位 

从优先级 3

NVIC_PriorityGroup_2

0-3

0-3

先占优先级 位 

从优先级 2

NVIC_PriorityGroup_3

0-7

0-1

先占优先级 位 

从优先级 1

NVIC_PriorityGroup_4

0-15

0

先占优先级 

从优先级 0

 


TIM定时器

TIM1

TIM1 PWM波模式

TIM1 基本配置初始化

void TIM1_BASE_Configuration(void)

{

  TIM_DeInit(TIM1);//将定时器1寄存器设置为缺省值

  /*TIM1基本设置*/

TIM_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;//声明初始化结构体

  TIM1_TimeBaseStructure.TIM_Prescaler = 0x0; //设置周期

  TIM1_TimeBaseStructure.TIM_Period = 0xFFFF; // 设置分频,范围0-0XFFFF

  TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置时钟分割

TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式,向上计数

  TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//计数器重载值

  TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);//初始化结构体

}

TIM2

TIM2普通模式

TIM2 基本配置初始化

void TIM2_BASE_Configuration(void)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//声明初始化结构体

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2,注意时钟源是APB1

TIM_TimeBaseStructure.TIM_Period = 7200; //设置周期时间,范围0-0XFFFF

  TIM_TimeBaseStructure.TIM_Prescaler = 9999;// 设置分频,范围0-0XFFFF

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟分割

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器基本配置

  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除刷新中断标志位

  TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);//开启计数中断

  TIM_Cmd(TIM2, ENABLE);//使能TIM2

}

TIM2 中断初始化

void NVIC_TIM2_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;//声明结构体

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//设置优先级组0,1,2,3,4

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//中断向量:定时器2全局中断

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置先占优先级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//设置从优先级

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

  NVIC_Init(&NVIC_InitStructure);//初始化中断

}

TIM2 中断函数

void TIM2_IRQHandler(void)//定时器2中断

{

  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//等待刷新完成

  {

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清刷新数据中断标志位

    /*add code */

  }

}

TIM3 

TIM3 PWM波模式

TIM3 PWM 基本初始化设置

void TIM3_BASE_Configuration(void)

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //声明基本初始化结构体

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //T3时钟使能

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //T3时钟使能

TIM_TimeBaseStructure.TIM_Period = 7200; //周期       72M/7200=10KHz.

TIM_TimeBaseStructure.TIM_Prescaler = 0; //分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //执行初始化TIM3

TIM_Cmd(TIM3, ENABLE); //使能计数

}

TIM3 PWM 通道初始化

void TIM3_CHANNEL_Configuration(void)

{

TIM_OCInitTypeDef TIM_OCInitStructure; //声明初始化结构体

/*************************** 通道1 ********************************/

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //模式选择:PWM2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM波输出使能

TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //写比较值占空比

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较时清零

TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器

/****************************** 通道2 ******************************/

/* PWM1 Mode configuration: Channel2 */

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM波输出使能

TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //写比较值占空比

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC2Init(TIM3, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器

/******************************* 通道3 *********************************/

/* PWM1 Mode configuration: Channel3 */

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM波输出使能

TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //写比较值占空比

TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器

/****************************** 通道4 *********************************/

/* PWM1 Mode configuration: Channel4 */

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM波输出使能       

TIM_OCInitStructure.TIM_Pulse = CCR4_Val; //写比较值占空比

TIM_OC4Init(TIM3, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器

TIM_ARRPreloadConfig(TIM3, ENABLE); //从新装载计数使能

}

TIM3 PWM IO口设置

void GPIO_ TIM3_ Configuration(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

                      RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//使能时钟

GPIO_InitTypeDef GPIO_InitStructure; //声明初始化结构体

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //指定IO

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式为复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最大速度50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //执行GPIO初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定IO

GPIO_Init(GPIOB, &GPIO_InitStructure);  //执行GPIO初始化

}

TIM3 PWM 波占空比装载函数

TIM_SetCompare4(TIM3,CCR4_Val);

T=NxP/72MHz 其中N为周期数,P为分频数。N= TIM_Period- CCRx_Val。T即为所配出的PWM的周期。


                               

UART串口

UART 功能设置

void UART_ Configuration(void)

{

USART_InitTypeDef USART_InitStructure;//声明串口结构体

  USART_InitStructure.USART_BaudRate = 115200;//波特率为115200

  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);//初始化串口

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//串口接收中断使能

//USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //串口发送中断使能

  USART_Cmd(USART1, ENABLE);//串口使能

}

UART IO口设置

void UART_ GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE);//使能串口1,复用IO时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIOA9为串口发送引脚,设置为复用推挽输出模式

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //GPIOA10为串口接收引脚,设置为浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

UART 中断初始化

void NVIC_UART_Configuration(void)

{

   NVIC_InitTypeDef NVIC_InitStructure;//声明串口初始化结构体

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级组

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指定中断类型

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置先占优先级

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置从优先级

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

  NVIC_Init(&NVIC_InitStructure);//执行初始化函数

}

UART 经常使用函数

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空

    chars = (USART_ReceiveData(USART1));  //接收字符

    USART_SendData(USART1, chars);//发送接收到的字符

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成

UART 中断函数

void USART1_IRQHandler(void)//串口1全局中断

{

 unsigned char RxBuffer=0;

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//若是是接收中断

  { 

   RxBuffer = USART_ReceiveData(USART1);//缓存接收的数据

   USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清中断标志位

  }

  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)//若是是发送中断

  {  }

}

DMA直接内存存取

DMA 初始化

void DMA_ Configuration(void)

{

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

  DMA_DeInit(DMA1_Channel1);//DMA1通道1初始化为缺省值

  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//设定外设基地址,AD的地址为0x4001244C

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCConvertedValue;//设定内存基地址,若是是数组直接写数组名。

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&aa;//若是是单个变量,须要加”&”取地址符

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设为数据源头

  DMA_InitStructure.DMA_BufferSize = 16;//缓存区数据大小,根据设定的数组大小定就能够

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

//外设地址自加禁止,若是有多个外设绑定一个DMA通道的时候能够开启

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

//内部存储地址自加使能,若是是单个变量能够禁止

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度 16

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内部存储数据宽度16

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止内存到内存的传输

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  /* Enable DMA1 channel1 */

  DMA_Cmd(DMA1_Channel1, ENABLE);//DMA总使能

}

AD模数转换

AD初始化

void ADC_Configuration(void)

{

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC独立模式

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//使能扫描转换模式

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//使能连续转换模式

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//没有外部触发源

//ADC_ExternalTrigInjecConv_T1_TRGO  选择定时器 的 TRGO做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_T1_CC4  选择定时器1的捕获比较4做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_T2_TRGO  选择定时器 的 TRGO做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_T2_CC1  选择定时器2的捕获比较1做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_T3_CC4  选择定时器3的捕获比较4做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_T4_TRGO  选择定时器 的 TRGO做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_Ext_IT15  选择外部中断线 15 事件做为注入转换外部触发 

//ADC_ExternalTrigInjecConv_None  注入转换由软件而不是外部触发启动

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐

  ADC_InitStructure.ADC_NbrOfChannel = 2;//打开的AD通道数

  ADC_Init(ADC1, &ADC_InitStructure);//执行初始化函数

  /*配置每一个通道的顺序转换序列和转换的时间*/ 

  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);

//通道14,序列1,转换时间为55.5个周期

  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_55Cycles5);

//通道14,序列1,转换时间为55.5个周期

//ADC_SampleTime_1Cycles5  采样时间为 1.5 周期 

//ADC_SampleTime_7Cycles5  采样时间为 7.5 周期 

//ADC_SampleTime_13Cycles5  采样时间为 13.5 周期 

//ADC_SampleTime_28Cycles5  采样时间为 28.5 周期 

//ADC_SampleTime_41Cycles5  采样时间为 41.5 周期 

//ADC_SampleTime_55Cycles5  采样时间为 55.5 周期 

//ADC_SampleTime_71Cycles5  采样时间为 71.5 周期 

//ADC_SampleTime_239Cycles5  采样时间为 239.5 周期

  ADC_DMACmd(ADC1, ENABLE);  //使能ADC1DMA的请求

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

  ADC_ResetCalibration(ADC1); //ADC1校准复位

  while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位成功

  ADC_StartCalibration(ADC1); //开始ADC1的校准

  while(ADC_GetCalibrationStatus(ADC1));  //等待校准结束

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始ADC

}

AD IO口设置

void ADC_GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//PC4PC5对应的是AD14AD15通道

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟量输入

  GPIO_Init(GPIOC, &GPIO_InitStructure);

}

AD 经常使用函数

u16 DataValue; 

DataValue = ADC_GetConversionValue(ADC1);//取出ADC1中转换的结果

 

 

个人笔记:

1. IO口由软件配置能够造成8种工做模式。

2. APBAPB1APB2为三种STM32的时钟基准。

3. 每一个IO口均可以做为中断输入。且IO口能够承受25mA的电流。