ADCDMAUSART的综合练习文档格式.docx
- 文档编号:18365014
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:10
- 大小:19.57KB
ADCDMAUSART的综合练习文档格式.docx
《ADCDMAUSART的综合练习文档格式.docx》由会员分享,可在线阅读,更多相关《ADCDMAUSART的综合练习文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
作者:
jjldc(九九)
*******************************************************************************/
/*Includes------------------------------------------------------------------*/
#include"
stm32f10x_lib.h"
/*Privatetypedef-----------------------------------------------------------*/
/*Privatedefine------------------------------------------------------------*/
#defineADC1_DR_Address
((u32)0x4001244C)
/*Privatemacro-------------------------------------------------------------*/
/*Privatevariables---------------------------------------------------------*/
vu16AD_Value[2];
vu16i=0;
s16
Temp;
u16
Volt;
/*Privatefunctionprototypes-----------------------------------------------*/
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidNVIC_Configuration(void);
voidUSART1_Configuration(void);
voidADC1_Configuration(void);
voidDMA_Configuration(void);
intfputc(intch,FILE*f);
voidDelay(void);
u16GetTemp(u16advalue);
u16GetVolt(u16advalue);
/*Privatefunctions---------------------------------------------------------*/
/*******************************************************************************
*FunctionName
:
main
*Description
Mainprogram.
*Input
None
*Output
*Return
intmain(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
USART1_Configuration();
DMA_Configuration();
ADC1_Configuration();
//启动第一次AD转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//因为已经配置好了DMA,接下来AD自动连续转换,结果自动保存在AD_Value处
while
(1)
{
Delay();
Temp=GetTemp(AD_Value[1]);
Volt=GetVolt(AD_Value[0]);
USART_SendData(USART1,0x0c);
//清屏
//注意,USART_SendData函数不检查是否发送完成
//等待发送完成
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
printf("
电压:
%d.%d\t温度:
%d.%d℃\r\n"
\
Volt/100,Volt%100,Temp/100,Temp%100);
}
}
重定义系统putchar函数intfputc(intch,FILE*f)
串口发一个字节
intch,FILE*f
intch
intfputc(intch,FILE*f)
//USART_SendData(USART1,(u8)ch);
USART1->
DR=(u8)ch;
/*Loopuntiltheendoftransmission*/
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)
returnch;
Delay
延时函数
voidDelay(void)
u32i;
for(i=0;
i<
0x4f0000;
i++);
return;
}
GetTemp
根据ADC结果计算温度
u16advalue
u16temp
u16GetTemp(u16advalue)
u32Vtemp_sensor;
s32Current_Temp;
//
ADC转换结束以后,读取ADC_DR寄存器中的结果,转换温度值计算公式如下:
V25-VSENSE
T(℃)=------------
+25
Avg_Slope
V25:
温度传感器在25℃时的输出电压,典型值1.43V。
VSENSE:
温度传感器的当前输出电压,与ADC_DR寄存器中的结果ADC_ConvertedValue之间的转换关系为:
ADC_ConvertedValue*Vdd
VSENSE=--------------------------
Vdd_convert_value(0xFFF)
Avg_Slope:
温度传感器输出电压和温度的关联参数,典型值4.3mV/℃。
Vtemp_sensor=advalue*330/4096;
Current_Temp=(s32)(143-Vtemp_sensor)*10000/43+2500;
return(s16)Current_Temp;
GetVolt
根据ADC结果计算电压
u16GetVolt(u16advalue)
return(u16)(advalue*330/4096);
}
RCC_Configuration
系统时钟设置
voidRCC_Configuration(void)
ErrorStatusHSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振稳定
HSEStartUpStatus=RCC_WaitForHSEStartUp();
//如果外部晶振启动成功,则进行下一步操作
if(HSEStartUpStatus==SUCCESS)
//设置HCLK(AHB时钟)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1)=HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2)=HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置ADC时钟频率
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
//FLASH时序控制
//推荐值:
SYSCLK=0~24MHz
Latency=0
//
SYSCLK=24~48MHz
Latency=1
SYSCLK=48~72MHz
Latency=2
FLASH_SetLatency(FLASH_Latency_2);
//开启FLASH预取指功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//PLL设置SYSCLK/1*9=8*1*9=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//启动PLL
RCC_PLLCmd(ENABLE);
//等待PLL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//系统时钟SYSCLK来自PLL输出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切换时钟后等待系统时钟稳定
while(RCC_GetSYSCLKSource()!
=0x08);
//下面是给各模块开启时钟
//启动GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|\
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,\
ENABLE);
//启动AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//启动USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//启动DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//启动ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
GPIO_Configuration
GPIO设置
voidGPIO_Configuration(void)
GPIO_InitTypeDefGPIO_InitStructure;
//PC口4567脚设置GPIO输出,推挽2M
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&
GPIO_InitStructure);
//KEY2KEY3JOYKEY
//位于PD口的3411-15脚,使能设置为输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_11|GPIO_Pin_12|\
GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD,&
//USART1_TX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&
//USART1_RX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
//ADC_CH10-->
PC0
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
NVIC_Configuration
NVIC设置
voidNVIC_Configuration(void)
NVIC_InitTypeDefNVIC_InitStructure;
#ifdef
VECT_TAB_RAM
//SettheVectorTablebaselocationat0x20000000
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
/*VECT_TAB_FLASH
*/
//SettheVectorTablebaselocationat0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
//设置NVIC优先级分组为Group2:
0-3抢占式优先级,0-3的响应式优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//串口中断打开
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChann
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADCDMAUSART 综合 练习
![提示](https://static.bdocx.com/images/bang_tan.gif)