优化延时函数为中断延时,关闭总中断则为普通延时
        优化ips114屏幕的初始化时间,移除不必要的延时
        修复串口错误中断的串口号异常的问题
This commit is contained in:
SEEKFREE_BUDING
2023-11-29 10:13:09 +08:00
parent 68a58caf81
commit 0b61a0a0c6
112 changed files with 2221 additions and 1757 deletions

View File

@@ -1,3 +1,7 @@
V3.2.4
<20>Ż<EFBFBD><C5BB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>Ϊ<EFBFBD><CEAA>ͨ<EFBFBD><CDA8>ʱ
<20>Ż<EFBFBD>ips114<31><34>Ļ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>ʱ<EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>жϵĴ<CFB5><C4B4>ں<EFBFBD><DABA><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
V3.2.3
<20>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>SPIͨ<49><CDA8><EFBFBD><EFBFBD>Ļ(OLED<45><44><EFBFBD><EFBFBD>)<29><>ͨ<EFBFBD>ŷ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20>޸Ĵ<DEB8><C4B4>ڵ<EFBFBD>Ĭ<EFBFBD><C4AC>ͨ<EFBFBD>ŷ<EFBFBD>ʽ

View File

@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж<EFBFBD>
disable_Watchdog(); // <20>رտ<D8B1><D5BF>Ź<EFBFBD>
get_clock(); // <20><>ȡϵͳƵ<CDB3><C6B5>
system_delay_init(); // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
interrupt_global_enable(0); // <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
}

View File

@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>˵<EFBFBD><CBB5>
* 2023-10-07 pudding <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ʽ<E4B7BD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2023-11-29 pudding <20>Ż<EFBFBD><C5BB><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
********************************************************************************************************************/
/********************************************************************************************************************
* <20><><EFBFBD>߶<EFBFBD><DFB6>
@@ -293,7 +294,7 @@ void ips114_clear (void)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> color <20><>ɫ<EFBFBD><C9AB>ʽ RGB565 <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ʹ<EFBFBD><CAB9> zf_common_font.h <20><> rgb565_color_enum ö<><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_full(RGB565_BLACK);
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> color <20><>ɫ<EFBFBD><C9AB>ʽ RGB565 <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ʹ<EFBFBD><CAB9> zf_common_font.h <20><> rgb565_color_enum ö<><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_draw_point(0, 0, RGB565_RED); // <20><><EFBFBD><EFBFBD> 0,0 <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD>ĵ<EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_draw_point (uint16 x, uint16 y, const uint16 color)
{
@@ -397,7 +398,7 @@ void ips114_draw_point (uint16 x, uint16 y, const uint16 color)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> color <20><>ɫ<EFBFBD><C9AB>ʽ RGB565 <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ʹ<EFBFBD><CAB9> zf_common_font.h <20><> rgb565_color_enum ö<><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_draw_line(0, 0, 10, 10, RGB565_RED); // <20><><EFBFBD><EFBFBD> 0,0 <20><> 10,10 <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_end, const uint16 color)
{
@@ -460,7 +461,7 @@ void ips114_draw_line (uint16 x_start, uint16 y_start, uint16 x_end, uint16 y_en
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> dat <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE><EFBFBD>ַ<EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_show_char(0, 0, 'x'); // <20><><EFBFBD><EFBFBD> 0,0 дһ<D0B4><D2BB><EFBFBD>ַ<EFBFBD> x
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_show_char (uint16 x, uint16 y, const char dat)
{
@@ -547,7 +548,7 @@ void ips114_show_char (uint16 x, uint16 y, const char dat)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> dat <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_show_string(0, 0, "seekfree");
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_show_string (uint16 x, uint16 y, const char dat[])
{
@@ -616,7 +617,7 @@ void ips114_show_int (uint16 x, uint16 y, const int32 dat, uint8 num)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> num <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD><CABE>λ<EFBFBD><CEBB> <20><><EFBFBD><EFBFBD>10λ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_show_uint(0, 0, x, 3); // x <20><><EFBFBD><EFBFBD>Ϊ uint32 uint16 uint8 <20><><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num)
{
@@ -651,7 +652,7 @@ void ips114_show_uint (uint16 x, uint16 y, const uint32 dat, uint8 num)
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> x <20><><EFBFBD><EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0, ips114_width_max-1]
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> y <20><><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0, ips114_height_max-1]
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> dat <20><>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> double
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> num <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> num <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> pointnum С<><D0A1>λ<EFBFBD><CEBB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_show_float(0, 0, x, 2, 3); // <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ 2 λ С<><D0A1><EFBFBD><EFBFBD>ʾ 3 λ
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> dis_value_max <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ֵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0, ips114_height_max]
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_show_wave(56,35,data,128,64,128,64);
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_show_wave (uint16 x, uint16 y, const uint16 *wave, uint16 width, uint16 value_max, uint16 dis_width, uint16 dis_value_max)
{
@@ -959,7 +960,7 @@ void ips114_show_chinese (uint16 x, uint16 y, uint8 size, const uint8 *chinese_b
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> ips114_init();
// <20><>ע<EFBFBD><D7A2>Ϣ
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
void ips114_init (void)
{
@@ -978,14 +979,14 @@ void ips114_init (void)
ips114_set_color(ips114_pencolor, ips114_bgcolor);
IPS114_RST(0);
system_delay_ms(200);
system_delay_ms(5);
IPS114_RST(1);
system_delay_ms(100);
system_delay_ms(120);
IPS114_CS(0);
ips114_write_index(0x11);
ips114_write_index(0x36);
system_delay_ms(100);
switch(ips114_display_dir)
{
case IPS114_PORTAIT: ips114_write_8bit_data(0xA0); break;
@@ -1063,9 +1064,6 @@ void ips114_init (void)
ips114_write_index(0x21);
ips114_write_index(0x11);
system_delay_ms(120);
ips114_write_index(0x29);
IPS114_CS(1);

View File

@@ -31,31 +31,68 @@
* <20>޸ļ<DEB8>¼
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
* 2022-09-15 pudding first version
* 2023-11-28 pudding <20>޸<EFBFBD><DEB8><EFBFBD>ͨ<EFBFBD><CDA8>ʱ<EFBFBD>߼<EFBFBD>Ϊ<EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϹر<CFB9><D8B1><EFBFBD>ʹ<EFBFBD>üĴ<C3BC><C4B4><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ʱ
********************************************************************************************************************/
#include "IfxStm.h"
#include "IFXSTM_CFG.h"
#include "SysSe/Bsp/Bsp.h"
#include "zf_common_interrupt.h"
#include "zf_driver_delay.h"
#define IFX_INTPRIO_STM0_SR0 220
#define IFX_INTPRIO_STM1_SR0 221
static vuint8 stm0_isr_flag = 1;
static vuint8 stm1_isr_flag = 1;
IFX_INTERRUPT(stm0_isr, 0, IFX_INTPRIO_STM0_SR0)
{
interrupt_global_enable(0); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
stm0_isr_flag = 0;
}
IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
{
interrupt_global_enable(0); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
stm1_isr_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> system<65><6D>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> time <20><>ʱһ<CAB1>ֵ<EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3A8>λΪ<CEBB><CEAA><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ0-20000000<30><30>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> num <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ã<EFBFBD><C3A3>û<EFBFBD><C3BB><EFBFBD>ʹ<EFBFBD><CAB9>h<EFBFBD>ļ<EFBFBD><C4BC>еĺ궨<C4BA><EAB6A8>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ã<EFBFBD><C3A3>û<EFBFBD><C3BB><EFBFBD>ʹ<EFBFBD><CAB9>h<EFBFBD>ļ<EFBFBD><C4BC>еĺ궨<C4BA><EAB6A8> // 100Mʱ<4D><CAB1> <20><>С<EFBFBD><D0A1>λΪ 10ns
//-------------------------------------------------------------------------------------------------------------------
void system_delay (uint32 time, uint32 num)
void system_delay_10ns (uint32 time)
{
uint32 stm_clk;
uint32 delay_time;
stm_clk = IfxStm_getFrequency(IfxStm_getAddress((IfxStm_Index)(IfxCpu_getCoreId())));
delay_time = (uint32)(stm_clk/1000000*time/1000);
IfxStm_Index stm_index;
while(num--)
stm_index = (IfxStm_Index)IfxCpu_getCoreId();
if(areInterruptsEnabled() == 0)
{
IfxStm_waitTicks(IfxStm_getAddress((IfxStm_Index)(IfxCpu_getCoreId())), delay_time);
IfxStm_waitTicks(IfxStm_getAddress(stm_index), time);
}
else
{
if(stm_index == IfxStm_Index_0)
{
Ifx_STM *stm_sfr = &MODULE_STM0;
stm_sfr->CMP[0].U = stm_sfr->TIM0.U + time;
stm0_isr_flag = 1;
while(stm0_isr_flag);
}
else if(stm_index == IfxStm_Index_1)
{
Ifx_STM *stm_sfr = &MODULE_STM1;
stm_sfr->CMP[1].U = stm_sfr->TIM0.U + time;
stm1_isr_flag = 1;
while(stm1_isr_flag);
}
}
}
@@ -68,7 +105,19 @@ void system_delay (uint32 time, uint32 num)
//-------------------------------------------------------------------------------------------------------------------
void system_delay_us (uint32 time)
{
system_delay(time*1000, 1);
if(time > 40000000)
{
while(time > 40000000)
{
system_delay_10ns(4000000000);
time = time - 40000000;
}
system_delay_10ns(time * 100);
}
else
{
system_delay_10ns(time * 100);
}
}
//-------------------------------------------------------------------------------------------------------------------
@@ -79,6 +128,53 @@ void system_delay_us (uint32 time)
//-------------------------------------------------------------------------------------------------------------------
void system_delay_ms (uint32 time)
{
system_delay(1000000, time);
if(time > 40000)
{
while(time > 40000)
{
system_delay_10ns(4000000000);
time = time - 40000;
}
system_delay_10ns(time * 100000);
}
else
{
system_delay_10ns(time * 100000);
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> system <20>ӳٳ<D3B3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> system_delay_init();
//-------------------------------------------------------------------------------------------------------------------
void system_delay_init(void)
{
IfxStm_CompareConfig stmConfig;
boolean interrupt_state = disableInterrupts();
stmConfig.comparator = IfxStm_Comparator_0;
stmConfig.compareOffset = IfxStm_ComparatorOffset_0;
stmConfig.compareSize = IfxStm_ComparatorSize_32Bits;
stmConfig.comparatorInterrupt = IfxStm_ComparatorInterrupt_ir0;
stmConfig.ticks = 1;
stmConfig.triggerPriority = IFX_INTPRIO_STM0_SR0;
stmConfig.typeOfService = IfxSrc_Tos_cpu0;
IfxStm_initCompare(&MODULE_STM0, &stmConfig);
IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
stmConfig.comparator = IfxStm_Comparator_1;
stmConfig.compareOffset = IfxStm_ComparatorOffset_0;
stmConfig.compareSize = IfxStm_ComparatorSize_32Bits;
stmConfig.comparatorInterrupt = IfxStm_ComparatorInterrupt_ir1;
stmConfig.ticks = 1;
stmConfig.triggerPriority = IFX_INTPRIO_STM1_SR0;
stmConfig.typeOfService = IfxSrc_Tos_cpu1;
IfxStm_initCompare(&MODULE_STM1, &stmConfig);
IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_0);
restoreInterrupts(interrupt_state);
}

View File

@@ -42,6 +42,7 @@
void system_delay (uint32 time, uint32 num);
void system_delay_us (uint32 time);
void system_delay_ms (uint32 time);
void system_delay_init (void);
//====================================================<3D><>ʱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>====================================================