软件设计报告(10100字)

发表于:2020.10.12来自:www.fanwen118.com字数:10100 手机看范文

编号

密级

阶段标记

软件设计报告

软件设计报告

页数

编写

校对

审核

标审

批准

北京国科环宇空间技术有限公司

20xx年6月8日

目录

1 时序板软件设计 ............................................................................ 3

2 时序板软件模块设计 .................................................................... 3

2.1 数据接收发送模块详细设计 ............................................. 3

2.1.1 I2C模块初始化 ........................................................ 3

2.1.2 I2C发送数据(单片机是I2C通信的主机) ............. 4

2.1.3 I2C接收数据信息(单片机是I2C通信丛机模式) . 6

2.2 电压采集详细设计 ............................................................. 8

2.2.1 ADC模块初始化 ...................................................... 8

2.2.2 ADC数据处理 ........................................................ 10

2.3 温度采集详细设计 ........................................................... 10

2.2.1 温度传感器驱动 .................................................... 10

2.2.2 各寄存器描述 ........................................................ 11

2.2.3 温度处理 ................................................................ 12

3 函数主程序介绍 .......................................................................... 12

3.1 初始化介绍 ....................................................................... 12

3.1.1 变量初始定义 ........................................................ 12

3.1.2 模块配置 ................................................................ 12

3.2 主程序介绍 ....................................................................... 13

3.2.1 数据接收 ................................................................ 13

3.2.2 数据分析处理 ........................................................ 13

3.2.3 数据发送 ................................................................ 14

3.3 软件流程 ........................................................................... 15

1时序板软件设计

时序板软件部分的主控芯片采用的是STM32F103C8T6单片机,主要完成的功能是接收来自时序版逻辑模块的指令信息,对自身的电压和温度进行检测以及将结果发送出去。数据的接收和发送采用的是I2C总线。下图所示是时序版软件部分的结构图。 I2C

软件设计报告

2时序板软件模块设计

本软件涉及到的数据接收发送和数据采集。数据采集包括电压采集和温度采集。主要涉及到STM32F103C8T6单片机的I2C模块,ADC模块,GPIO模块。

2.1 数据接收发送模块详细设计

数据接收发送的I2C接口主要用于接收来自BMC主控板的指令信息,同时将自身采集到的温度和电压信息通过此接口返回到BMC主控板。

STM32F103C8T6单片机共有两个I2C模块,分别是STM32F103C8T6单片机硬件的43引脚(I2C1_SDA)、42引脚(I2C1_SCL)、22引脚(I2C2_SDA)、21引脚(I2C2_SCL),本设计中只用到了I2C1,I2C2的引脚直接拉低接地。

2.1.1 I2C模块初始化

软件中具体指的是I2C_Configuration()子函数中的内容,下面将

对这个函数进行详细的介绍。

①I2C复位使能

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2,ENABLE)使能I2C模块

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE)使能复用引脚

②配置SDA和SCL总线

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_10|GPIO_Pin_11配置I2C1的SCL为GPIO的PB6,SDA为GPIO的PB 7,配置I2C2的SCL为GPIO的PB10,SDA为GPIO的PB11

②配置I2C基本信息

I2C的时钟速率为100000Hz,I2C_InitStructure.I2C_ClockSpeed = 100000

使能I2C应答模式,I2C_InitStructure.I2C_Ack = I2C_Ack_Enable 使能I2C应答, I2C_AcknowledgeConfig(I2Cx, ENABLE);

2.1.2 I2C发送数据(单片机是I2C通信的主机)

voidDrv_I2C_Write(I2C_TypeDef

*buf,uint16_t num)

函数描述:I2C发送数据

函数功能:将采集到的自身传感器信息发送回BMC主控板

函数参数:I2Cx----I2C通道选择,可选择1或者2

I2C_Addr-------发送数据信息的目标地址

buf------发送的数据信息

num-----发送数据的字节数

实现过程:

①产生I2C通信启动信号

*I2Cx,u8 I2C_Addr,u8

voidI2C_GenerateSTART(I2C_TypeDef*

FunctionalStateNewState)

函数描述:启动一个I2C通道

函数参数:I2Cx----I2C通道选择,可选择1或者2 I2Cx,

NewState-----I2C通道状态,可选择ENABLE或者

DISENABLE

②启动信号完成确认

ErrorStatus

I2C_EVENT) I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t

函数描述:确认总线是否空闲

函数参数:I2Cx----I2C通道选择,可选择1或者2

I2C_EVENT---I2C目前状态事件,可选择BUSY、MSL、ADDR等状

注意:此函数必须在I2C_GenerateSTART之后使用,用于保证此

时I2C总线处于闲的状态,CPU可以控制I2C进行

后面的操作。

③写目标地址

void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction)

函数描述:发送字节地址用于选择发送数据信息的从设备

函数参数:I2Cx----I2C通道选择,可选择1或者2

Address---发送数据的目标地址 I2C_Direction---I2C的方向,可选择接受或者发送

④目标地址完成确认

具体参考步骤②

注意:此函数必须在写完目标地址后使用,用于确保写完成。

⑤发送数据信息

void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data)

函数描述:用于发送数据

函数参数:I2Cx----I2C通道选择,可选择1或者2

Data---发送的数据

⑥发送完成确认

具体参考步骤②

注意:此函数必须在发送数据完成后,用于确保数据已经完全发

送完成。

⑦产生I2C通信停止信号

void I2C_GenerateSTOP(I2C_TypeDef*

FunctionalStateNewState)

函数描述:停止一个I2C通道

函数参数:I2Cx----I2C通道选择,可选择1或者2

NewState-----I2C通道状态,可选择ENABLE或者

DISENABLE I2Cx,

2.1.3 I2C接收数据信息(单片机是I2C通信丛机模式)

需要注意的是I2C作为丛机模式时,其读数据的位置都是确定的,因此在读取数据时需要对I2C总线的状态分别进行多次判断。

uint16_t Drv_I2C_Read(I2C_TypeDef *I2Cx,u8 *buf,uint16_t num) 函数描述:I2C接收数据

函数功能:从BMC主控板接收指令信息

函数参数:I2Cx----I2C通道选择,可选择1或者2

buf-----接收数据缓存区

num-------接收到的数据字节数

实现过程:

①接收启动信号

while(!I2C_CheckEvent(I2Cx,I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED))

注意:I2C_CheckEvent函数的主要功能详见I2C发送数据的步骤②。在I2C接收数据过程中,此步骤相当于一个接收启动信号,意味着单片机在I2C总线的主机地址后又检测到一个启动信号

②检测接收标志

while(!I2C_CheckEvent(I2Cx,I2C_EVENT_SLAVE_BYTE_RECEIVED_DBG));

注意:I2C_CheckEvent函数的主要功能详见I2C发送数据的步骤②。I2C接收数据过程中,当完成了第一步接收启动后需要对接收标志进行判断,为确保准确的接收数据。

③接收数据并存储

*buf= I2C_ReceiveData(I2Cx);

语句描述:接收数据并且存储

语句功能:通过I2C总线接收数据信息,并且将其保存在数据缓

存区buf中。

语句参数:I2Cx----I2C通道选择,可选择1或者2

buf-----接收数据缓存区

④接收停止信号

while(!I2C_CheckEvent(I2Cx,I2C_EVENT_SLAVE_STOP_DETECTE

D));

注意:I2C_CheckEvent函数的主要功能详见I2C发送数据的步骤

②。

⑤清空接收标志

I2C_ClearFlag(I2Cx, I2C_FLAG_STOPF);

函数描述:清楚接收标志

函数参数:I2Cx----I2C通道选择,可选择1或者2

I2C_FLAG_STOPF------清楚标志

2.2 电压采集详细设计

本软件中电压采集主要使用的是STM32F103C8T6单片机自带的ADC模块,共采集单片机板上的六路电压值,即EVM_1V0、EVM_1V8、EVM_2V5、EVM_3V3、EVM_5V0、3V3_AUX,硬件上分别连接的是STM32F103C8T6单片机的17、15、16、14、10和11引脚。

STM32F103C8T6单片机的DMA通道支持ADC外设的使用,本软件中采用DMA的方式直接将ADC转换的结果通过DMA读出存储于缓存区中。本软件采用单片机自带的ADC模块,因此数据采集为12位的。

下面将介绍ADC模块的工作流程

2.2.1 ADC模块初始化

本软件中ADC模块中使用了DMA,进行初始化时不仅需要初始化ADC的基本功能,同时还需要对DMA进行配置。ADC_Voltage_Configuration()配置项有以下几种:

①使能ADC和DMA模块

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1

RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE);

②配置GPIO的方向

对自身的电压值进行采集时,硬件接口上直接连接的是IO引脚,因此需要对IO引脚的方向进行控制。将引脚设置为输入模式,用于ADC的采集。

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

|

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

③DMA的配置

设置DMA的原地址为ADC1地址,即DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;

DMA的目标地址为ADC_ConvertedValue,即DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;

DMA数据缓冲区大小为

DMA_InitStructure.DMA_BufferSize = 6;

④ADC配置

选择ADC为独立工作模式,即ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

使能6个ADC通道,即ADC_InitStructure.ADC_NbrOfChannel = 6;

每个ADC通道的采样时间和对应传感器位置设置,即ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);其中ADC的采样周期为ADC_SampleTime_239Cycles5,ADC通道0对应1号电压传感器,依次类推。

⑤启动ADC采集

首先需要将ADC和DMA通道使能,即ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);

然后复位ADC采集寄存器并且等待复位完成,即 ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));

接下来使能ADC采集等待采集完成,即 ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));

6个字节,即

最后,启动ADC转换过程,即ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2.2.2 ADC数据处理

2.2.1中ADC模块的初始化启动了ADC转换模块,STM32F103C8T6单片机会自动在内部进行转换数据存储于ADC_ConvertedValue[6]数组中。数据处理转换时只需要调用函数下面函数即可。

void drv_ipmc_get_voltage_sensor(void)

函数描述:ADC数据处理

函数功能:将单片机转换的ADC数字量转换为实际的电压值并

且存储于电压缓冲区voltage_sensor_value[6]。

数据处理:ADC为12位的,参考电压为3.3V,根据数模转换公

式可获得真实的电压值。如程序中所使用的转换方式:

voltage_sensor_value[uiLoop]=(voltage_sensor_value[u

iLoop]/4096)*3.3;

2.3温度采集详细设计

板中有一个单线温度传感器TMP141,通过它来实时监测单板工作温度环境,并将其结果发送出去。STM32f103的PA8连接TMP141的SWD管脚。通过PA8来模拟TMP141的读写时序。下面介绍温度采集子函数:

floatdrv_ipmc_get_temp_sensor(void)

函数描述:读取温度传感器值

函数功能:读取TMP141的温度传感器的值,并且将其进行处理 返回值:温度转换的数字量

2.2.1 温度传感器驱动

TMP141为单线温度传感器,需要通过GPIO模拟芯片时序来实现对温度的读取。TMP141驱动过程如下图所示:

2.2.2 各寄存器描述

a) Device Control寄存器

由硬件连接得到TMP141的设备地址是0x03写Device Control寄存器,地址0x05,设置该寄存器的Bit4,Enable Function1(ENAB)为1,即可使能温度测量。使用的函数为:

voidwrite_byte(u16 device_NO,u16 reg_NO,u16 data)

函数描述:向某一寄存器写值

函数功能:使能TMP141的设备控制寄存器,启动开始工作。 函数参数:device_NO-------设备地址0x03

reg_NO-----TMP141的设备控制寄存器0x05

data-----要写入控制寄存器的值,可选ENABLE或者DISENABLE。

b) Temperature Conrol寄存器

写Temperature Control寄存器,地址为0x0A,设置该寄存器的Bit1,Enable Sensor(EN_S)为1,开始温度测量。使用的函数与设备控制寄存器中相同。

c) Temperature Readout寄存器

读Temperature Readout寄存器,地址0x09,通过读取该寄存器即可获取温度值。使用的函数如下:

软件设计报告

u16 read_byte(u16 device_NO,u16 reg_NO)

函数描述:读取某一个设备寄存器中的值

函数功能:用于从TMP141的温度读取寄存器中读取温度传感器

转换的值。

函数参数:device_NO-------设备地址0x03

reg_NO-----TMP141的设备控制寄存器0x09

函数返回:返回16位的温度数字量

2.2.3 温度处理

TMP141温度传感器进行转换后会得到的是温度对应的数字信息,根据其TMP141的手册表将数字信息进行转换得到其准确的温度数据。

3 函数主程序介绍

本软件中函数的主程序实现的是一个数据接收,采集和发送的大的循环过程。接下来将按照主程序的运行过程介绍每一个循环过程。

3.1 初始化介绍

初始化中包括对变量的初始定义,模块配置,缓冲区清缓存等。

3.1.1 变量初始定义

stIPMC_Messageipmc_sensor_message;对结构体的数据进行初始化,此结构体里边存储的发送数据的完整一包科学数据。

u32 sensor_value = 0;u8 I2C2_Buffer_Rx[8] = {0};float current_sensor_value=0;float tmp141_sensor_value = 0;此四个语句是对软件中使用的变量进行清零操作。

3.1.2 模块配置

本软件中使用了GPIO,I2C和ADC模块,因此在主函数中需要分别对此模块进行初始设置。ADC_Voltage_Configuration()指ADC配置,详见2.2.1中的ADC模块初始化,I2C_Configuration()详见2.1.1中的初始化配置。Onewire_Enable_GPIO_Port();指的是使能GPIO引

脚,主要使用的函数是RCC_APB2PeriphClockCmd,下面是对此函数额的说明。

说明:使能高速APB2接口时钟

原型:voidRCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,

FunctionalStateNewState)

函数参数:

软件设计报告

3.2 主程序介绍

3.2.1 数据接收

单片机上电进行初始化之后等待接收来自BMC主控板的指令信息Drv_I2C_Read(I2C1, I2C2_Buffer_Rx,sizeof(I2C2_Buffer_Rx))。通过I2C1总线接口,将接收到的数据缓存在I2C2_Buffer_Rx中,共8个字节。

3.2.2 数据分析处理

首先需要分析I2C2_Buffer_Rx缓冲区每一个字节的含义,若if( I2C2_Buffer_Rx[1]== 1 )表示主控板发来的指令信息是确认此时单片机板是否正常工作,若指令正确则将设备头,单片机板地址等保存在结构体返ipmc_sensor_message存储空间内,然后将此结构体中保存的数据返回给BMC主控板。返回的值主要有以下几个: ipmc_sensor_message.ucRev = 0xAA;设备的代码

ipmc_sensor_message.MessageType = I2C2_Buffer_Rx[1];接收到的指令信息

ipmc_sensor_message.SlotAddr = board_own_addr;单片机板的地址

0x1C

ipmc_sensor_message.SlotNum = I2C2_Buffer_Rx[2];单片机板槽的标号

若if( I2C2_Buffer_Rx[1]== 2 )表示此时主控板发来的指令信息是传感器的命令,单片机开始进行数据采集。首先需要将一些固定的值存储在结构体ipmc_sensor_message存储空间内,存储方式与3.2.2中相同,其次需要对I2C2_Buffer_Rx[4]信息进行判断。假若if(I2C2_Buffer_Rx[4] == voltage_sensor)表示此时主控板需要的是单片机板六个电压值;假若if(I2C2_Buffer_Rx[4] == temp_sensor)表示此时主控板需要得到单片机板的温度值,然后在进行处理。

1、 if(I2C2_Buffer_Rx[4] == voltage_sensor)

数据分析得到此命令时表示电压采集,此时直接调用drv_ipmc_get_voltage_sensor()函数即可,获得的六个电压值存储在voltage_sensor_value[6]缓冲区中,接下来通过I2C2_Buffer_Rx[5]判断的是哪个电压值,然后根据对应关系将其存储在ipmc_sensor_message.SensorValue[2]中。

2、 if(I2C2_Buffer_Rx[4] == temp_sensor)

数据分析得到此命令时表示需要进行温度采集,调用函数drv_ipmc_get_temp_sensor()即可获得温度值,然后将其存储在ipmc_sensor_message.SensorValue[2]存储空间中。

3.2.3 数据发送

数据发送时直接调用函数Drv_I2C_Write(I2C1,board_one_addr<<1,(u8*)&ipmc_sensor_message,sizeof(ipmc_sensor_message)),此函数的具体描述详见2.1中即可,数据发送的格式如下表所示。

3.3 软件流程

主程序流程如下图所示。

软件设计报告

软件设计报告



更多类似范文
┣ 软件工程课程设计报告书模板 1200字
┣ 半导体器件物理软件设计报告 18600字
┣ 软件课程设计报告 5400字
┣ 大整数计算器软件设计报告 6800字
┣ 更多软件设计报告
┗ 搜索类似范文

更多相关推荐:
模板-实用软件课程设计报告4400字

实验报告实用软件课程设计实用软件课程设计报课程题目你的课程设计题目作者姓名指导教师学科专业所在学院信息工程学院提交日期告实验报告实用软件课程设计题目换成所选择的题目作者你的名字学号你的学号班级信息101联系方式...

程序设计报告模板4100字

北京化工大学计算机科学与技术专业20xx程序设计实训报告题目个人记账软件专业计算机科学与技术班级计科1305指导教师江志英北京化工大学20xx程序设计实训20xx程序设计实训任务书I北京化工大学20xx程序设计...

绘图软件_课程设计报告30300字

windows应用程序编程与设计课程设计报告学院系专业班级学生姓名学号1007105230指导教师赵欢喜时间从20xx年1月4日到20xx年1月14日报告摘要本课程设计是利用C编程来实现绘图应用程序通信录应用程...

专栏推荐
大家在关注

地图地图CC