一、基础知识
1、ide的配置
1.1 General Options->Target中设置Device选择对应板子的ST设备。STM系列不需要安装补丁包(addon)。iar的ide软件会自带stm系列所有的组件以及例程。
1.2 C/C++ Compiler->Preprocessor中配置
上面部分代表的是文件目录结构下的头文件地址。
下面部分有三行
STM32F10X_HD // MD、HD等根据板子来选择。具体对照target中选择的设备来定
USE_STDPERIPH_DRIVER // 这个是全部一样的,表明使用标准外设
EMB_DEBUG // 这句在编译调试阶段使用EMB_DEBUG,在烧录到板子上时使用EMB_FLASH
1.3 Linker->Config下勾选Override default。选择对应目录的icf文件
这个icf文件有两个,可以放在相对目录下,也可以使用绝对目录。
STM32F10x_RAM.icf // 这个代表的是现在调试运行阶段
STM32F10x_FLASH.icf // 这个代表的是现在是烧录阶段
1.4 Debugger->Setup模拟时选择Simulator(模拟),通过板子来调试运行时选择J-Link/J-Trace。
当选择J-Link/J-Trace时,需要选择J-Link/J-Trace->Connection->SWD
2、程序基本步骤
__disable_interrupt(); // 关闭所有中断,在当前系统要使用中断时使用。
SystemInit(); // 系统初始化,系统时钟初始化
RccInit(); // 时钟初始化配置
/* Vector entry configuration */ // 这儿是配置中断入口的。在ram和flash下配置的中断地址不一样,简称重新映射(remap)
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
...... // 用户程序代码
__enable_interrupt(); // 这儿是呼应开头的关闭中断、这儿是使能中断。
RccInit()
void RccInit()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 高速总线的时钟外设配置。这儿配置的是DMA1。高速总线上可配置中断、SRAM、CRC等。
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 | // 这儿是低速总线上的时钟配置使能,启用哪些外设的时钟,这儿就或什么外设,像这儿就是使
RCC_APB1Periph_USART3, ENABLE); // USART2和USART3这两个串口。
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | // 这儿是低速总线外设时钟配置使能,像这儿就使能了GPIOA-F以及GPIO的复用功能AFIO。
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF |
RCC_APB2Periph_AFIO, ENABLE);
}
3、基本工具的使用
3.1 电源
电源的作用是在使用仿真器时候给MCU供电。使用时候先看好板子的电压范围,一般是3.3V,需要考虑板子是否具有稳压设置。然后先调节电压的大小,再接GND,后面再接正电源。一般小板子,不带其他额外外设的情况下, 电流应该在毫安级。
无论是板子还是电源接线时候保持一个标准。就是颜色鲜亮的作为正极,比如红色、黄色、橙色等。颜色偏暗色系的作为负极,比如黑色、蓝色等。
一般是红为正,黑为GND。或者白为正、黑为GND。
3.2 J-Link仿真器
J-Link仿真器上面图片是接板子的,这个可以查看电路图看到板子的J-Link接线。下面图片是通过USB连接电脑。使用时候需要在电脑上下载J-Link驱动软件。
3.3 二极管
发光二极管是我们经常使用的元件。在焊接到板子上之前,需要判断二极管的正和负。
第一种是看二极管的造型,腿长的这边是正极,腿短的这边是负极。
第二种也是看,不是看腿长,是看二极管里面的样子,像现在这样,里面小的是正极,里面大的是负极。
第三种是最标准的方法,使用万用表,旋钮打到发光二极管测量。用万用表的负极接到二极管的一端,用正极短时间接触二极管的另外一端。看万用表上电压和电流。电压一般在1.8V左右,二极管发光。说明正负极接的对。如果屏幕上没显示,二极管不亮,就证明正负极接反了。
二、时钟RCC
主要是两个配置,一个是系统时钟的初始化、一个是启用的外设设备的时钟初始化
1、系统时钟
SystemInit();
2、外设时钟
void RccInit();
void RccInit()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 高速总线的时钟外设配置。这儿配置的是DMA1。高速总线上可配置中断、SRAM、CRC等。
RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 | // 这儿是低速总线上的时钟配置使能,启用哪些外设的时钟,这儿就或什么外设,像这儿就是使
RCC_APB1Periph_USART3, ENABLE); // USART2和USART3这两个串口。
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | // 这儿是低速总线外设时钟配置使能,像这儿就使能了GPIOA-F以及GPIO的复用功能AFIO。
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF |
RCC_APB2Periph_AFIO, ENABLE);
}
三、中断
1、中断分为系统异常和外部中断,中断都要有优先级。也就是说EXTI和NVIC是配套使用的。
优先级先按照组来定义,每个组再定义优先级。
2、key按键控制灯闪烁亮灭
2.1、源代码
短接PB0和PC6引脚,按下KEY2即可控制LED2的亮灭
main.c
#include "stm32f10x_conf.h" // 一般main函数引用这个文件就可以包含所有引用。
void RCC_Configuration();
void NvicInit();
void LEDInit();
void KeyInit();
void main()
{
__disable_interrupt(); // 关闭所有中断
SystemInit(); // 系统初始化
RCC_Configuration(); // 时钟初始化
/***************** Interrupt vector remap *********************/
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECTOR_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NvicInit(); // NVIC configure
KeyInit(); // Key initialize
LEDInit(); // GPIO configure
__enable_interrupt(); // 使能中断
while(1)
{}
}
/**
* 时钟初始化设置。
*/
void RCC_Configuration()
{
/* GPIOB and GPIOC and APIO clock enable */
/* APIOB的PB0用作LED2的引脚控制,GPIOC的PC0用作按键KEY2的引脚控制,AFIO是GPIO引脚的复用功能,用作中短线 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}
/**
* LED灯的引脚初始化
*/
void LEDInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
/****************** 打开PB0引脚,作为LED2灯的使能引脚 **********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
* 中断初始化
*/
void NvicInit()
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 组权限设置 当前只使用了一个中断,所以不指定组的优先级*/
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 开启9_5中断组
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 设置优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* 按键初始化
*/
void KeyInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/* 配置PC6作为按键的引脚控制,按键使用的都是悬浮模式(FLOATING) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // PC6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 输入悬浮模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); // PC作为输入
/* AFIO匹配GPIO引脚PC6作为中短线 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
/* 中断初始化 */
EXTI_InitStructure.EXTI_Line = EXTI_Line6; // 配置中短线6(EXTI_Line6)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式,另外一种是时间模式(EXTI_Mode_Event)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
2.2、步骤:
第一步:
__disable_interrupt(); // 关闭所有中断,如果当前需要使用中断,第一步是关闭所有中断
SystemInit(); // 系统时钟初始化
第二步:
RCC_Configuration(); // 时钟初始化,主要是使能GPIO口的时钟,TIMER的时钟等
/**
* 时钟初始化设置。
*/
void RCC_Configuration()
{
/* GPIOB and GPIOC and APIO clock enable */
/* APIOB的PB0用作LED2的引脚控制,GPIOC的PC0用作按键KEY2的引脚控制,AFIO是GPIO引脚的复用功能,用作中短线 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
}
第三步:
这段是中断时必须使用的,重新映射(端口重定义)。是让中断向量表在ram和flash中运行时的初始化地址不一样。
/***************** Interrupt vector remap *********************/
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECTOR_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
第四步:
NvicInit(); // NVIC configure 中断配置
KeyInit(); // Key initialize 按键配置
LEDInit(); // LED2 configure LED2的引脚初始化配置
第五步:
使能中断
__enable_interrupt(); // 使能中断
四、串口通信
1、两个板子之间互相通信
这个例程实现的是两个STM32F103的板子在两台电脑下的发送和接收数据。当接收到数据时,使能LED灯亮。
短接LED2引脚和PB0。可以控制灯的亮灭
1.1 主机
main.c
#include "stm32f10x_conf.h"
#include "misc.h"
void RCC_Configuration();
void NvicInit();
void GpioInit();
void Usart3Init();
void delay_ms(u32 i);
void DatSent();
void main()
{
__disable_interrupt(); // 关闭所有中断
SystemInit(); // 系统初始化
RCC_Configuration(); // 时钟初始化
/***************** Interrupt vector remap *********************/
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECTOR_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NvicInit(); // NVIC configure
GpioInit(); // GPIO configure
Usart3Init(); // Test communication
__enable_interrupt(); // 使能中断
while(1)
{
delay_ms(100);
DatSent(); // 发送数据 主机发送
GPIOB->ODR^=GPIO_Pin_0;
}
}
/**
* 时钟初始化设置。
*/
void RCC_Configuration()
{
/* USART3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 , ENABLE);
/* GPIOB and AFIO clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE);
}
/**
* GPIO引脚初始化
*/
void GpioInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOB的初始化,引脚是PB0,使用推挽模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void NvicInit()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/**************** NVIC配置: 使能USART3串口 *******************/
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void delay_ms(u32 i)
{
u32 temp;
SysTick->LOAD=9000*i; // 设置重装数值, 72MHZ时
SysTick->CTRL=0X01; // 使能,减到零时无动作,采用外部时钟源
SysTick->VAL=0; // 清零计数器
do
{
temp=SysTick->CTRL; // 读取当前倒计数值
}
while((temp&0x01)&&(!(temp&(1<<16)))); // 等待时间到达
SysTick->CTRL=0; // 关闭计数器
SysTick->VAL=0; // 清空计数器
}
Usart3Init()
USART3串口通讯初始化配置
void Usart3Init() //
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/************* USART3引脚配置 *********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // TX(PB10) 配置
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // RX(PB11) 配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
USART_DeInit(USART3);
/************* USART3模式配置 ********************/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_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(USART3,&USART_InitStructure);
USART_Cmd(USART3, ENABLE); // usart3 enable
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); // 使能USART_IT_RXNE中断标识
}
```c
`DatSent()`发送数据
u8 TxBuf[17] = {0xEF,0x4A,0x0C,0x00,0xA1,0xD1,0x1B,0x08,0x08,0x25,0x11,0xEA,0x24,0x02,0x00,0x00,0x00};
void DatSent()
{
u8 DynSentCnt;
for(DynSentCnt=0; DynSentCnt<17; DynSentCnt++)
{
USART_SendData(USART3, TxBuf[DynSentCnt]);
while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)==0);
}
}
##### 1.2 从机
程序一致,只是主函数中去掉发送数据。
`stm32f10x_it.c`中断程序
```c
void USART3_IRQHandler(void) // 中断句柄
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != 0) // 判接收中断标识
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE); // 清楚中断标识位
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==0) // 判断传输完成
{
USART_ClearFlag(USART3, USART_FLAG_TC); // 清楚传输完成中断标识
GPIOB->ODR^=GPIO_Pin_0; // 翻转PB0。让LED灯发生改变
}
}
}
1.3 例程的难点和重点
在RCC_Configuration()中需要使能USART3和GPIO的复用引脚AFIO。
在NvicInit()中配置中断类型是USART3。
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
在Usart3Init()中配置TX和RX引脚。其中TX引脚PB10配置为推挽模式(GPIO_Mode_AF_PP),RX引脚PB11配置为悬浮模式(GPIO_Mode_IN_FLOATING)。
在Usart3Init()中配置完成以后需要使能USART3,并且使能对应的中断标识。
USART_Cmd(USART3, ENABLE); // usart3 enable
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); // 使能USART_IT_RXNE中断标识
2、带液晶屏的板子通讯并画图
说明:
液晶屏和板子之间使用USART2通信,采集板和显示板之间使用USART3通信。
先上没有接AD采集的效果
main.c
#include "system.h"
extern double InitVoltage; // 初始电压IVO
extern double InitCurrent; // 初始电流IIO
extern double InitBiasVoltage; // 初始偏置电压IVB
extern double InitBiasCurrent; // 初始偏置电流IIB
extern double InitTransTemp; // 初始变压器温度ITT
extern double InitRadiatorTemp; // 初始散热器温度ITR
extern double InitAmbientTemp; // 初始环境温度ITA
extern double SateOfCharge; // 荷电状态SOC
extern double SateOfPower; // 电池功率状态SOP
extern double SateOfTemp; // SOT
extern double QualFact; // 质量因素QF
/******************************************************************************/
void main()
{
__disable_interrupt(); // diaable interrupt
SystemInit(); // System reset & clock configuration
RccInit(); // System initialization
/* Vector entry configuration */
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_Configuration(); // NVIC配置
Usart2Init(); // Usart2初始化
delay_ms(10);
SetBcolor(65535); // 界面背景色
GUI_CleanScreen(); // LCD清屏
window(); // LCD界面调用
initDataDisplay(); // 静态显示
Usart3Init(); // Usart3初始化
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
__enable_interrupt();
dynamicDataDisplay(); // 动态数据显示
while(1)
{
dynamicCurveDisplay(); // 动态曲线
}
}
在这个例程中,首先是基础的配置
__disable_interrupt(); // diaable interrupt
SystemInit(); // System reset & clock configuration
RccInit(); // System initialization
/* Vector entry configuration */
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_Configuration(); // NVIC配置
Usart2Init(); // Usart2初始化
delay_ms(10);
针对液晶屏的操作使用的是提供的api。
主要是这几个函数
SetBcolor(65535); // 界面背景色
GUI_CleanScreen(); // LCD清屏
window(); // LCD界面调用
...
initDataDisplay(); // 静态显示
...
dynamicDataDisplay(); // 动态数据显示
...
dynamicCurveDisplay(); // 动态曲线</pre>
先设置背景色,然后清屏。window()函数主要是画坐标系。静态显示是显示右下角的数据。动态数据显示的是正上方的动态数据和右下角的soc等。动态曲线主要是通过循环不停的打点来展示曲线,目前只画了电压和电流。并且用的都是静态值。
/****************************************************************************
* 名 称: SetBcolor()
* 功 能: 设置背景色
* 入口参数: bcolor 背景色RGB参数
* 出口参数: 无
****************************************************************************/
void SetBcolor(u16 bcolor)
{
SendBeginCMD();
SendChar(0x42);
SendChar((bcolor>>8)&0xff);
SendChar(bcolor&0xff);
SendEndCmd();
}
/****************************************************************************
* 名 称: GUI_CleanScreen()
* 功 能: 清屏
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void GUI_CleanScreen()
{
SendBeginCMD();
SendChar(0x01);
SendEndCmd();
}
/*******************************************************************************
brief: Outline of window drawing.
param: None.
retval: None.
*******************************************************************************/
void window()
{
u16 i;
/*************************** 界面外框绘制 ************************/
SetFcolor(0);
GUI_Line( 20, 40, 20, 580); // 画直线_左Y轴
GUI_Line( 20, 40, 780, 40); // 画直线_上X轴
GUI_Line(780, 40, 780, 580); // 画直线_右Y轴
GUI_Line( 20, 580, 780, 580); // 画直线_下X轴
/*************************** 界面右下角框绘制 ************************/
SetFcolor(0);
GUI_Line( 550, 440, 550, 580); // 画直线_左Y轴
GUI_Line( 550, 440, 780, 440); // 画直线_上X轴
/********************* X轴刻度及坐标绘制 ************************/
DisText(764, 582, 0, 5, "分钟"); // 右下角显示"min"
for(i=20;i<=760;i+=70) // X底部大刻度线(间隔:70dot)显示
{
GUI_Line(i,580,i,572); // 大刻度画线
DisData(i-20,583,0,5,(i-20)/7); // 坐标值
}
for(i=20;i<=780;i+=7 ) // X底部小刻度线(间隔:7dot)显示
{
GUI_Line(i,580,i,576); // 小刻度画线
}
/********************* Y轴刻度及坐标绘制 ************************/
for(i=40;i<=580;i+=20) // Y大刻度线(间隔:40dot)
{
GUI_Line(20,i,28,i); // 大刻度画线
if((580-i)/20)
DisData1(2,i-9,0,5,(580-i)/20);//坐标值
}
for(i=44;i<=580;i+=4 ) //小刻度线(间隔:4dot)
{
GUI_Line(20,i,24,i); // 小刻度画线
}
}
/**
* 静态数据初始化展示
*/
void initDataDisplay()
{
/** 初始值的定义 **/
InitVoltage = 45.66;
InitCurrent = 0.45;
InitBiasVoltage = 34.44;
InitBiasCurrent = 1.45;
InitTransTemp = 45.55;
InitRadiatorTemp = 34.66;
InitAmbientTemp = 23.98;
/** 初始函数实现 **/
InitVoltDis(InitVoltage);
InitCurrDis(InitCurrent);
InitBiasVoltDis(InitBiasVoltage);
InitBiasCurrDis(InitBiasCurrent);
InitTransTempDis(InitTransTemp);
InitRadiatorTempDis(InitRadiatorTemp);
InitAmbientTempDis(InitAmbientTemp);
}
/**
* 动态曲线
*/
void dynamicCurveDisplay()
{
X_PotCnt++; // X打点计数器+1
x_coordinate=X_OFFSET+((X_PotCnt)/INTERVAL); // 当前X坐标值计算
/*********************** 电压曲线显示 ************************/
SetFcolor(63488); // 曲线颜色:红
y_volt=Y_HIGH-(u16)(Y_VALIDHIGH*(Voltage/VOLTRANGE)); // 电压量程范围:0~72.500,满度对应10格大刻度
if(x_coordinate < 780)
{
GUI_Dot(x_coordinate, y_volt); // GUI打点函数:电压曲线绘制
/*********************** 电流曲线显示 ************************/
SetFcolor(31); // 曲线颜色:兰
y_curr=Y_HIGH-(u16)(Y_VALIDHIGH*(Current/CURRRANGE)); // 电流量程范围:10A,满度对应10格大刻度
GUI_Dot(x_coordinate, y_curr); // GUI打点函数:电压曲线绘制
}
}
InitVoltDis(double vid)
/**
* 初始输出电压展示IVO
*/
void InitVoltDis(double ivd)
{
SetFcolor(18572); // 显示标题颜色:黑
DisText(565,450,1,5, "IVO:"); // 显示标题
SetFcolor(63488); // 红
sprintf(data,"%2.2f", ivd); // 时间字符显示:min
DisText(600,450,1,5,data);
SetFcolor(31); // 红
DisText(645, 450, 1, 5, "mV ");
}