STM32学习笔记数组
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_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)(读取该口的电压值,至关于AVR的pin)。若IO口为高电平,则这个函数返回为1,为低电平时返回为0.
if (SysTick_Config(SystemCoreClock / 3000))//配置时钟的频率,改变数字可改变频率,数字越大频率越快
{
/* Capture error */
while (1);
}
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); //清中断标志位
}
}
WWDG_IRQChannel 窗口看门狗中断 0x00
PVD_IRQChannel PVD 经过 EXTI 探测中断
TAMPER_IRQChannel 篡改中断
RTC_IRQChannel RTC 全局中断
FlashItf_IRQChannel FLASH全局中断
RCC_IRQChannel RCC 全局中断
EXTI0_IRQChannel 外部中断线 0 中断
EXTI1_IRQChannel 外部中断线 1 中断
EXTI2_IRQChannel 外部中断线 2 中断
EXTI3_IRQChannel 外部中断线 3 中断
EXTI4_IRQChannel 外部中断线 4 中断
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接收 0 中断
CAN_RX1_IRQChannel CAN接收 1中断
CAN_SCE_IRQChannel CAN SCE 中断
EXTI9_5_IRQChannel 外部中断线 9-5 中断 (5至9对应一个中断源)。
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中断分为三种:一种为0至4,一种为5至9,一种为10至15.
NVIC_PriorityGroup |
NVIC_IRQChanne 的先占优先级 |
NVIC_IRQChann 的从优先级 |
描述 |
NVIC_PriorityGroup_0 |
0 |
0-15 |
先占优先级 0 位 从优先级 4位 |
NVIC_PriorityGroup_1 |
0-1 |
0-7 |
先占优先级 1 位 从优先级 3位 |
NVIC_PriorityGroup_2 |
0-3 |
0-3 |
先占优先级 2 位 从优先级 2位 |
NVIC_PriorityGroup_3 |
0-7 |
0-1 |
先占优先级 3 位 从优先级 1位 |
NVIC_PriorityGroup_4 |
0-15 |
0 |
先占优先级 4 位 从优先级 0位 |
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);//初始化结构体
}
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
}
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);//初始化中断
}
void TIM2_IRQHandler(void)//定时器2中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//等待刷新完成
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清刷新数据中断标志位
/*add code */
}
}
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); //使能计数
}
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); //从新装载计数使能
}
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初始化
}
TIM_SetCompare4(TIM3,CCR4_Val);
T=NxP/72MHz 其中N为周期数,P为分频数。N= TIM_Period- CCRx_Val。T即为所配出的PWM的周期。
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);//串口使能
}
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);
}
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);//执行初始化函数
}
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空
chars = (USART_ReceiveData(USART1)); //接收字符
USART_SendData(USART1, chars);//发送接收到的字符
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成
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)//若是是发送中断
{ }
}
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总使能
}
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 选择定时器 1 的 TRGO做为注入转换外部触发
//ADC_ExternalTrigInjecConv_T1_CC4 选择定时器1的捕获比较4做为注入转换外部触发
//ADC_ExternalTrigInjecConv_T2_TRGO 选择定时器 2 的 TRGO做为注入转换外部触发
//ADC_ExternalTrigInjecConv_T2_CC1 选择定时器2的捕获比较1做为注入转换外部触发
//ADC_ExternalTrigInjecConv_T3_CC4 选择定时器3的捕获比较4做为注入转换外部触发
//ADC_ExternalTrigInjecConv_T4_TRGO 选择定时器 4 的 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); //使能ADC1对DMA的请求
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
}
void ADC_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//PC4,PC5对应的是AD14,AD15通道
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟量输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
u16 DataValue;
DataValue = ADC_GetConversionValue(ADC1);//取出ADC1中转换的结果
个人笔记:
1. IO口由软件配置能够造成8种工做模式。
2. APB,APB1,APB2为三种STM32的时钟基准。
3. 每一个IO口均可以做为中断输入。且IO口能够承受25mA的电流。