首先我写的代码是参考正点原子的库函数源代码,其形式与正点原子源代码保持一致。HARDWARE文件夹中为每一个传感器,包括CAN通讯都新建了一个源文件和头文件,方便主程序直接引用,如下图

那我们来一个个展示:
1.NTC热敏电阻,其采用是adc(PA1)采集:
头文件adc.h
#include "stm32f10x.h"
#include <math.h>
#define NUMSAMP 640
#define NUMHEAD 40
#define TEMPMAX 4090
#define TEMPMIN 0
extern void ADC1_Init(void);
extern void StartADC(void);
extern void StopADC(void);
extern float HandleADCTemp(void);
源文件adc.c
#include "stm32f10x.h"
#include "adc.h"
#include "delay.h"
volatile unsigned int ADC_Buf[NUMSAMP+1]; //放单片机ADC采集原始值
volatile unsigned int ADC_BufCnt=0; //采集量变量
/**************************************************************************************
* 描 述 : 初始化ADC1
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); //使能ADC1用时钟和PA口时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子为6,ADCCLK=PCLK2/6
//配置PA1为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件控制ADC转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //转换ADC通道的数目为1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_DMACmd(ADC1,DISABLE); //失能ADC1的DMA请求
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE); //使能ADC1中断
ADC_Cmd(ADC1,ENABLE); // 使能ADC1
ADC_ResetCalibration(ADC1); //重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC的校准程序
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC_Group:先占优先级2位,从优先级2位
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //配置为ADC1_2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //先占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
}
/**************************************************************************************
* 描 述 : 启动指定的ADC通道开始AD转换
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void StartADC(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //开通通道3,即PA3
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE); //使能ADC1中断
ADC_Cmd(ADC1,ENABLE); //把ADC从断电模式下唤醒
delay_ms(1); //在转换器上电至转换开始有一个延时tSTAB
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发ADC转换
}
/**************************************************************************************
* 描 述 : 关闭ADC1
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void StopADC(void)
{
ADC_ITConfig(ADC1, ADC_IT_EOC,DISABLE); //关闭ADC1中断
ADC_Cmd(ADC1,DISABLE); // 关闭ADC1
}
/**************************************************************************************
* 描 述 : ADC1中断服务函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************************/
void ADC

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



