STM32F103系列学习

一、基础知识

1、ide的配置

1.1 General Options->Target中设置Device选择对应板子的ST设备。STM系列不需要安装补丁包(addon)。iar的ide软件会自带stm系列所有的组件以及例程。

image-20230404102433057.png

1.2 C/C++ Compiler->Preprocessor中配置

image-20230404103653170.png

上面部分代表的是文件目录结构下的头文件地址。

下面部分有三行

STM32F10X_HD           // MD、HD等根据板子来选择。具体对照target中选择的设备来定
USE_STDPERIPH_DRIVER   // 这个是全部一样的,表明使用标准外设
EMB_DEBUG              // 这句在编译调试阶段使用EMB_DEBUG,在烧录到板子上时使用EMB_FLASH

1.3 Linker->Config下勾选Override default。选择对应目录的icf文件


image-20230404104108095.png

这个icf文件有两个,可以放在相对目录下,也可以使用绝对目录。

STM32F10x_RAM.icf       // 这个代表的是现在调试运行阶段
STM32F10x_FLASH.icf     // 这个代表的是现在是烧录阶段

1.4 Debugger->Setup模拟时选择Simulator(模拟),通过板子来调试运行时选择J-Link/J-Trace。

image-20230404104504691.png

当选择J-Link/J-Trace时,需要选择J-Link/J-Trace->Connection->SWD

image-20230404104736776.png

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 电源
IMG_20230407_094102.jpg

电源的作用是在使用仿真器时候给MCU供电。使用时候先看好板子的电压范围,一般是3.3V,需要考虑板子是否具有稳压设置。然后先调节电压的大小,再接GND,后面再接正电源。一般小板子,不带其他额外外设的情况下, 电流应该在毫安级。

无论是板子还是电源接线时候保持一个标准。就是颜色鲜亮的作为正极,比如红色、黄色、橙色等。颜色偏暗色系的作为负极,比如黑色、蓝色等。

一般是红为正,黑为GND。或者白为正、黑为GND。

3.2 J-Link仿真器
image-20230407095608234.png

image-20230407095722852.png

J-Link仿真器上面图片是接板子的,这个可以查看电路图看到板子的J-Link接线。下面图片是通过USB连接电脑。使用时候需要在电脑上下载J-Link驱动软件。

3.3 二极管
image-20230407100621396.png

发光二极管是我们经常使用的元件。在焊接到板子上之前,需要判断二极管的正和负。

第一种是看二极管的造型,腿长的这边是正极,腿短的这边是负极。

第二种也是看,不是看腿长,是看二极管里面的样子,像现在这样,里面小的是正极,里面大的是负极。

第三种是最标准的方法,使用万用表,旋钮打到发光二极管测量。用万用表的负极接到二极管的一端,用正极短时间接触二极管的另外一端。看万用表上电压和电流。电压一般在1.8V左右,二极管发光。说明正负极接的对。如果屏幕上没显示,二极管不亮,就证明正负极接反了。

image-20230407115312413.png

二、时钟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采集的效果

image-20230407150232920.png

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 ");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容