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,需要考慮板子是否具有穩(wěn)壓設置。然后先調節(jié)電壓的大小,再接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

發(fā)光二極管是我們經常使用的元件。在焊接到板子上之前,需要判斷二極管的正和負。

第一種是看二極管的造型,腿長的這邊是正極,腿短的這邊是負極。

第二種也是看,不是看腿長,是看二極管里面的樣子,像現在這樣,里面小的是正極,里面大的是負極。

第三種是最標準的方法,使用萬用表,旋鈕打到發(fā)光二極管測量。用萬用表的負極接到二極管的一端,用正極短時間接觸二極管的另外一端??慈f用表上電壓和電流。電壓一般在1.8V左右,二極管發(fā)光。說明正負極接的對。如果屏幕上沒顯示,二極管不亮,就證明正負極接反了。

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、中斷分為系統異常和外部中斷,中斷都要有優(yōu)先級。也就是說EXTI和NVIC是配套使用的。

優(yōu)先級先按照組來定義,每個組再定義優(yōu)先級。

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;

 /* 組權限設置 當前只使用了一個中斷,所以不指定組的優(yōu)先級*/
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 開啟9_5中斷組
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 設置優(yōu)先級為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; // 下降沿觸發(fā)
 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的板子在兩臺電腦下的發(fā)送和接收數據。當接收到數據時,使能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();                    // 發(fā)送數據 主機發(fā)送
 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()`發(fā)送數據

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 從機

程序一致,只是主函數中去掉發(fā)送數據。

`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燈發(fā)生改變
 }
 }
}
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;       // 初始環(huán)境溫度ITA
extern double SateOfCharge;       // 荷電狀態(tài)SOC
extern double SateOfPower;       // 電池功率狀態(tài)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();                                 // 靜態(tài)顯示
 Usart3Init();                                      // Usart3初始化
 USART_Cmd(USART3, ENABLE);
 USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
 __enable_interrupt();
 dynamicDataDisplay();                             // 動態(tài)數據顯示
 while(1)
 {
 dynamicCurveDisplay();                        // 動態(tài)曲線
 }
}

在這個例程中,首先是基礎的配置

 __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();                                 // 靜態(tài)顯示
...
dynamicDataDisplay();                             // 動態(tài)數據顯示
...
dynamicCurveDisplay();                        // 動態(tài)曲線</pre>

先設置背景色,然后清屏。window()函數主要是畫坐標系。靜態(tài)顯示是顯示右下角的數據。動態(tài)數據顯示的是正上方的動態(tài)數據和右下角的soc等。動態(tài)曲線主要是通過循環(huán)不停的打點來展示曲線,目前只畫了電壓和電流。并且用的都是靜態(tài)值。

/****************************************************************************
* 名    稱: 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);            // 小刻度畫線
 }
}

/**
* 靜態(tà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);
}

/**
 * 動態(tài)曲線
 */
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 ");
}
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容