基于STM32的数字电压表的设计 下载本文

内容发布更新时间 : 2024/5/22 17:02:14星期一 下面是文章的全部内容请认真阅读。

行操作。

从FSMC的角度看,可以把外部存储器划分为固定大小为256M字节的四个存储块。

● 存储块1用于访问最多4个NOR闪存或PSRAM存储设备。这个存储区被划分为4个NOR/PSRAM区并有4个专用 的片选。

● 存储块2和3用于访问NAND闪存设备,每个存储块连接一个NAND闪存。 ● 存储块4用于访问PC卡设备,每一个存储块上的存储器类型是由用户在配置寄存器中定义的。

四、设计程序(命令)清单以及程序流程图

1、主程序:

int main(void)

{ u16 len, c2len,c3len,c4len; u8 c[] = \ Voltage \ u8 c2[] = \ \ u8 c3[] = \ \ u8 c4[] = \ . V \ u16 bkColor;

len = sizeof(c)-1; //计算字节数长度sizeof()

c2len = sizeof(c2)-1; c3len = sizeof(c3)-1; c4len = sizeof(c2)-1; bkColor = White;

RCC_Configuration(); //系统时钟配置为72MHz Usart1_Init(); //串口1初始化 ADC_Configuration(); //ADC初始化 FSMC_LCD_Init(); //FSMC总线配置 lcd_Init(); //液晶初始化 // lcd_PutChar(10,10,'g',0x0000,0xffff); // LCD_test();

USART_OUT(USART1,\ while (1) {

if (ticks++ >= 900000) { //间隔时间显示转换结果 ticks = 0; Clock1s = 1; } if (Clock1s) { Clock1s = 0;

USART_OUT(USART1,\串口显示字符段 //Delay(0xAFFFFf); Precent = (ADC_ConvertedValue*100/4096);// 算出百分比,2的12次幂为0xfff Voltage = Precent*33; // Voltage为实际电压值的1000倍. c4[3]=(Voltage/1000+'0') ; // 取千位数的整数部分 c4[5]=((Voltage00)/100+'0') ; //对千位数取余数后再取其百位的整数部分 c4[6]=(((Voltage0)/10)+'0') ; //对百位数取余数后再取其十位的整数部分 c4[7]=((Voltage)+'0') ; //对百位数取余数后再取其个位的整数部分 lcd_PutStr_16x24_Center(0, c3, c4len,Black, bkColor); lcd_PutStr_16x24_Center(Line1, c, len,Black, bkColor); lcd_PutStr_16x24_Center(Line2, c3, c3len,Black, bkColor); lcd_PutStr_16x24_Center(Line3, c4, c4len,Black, bkColor); lcd_PutStr_16x24_Center(Line4, c2, c2len,Black,bkColor); USART_OUT(USART1,\v value = %d.%d%d%d V\\r\\n\ c4[3]=(Voltage/1000),c4[5]=((Voltage00)/100),c4[6]=(Voltage0)/10,c4[7]=(Voltage)); //显示实际电压值 LCD_test(); } } }

2、ADC配置:

ADC_Configuration函数用于配置ADC1的通道11,因为只用了ADC1所以采

用了ADC独立模式,设置通道11进入规则组,规则组里的通道只有1个,就是通道1,转换用了扫描方式,软件触发,转换结果采用DMA方式传递到2字节长度的缓存区里(ADC_ConvertedValue),默认的ADCCLK为36MHz,采样周期是55.5+12.5时钟周期,相当于采样时间是间隔(68/36)us。

void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure;

//设置AD模拟输入端口为输入 1路AD 规则通道 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Enable DMA clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable ADC1 and GPIOC clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);

/* DMA channel1 configuration ----------------------------------------------*/ //使能DMA DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //DMA通道1的地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //DMA传送地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

//传送方向 DMA_InitStructure.DMA_BufferSize = 1; //传送内存大小,100个16位 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //传送内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //ADC1转换的数据是16位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //传送的目的地址是16位宽度 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环

DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* 允许DMA1通道1传输结束中断 */

//DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE); //使能DMA通道1

DMA_Cmd(DMA1_Channel1, ENABLE);

//ADC配置 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16 ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channels configuration [规则模式通道配置]*/

//ADC1 规则通道配置

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5); //通道11采样时间 55.5周期 //使能ADC1 DMA ADC_DMACmd(ADC1, ENABLE); //使能ADC1 ADC_Cmd(ADC1, ENABLE); }

// 初始化ADC1校准寄存器 ADC_ResetCalibration(ADC1); //检测ADC1校准寄存器初始化是否完成 while(ADC_GetResetCalibrationStatus(ADC1));

//开始校准ADC1

ADC_StartCalibration(ADC1); //检测是否完成校准

while(ADC_GetCalibrationStatus(ADC1)); //ADC1转换启动

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

3、程序流程图: START ADC、串口、液晶初始化 启动A/D转换 读取ADC状态 A/D转换结束? 读取A/D转换结束 处理A/D转换 写入寄存FSMC 启动串口

启动LCD 串口数据传输 读出寄存器FSMC,LCD显示 电压值显示

结束