1、复习复习嵌入式系统定义;与通用计算机系统的区别嵌入式系统定义;与通用计算机系统的区别以应用为中心、以计算机技术为基础,软硬件可裁剪以应用为中心、以计算机技术为基础,软硬件可裁剪,从而能从而能够适应实际应用中对功能、可靠性、成本、体积、功耗和应用够适应实际应用中对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的环境有特殊要求的专用专用计算机系统。计算机系统。嵌入式系统的组成嵌入式系统的组成嵌入式处理器;外围设备;操作系统;应用软件嵌入式处理器;外围设备;操作系统;应用软件嵌入式处理器分类嵌入式处理器分类微控制器;微处理器;嵌入式微控制器;微处理器;嵌入式DSP;片上系统;片上系统绪论绪论GP
2、IOSTM32的的GPIO有多种工作模式:有多种工作模式:输入浮空;输入上拉;输入下拉;模拟输入;推挽输出;推挽输入浮空;输入上拉;输入下拉;模拟输入;推挽输出;推挽复用;开漏输出;开漏复用。复用;开漏输出;开漏复用。要知道每种模式具体用在什么场合。要知道每种模式具体用在什么场合。GPIO的编程(可能有大题(编程题)的编程(可能有大题(编程题)用某个用某个IO引脚控制一个引脚控制一个LED灯,使其闪烁。要求画出电路图灯,使其闪烁。要求画出电路图,并编程。,并编程。STM32STM32编写程序时要用到哪个模块首先要开启那个模块的时钟编写程序时要用到哪个模块首先要开启那个模块的时钟void RCC
3、_Configuration(void)void RCC_Configuration(void)SystemInit();SystemInit();/系统时钟配置为系统时钟配置为72MHZ72MHZ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB
4、2Periph_GPIOE|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);/打打开开GPIOGPIO时钟时钟 STM32 GPIOSTM32 GPIO例程讲解例程讲解 void GPIO_Configuration(void)void GPIO_Configuration(void)/I/O/I/O口线配置口线配置 GPIO_InitTypeDef GPIO_
5、InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/配置输出脚配置输出脚PC0PC0控制控制LEDLED灯灯 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GP
6、IO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_Init(GPIOB,&GPIO_InitStructure);STM32 GPIOSTM32 GPIO例程讲解例程讲解 写写0 0:GPIO_ResetBits(GPIOB,GPIO_Pin_5);GPIO_ResetBits(GPIOB,GPIO_Pin_5);写写1 1:GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOB,GPIO_Pin_5);读:读:GPIO_Read
7、InputDataBit(GPIOB,GPIO_Pin_5);GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);返回值是返回值是1(Bit_SET)1(Bit_SET)或者或者0(Bit_RESET);0(Bit_RESET);STM32 GPIOSTM32 GPIO例程讲解例程讲解 EXTI(外部中断)(外部中断)中断的定义中断的定义CPU在正常执行程序的过程中,突然发生了一些需要紧急处理在正常执行程序的过程中,突然发生了一些需要紧急处理的事件,这些事件通过某种方式触发引起的事件,这些事件通过某种方式触发引起CPU暂停当前正在执暂停当前正在执行的程序,转去处理突
8、发事件,待突发事件处理完毕后,行的程序,转去处理突发事件,待突发事件处理完毕后,CPU再返回继续执行刚刚被暂停的程序的过程就称之为中断。再返回继续执行刚刚被暂停的程序的过程就称之为中断。STM32中断优先级分组中断优先级分组优先级越高,数值越低!抢占优先级相同的任务,响应优先级高的先响应,但不能互相抢占;抢占优先级不同的,可以抢占低优先级的CPU。STM32外部中断的来源外部中断的来源STM32和I/O口有关的中断一共有16个:GPIO的管脚GPIOx.0GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线150。这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.
9、0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。void RCC_Configuration(void)void RCC_Configuration(void)SystemInit();SystemInit();/系统时钟配置为系统时钟配置为72MHZ72MHZRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,E
10、NABLE);/打开打开AFIOAFIO时钟时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF
11、|RCC_APB2Periph_GPIOG,ENABLE);RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);/打开打开GPIOGPIO时钟时钟 STM32STM32外部中断例程讲解外部中断例程讲解 void GPIO_Configuration(void)void GPIO_Configuration(void)/输入输出管脚配置输入输出管脚配置 GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/配置输出脚配置输出脚PC0PC0控制控制LEDLED
12、灯灯 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStructu
13、re);GPIO_Init(GPIOC,&GPIO_InitStructure);/配置输入脚配置输入脚PA0PA0控制按键控制按键 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_Init(GPIOA,
14、&GPIO_InitStructure);STM32STM32外部中断例程讲解外部中断例程讲解 void NVIC_Configuration(void)void NVIC_Configuration(void)/嵌套向量中断控制器配置嵌套向量中断控制器配置 NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1NVIC_PriorityGroup_1););/选择优
15、先级组别选择优先级组别 NVIC_InitStructure.NVIC_IRQChannel=NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQnEXTI0_IRQn;/选择中断通道:选择中断通道:EXTIEXTI线线0 0中断,因为按键连接的是中断,因为按键连接的是PA0PA0脚脚 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;/0 /0级抢占式优先级级抢占式优先级 NVIC_Ini
16、tStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;/0 /0级副优先级级副优先级 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/使能引脚作为中断源使能引脚作为中断源 NVIC_Init(&NVIC_InitStructure);/NVIC_Init(&NVIC_InitStructure);/调用调用NVIC_InitNVIC_Init
17、固件库函数进行设置固件库函数进行设置 STM32STM32外部中断例程讲解外部中断例程讲解 void EXTI_Configuration(void)void EXTI_Configuration(void)/调用固件库中的调用固件库中的GPIO_EXTILineConfigGPIO_EXTILineConfig函数,函数,/其中两个参数分别是中断口和中断口对应的引脚号其中两个参数分别是中断口和中断口对应的引脚号 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSour
18、ceGPIOA,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line=EXTI_InitStructure.EXTI_Line=EXTI_Line0EXTI_Line0;/将中断映射到中断将中断映射到中断/事件源事件源Line0Line0 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;/中断模式中断模式 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_FallingE
19、XTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling /设置为下降沿中断设置为下降沿中断 EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_LineCmd=ENABLE;/中断使能,即开中断中断使能,即开中断 EXTI_Init(&EXTI_InitStructure);EXTI_Init(&EXTI_InitStructure);/调用调用EXTI_InitEXTI_Init固件库函数,将结构体写入固件库函数,将结构体写入EXTIEXTI相关寄存器中相关寄存器中 ST
20、M32STM32外部中断例程讲解外部中断例程讲解 void EXTI0_IRQHandler(void)void EXTI0_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line0)!=RESET)if(EXTI_GetITStatus(EXTI_Line0)!=RESET)/将将LED1LED1的状态反转的状态反转 GPIO_WriteBit(GPIOC,GPIO_Pin_0,(BitAction)(1-GPIO_WriteBit(GPIOC,GPIO_Pin_0,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GP
21、IO_Pin_0);GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0);/清中断清中断 EXTI_ClearITPendingBit(EXTI_Line0);EXTI_ClearITPendingBit(EXTI_Line0);STM32STM32外部中断例程讲解外部中断例程讲解 注意:中断服务函数都包含在注意:中断服务函数都包含在“stm32f10 x_it.cstm32f10 x_it.c”文件中,文件中,用的时候只需添加指令即可用的时候只需添加指令即可!串行通信基础 v数据通信方式:并行通信与串行通信数据通信方式:并行通信与串行通信v并行通信:一次传输多位的
22、数据并行通信:一次传输多位的数据v 特点:速度快,适合近距离传输特点:速度快,适合近距离传输v串行通信:串行通信:数据一位一位地发送数据一位一位地发送特点:硬件简单,占用特点:硬件简单,占用I/O口资源少,适合口资源少,适合距离远,速度要求不高的场合距离远,速度要求不高的场合波特率 v单位时间内传送的信息量。以每秒传送单位时间内传送的信息量。以每秒传送的位为单位:的位为单位:v电传机:电传机:10字符字符/秒,秒,1个字符个字符11位,位,v波特率为:波特率为:1011=110(波特)(波特)void RCC_Configuration(void)void RCC_Configuration(
23、void)SystemInit();SystemInit();/系统时钟配置为系统时钟配置为72MHZ72MHZv RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOA,ENABLE);/ENABLE);/外设时钟配置外设时钟配置 STM32 STM32 串口例程讲解串口例程讲解 /*Name:UART1_GPIO_Configuration*Deion:Configures the u
24、art1 GPIO ports.*Input:None*Output:None*Return:None*/void UART1_GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/Configure USART1_Tx as alternate push-pull GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;G
25、PIO_Init(GPIOA,&GPIO_InitStructure);/Configure USART1_Rx as input floating GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);STM32 STM32 串口例程讲解串口例程讲解 /*Name:UART1_Configuration*/void USART_Configuration(void)USART_InitType
26、Def USART_InitStructure;/*Configure the USART1 synchronous paramters*/USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_Hardwa
27、reFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;/*Configure USART1 basic and asynchronous paramters*/USART_Init(USART1,&USART_InitStructure);/*Enable USART1 Receive interrupts*/USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/*Enable USART1*/USART_
28、Cmd(USART1,ENABLE);STM32 STM32 串口例程讲解串口例程讲解 /*Name:NVIC_Configuration*Deion:Configures NVIC and Vector Table base location.*Input:None*Output:None*Return:None*/void NVIC_Configuration(void)NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQC
29、hannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);STM32 STM32 串口例程讲解串口例程讲解 void USART1_IRQHandler(void)if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET
30、)/将数据回送至超级终端将数据回送至超级终端 USART_SendData(USART1,USART_ReceiveData(USART1);/等待数据发送完毕等待数据发送完毕 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET);/等待发送完成等待发送完成 USART_ClearFlag(USART1,USART_FLAG_TXE);/清零发送完成标清零发送完成标志位志位/等待发送完成等待发送完成 USART_ClearITPendingBit(USART1,USART_IT_RXNE);STM32 STM32 串口例程讲解串口例程讲
31、解 直接存储器存取直接存储器存取DMAv直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速的无需CPU干预的数据传输。把数据传输的任务交给DMA执行,CPU就可以去做别的事情了,提高了CPU的工作效率。Stm32有两个DMA控制器,其中DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。DMA的通道不是随便使用的,有一个预先的分配。DMA通道和请求通道和请求DMA1的通道分配的通道分配DMA2的通道分配的通道分配int main(void)RCC_Configuration();/系统时钟设置 GPIO_Configu
32、ration();/端口初始化 USART_Config(USART1);/串口1初始化 MYDMA_Config(DMA1_Channel4,(u32)&USART1-DR,(u32)SendBuff,5);while(1);例程:串口1通过DMA进行数据的发送void RCC_Configuration(void)SystemInit();/系统时钟配置为72MHZDMA编程例程编程例程void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_
33、GPIOA,ENABLE);/A口时钟配置 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;/USART1 TX GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;/复用推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/A端口 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;/USART1 RX GPIO_InitStructure.GPIO_Mode=GPIO_M
34、ode_IN_FLOATING;/复用浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure);/A端口 DMA编程例程编程例程void USART1_Config(void)USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);/串口时钟使能 USART_InitStructure.USART_BaudRate=115200;/速率115200 USART_InitStructure.USART_WordLength=USART_WordL
35、ength_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,&USA
36、RT_InitStructure);/配置串口参数函数 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);/开启串口的DMA发送功能 USART_Cmd(USART1,ENABLE);DMA编程例程编程例程void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);/*Enable DMA clock*/D
37、MA_InitStructure.DMA_PeripheralBaseAddr=cpar;/外设基地址DMA_InitStructure.DMA_MemoryBaseAddr=cmar;/内存基地址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/传送数据方向DMA_InitStructure.DMA_BufferSize=cndtr;/传送数据的大小DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;/外设地址不变DMA_InitStructure.DMA_MemoryIn
38、c=DMA_MemoryInc_Enable;/内存地址递增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;/外设数据宽度DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;/内存数据宽度DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;/不循环DMA_InitStructure.DMA_Priority=DMA_Priority_High;/DMA通道的优先级DMA_InitStructure.DM
39、A_M2M=DMA_M2M_Disable;DMA_Init(DMA_CHx,&DMA_InitStructure);DMA_Cmd(DMA_CHx,ENABLE);DMA编程例程编程例程30 AD模数模块(模数模块(Analog-to-Digital Converter),即模拟),即模拟/数数字转换器,主要功能是将连续变量的模拟信号转换为离散的字转换器,主要功能是将连续变量的模拟信号转换为离散的数字信号。由于单片机只能处理数字信号,因此,在对外部数字信号。由于单片机只能处理数字信号,因此,在对外部的模拟信号进行分析、处理的过程中,必须使用的模拟信号进行分析、处理的过程中,必须使用ADC模块
40、模块将外部的模拟信号转换成单片机所能处理的数字信号。将外部的模拟信号转换成单片机所能处理的数字信号。ADC模数转换模块分辨率分辨率 A/D转换器能分辨的最小模拟电压。例如,某款转换器能分辨的最小模拟电压。例如,某款A/D参考电压是参考电压是5V,输出,输出8位二进制数可以分辨的最小模拟电位二进制数可以分辨的最小模拟电压为压为5V2820mV;而输出;而输出12位二进制数可以分辨的最位二进制数可以分辨的最小模拟电压为小模拟电压为5V2121.22mV。输入模拟量与输出数字量之间的关系输入模拟量与输出数字量之间的关系 STM32的的ADC是是12位逐次逼近型的模拟数字转换器。它有位逐次逼近型的模拟
41、数字转换器。它有18个通道,可测量个通道,可测量16个外部和个外部和2个内部信号源(温度传感器、个内部信号源(温度传感器、内部参考电压)。内部参考电压)。ADC模数转换模块ADC编程步骤编程步骤v1、开启PA口时钟和ADC1时钟2、复位、复位ADC1,同时设置同时设置ADC1分频因子分频因子ADC时钟复位的方法是:ADC_DeInit(ADC1);分频因子要确保ADC1的时钟(ADCCLK)不要超过14Mhz。这个我们设置分频因子位6,时钟为72/6=12MHz,库函数的实现方法是:RCC_ADCCLKConfig(RCC_PCLK2_Div6);3、初始化、初始化GPIO和和ADC1参数参数
42、v GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;v GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;/模拟输入v GPIO_Init(GPIOA,&GPIO_InitStructure);/初始化GPIOA.1v ADC_InitTypeDef ADC_InitStructure;v ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;/ADC工作模式:独立模式v ADC_InitStructure.ADC_ScanConvMode=DISABLE;/AD单通道模式v ADC_I
43、nitStructure.ADC_ContinuousConvMode=DISABLE;/AD单次转换模式v ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;v/转换由软件而不是外部触发启动v ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;/ADC数据右对齐v ADC_InitStructure.ADC_NbrOfChannel=1;/顺序进行规则转换的ADC通道的数目1v ADC_Init(ADC1,&ADC_InitStructure);/根据指定的参
44、数初始化外设ADCx 4、使能、使能ADC并校准并校准使能ADC的方法:ADC_Cmd(ADC1,ENABLE);/使能指定的ADC1校准包括复位校准和AD校准执行复位校准的方法是:ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1);/等待复位校准结束执行ADC校准的方法是:ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1);/等待AD校准结束5、设置规则组的通道,启动、设置规则组的通道,启动A/D,读取,读取A/D结果结果我们这里是
45、规则序列中的第1个转换,同时采样周期为239.5,所以设置为:ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);软件开启ADC转换的方法:ADC_SoftwareStartConvCmd(ADC1,ENABLE);/使能指定的ADC1的软件转换启动功能开启转换之后,就可以获取转换ADC转换结果数据,方法是:ADC_GetConversionValue(ADC1);DAC数模转换模块/*名 称:void RCC_Configuration(void)*功 能:时钟配置*入口参数:无*出口参数:无*说 明:*调用方法:无*/
46、void RCC_Configuration(void)SystemInit();/系统时钟配置void DAC_Init(void)GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitType;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);/外设时钟使能 /*GPIO的配置*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;GPIO_Ini
47、tStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOA,&GPIO_InitStructure);/*DAC的配置*/DAC_InitType.DAC_Trigger=DAC_Trigger_None;/不要硬件触发 DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;/不要波形 DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=0;DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;DAC
48、_Init(DAC_Channel_1,&DAC_InitType);/*使能DAC*/DAC_Cmd(DAC_Channel_1,ENABLE);DAC_SetChannel1Data(DAC_Align_12b_R,0);void DAC1_Set_Vol(u16 vol)float temp;temp=vol;temp/=1000;temp=temp*4095/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,(u16)temp);int main(void)RCC_Configuration();/系统时钟配置 DAC_Init();DAC1_Set_Vo
49、l(2000);while(1);计数器模式计数器模式 TIM2-TIM5 TIM2-TIM5可以由可以由向上计数向上计数、向下计数向下计数、中央对齐中央对齐模式。模式。STM32STM32定时器简介定时器简介 向上计数模式向上计数模式:计数器从:计数器从0计数到设定的数值,然后重新从计数到设定的数值,然后重新从0开始计开始计数并且产生一个计数器溢出事件,这个事件也称为数并且产生一个计数器溢出事件,这个事件也称为更新事件更新事件。向下计数模式向下计数模式:计数器从设定的数值开始向下计数到:计数器从设定的数值开始向下计数到0,然后自动,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件,从
50、设定的数值重新向下计数,并产生一个向下溢出事件,这个事件这个事件也称为也称为更新事件更新事件。中央对齐模式中央对齐模式(向上(向上/向下计数)向下计数):计数器从计数器从0开始计数到设定的数值,开始计数到设定的数值,产生一个计数器溢出事件,然后向下计数到产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器并且产生一个计数器下溢事件;再从下溢事件;再从0开始重新计数。开始重新计数。STM32STM32定时器简介定时器简介 (1)RCC配置;配置;void RCC_Configuration(void)void RCC_Configuration(void)SystemInit();Syst