diff --git a/Example/E01_gpio_demo/.cproject b/Example/E01_gpio_demo/.cproject
index 39fad64..41ea8bc 100644
--- a/Example/E01_gpio_demo/.cproject
+++ b/Example/E01_gpio_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E01_gpio_demo/libraries/doc/version.txt b/Example/E01_gpio_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E01_gpio_demo/libraries/doc/version.txt
+++ b/Example/E01_gpio_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E01_gpio_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E01_gpio_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E01_gpio_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E01_gpio_demo/user/isr.c b/Example/E01_gpio_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E01_gpio_demo/user/isr.c
+++ b/Example/E01_gpio_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E02_uart_demo/.cproject b/Example/E02_uart_demo/.cproject
index 2ff244f..270c25d 100644
--- a/Example/E02_uart_demo/.cproject
+++ b/Example/E02_uart_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
+ libraries
+
+
diff --git a/Example/E02_uart_demo/libraries/doc/version.txt b/Example/E02_uart_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E02_uart_demo/libraries/doc/version.txt
+++ b/Example/E02_uart_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E02_uart_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E02_uart_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E02_uart_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E02_uart_demo/user/isr.c b/Example/E02_uart_demo/user/isr.c
index a4e7a77..99930e9 100644
--- a/Example/E02_uart_demo/user/isr.c
+++ b/Example/E02_uart_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E03_adc_demo/.cproject b/Example/E03_adc_demo/.cproject
index 8f43af0..95c60a0 100644
--- a/Example/E03_adc_demo/.cproject
+++ b/Example/E03_adc_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E03_adc_demo/libraries/doc/version.txt b/Example/E03_adc_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E03_adc_demo/libraries/doc/version.txt
+++ b/Example/E03_adc_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E03_adc_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E03_adc_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E03_adc_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E03_adc_demo/user/isr.c b/Example/E03_adc_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E03_adc_demo/user/isr.c
+++ b/Example/E03_adc_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E04_pwm_demo/.cproject b/Example/E04_pwm_demo/.cproject
index a18abc0..85e6c6a 100644
--- a/Example/E04_pwm_demo/.cproject
+++ b/Example/E04_pwm_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E04_pwm_demo/libraries/doc/version.txt b/Example/E04_pwm_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E04_pwm_demo/libraries/doc/version.txt
+++ b/Example/E04_pwm_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E04_pwm_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E04_pwm_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E04_pwm_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E04_pwm_demo/user/isr.c b/Example/E04_pwm_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E04_pwm_demo/user/isr.c
+++ b/Example/E04_pwm_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E05_pit_demo/.cproject b/Example/E05_pit_demo/.cproject
index bf6aa49..3915da7 100644
--- a/Example/E05_pit_demo/.cproject
+++ b/Example/E05_pit_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E05_pit_demo/libraries/doc/version.txt b/Example/E05_pit_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E05_pit_demo/libraries/doc/version.txt
+++ b/Example/E05_pit_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E05_pit_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E05_pit_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E05_pit_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E05_pit_demo/user/isr.c b/Example/E05_pit_demo/user/isr.c
index 88535af..f81ccb2 100644
--- a/Example/E05_pit_demo/user/isr.c
+++ b/Example/E05_pit_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E06_exit_demo/.cproject b/Example/E06_exit_demo/.cproject
index 554e396..d53afaf 100644
--- a/Example/E06_exit_demo/.cproject
+++ b/Example/E06_exit_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E06_exit_demo/libraries/doc/version.txt b/Example/E06_exit_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E06_exit_demo/libraries/doc/version.txt
+++ b/Example/E06_exit_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E06_exit_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E06_exit_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E06_exit_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E06_exit_demo/user/isr.c b/Example/E06_exit_demo/user/isr.c
index 99b23d7..606b16a 100644
--- a/Example/E06_exit_demo/user/isr.c
+++ b/Example/E06_exit_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E07_encoder_demo/.cproject b/Example/E07_encoder_demo/.cproject
index 2598043..6a79e8b 100644
--- a/Example/E07_encoder_demo/.cproject
+++ b/Example/E07_encoder_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E07_encoder_demo/libraries/doc/version.txt b/Example/E07_encoder_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E07_encoder_demo/libraries/doc/version.txt
+++ b/Example/E07_encoder_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E07_encoder_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E07_encoder_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E07_encoder_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E07_encoder_demo/user/isr.c b/Example/E07_encoder_demo/user/isr.c
index 88535af..f81ccb2 100644
--- a/Example/E07_encoder_demo/user/isr.c
+++ b/Example/E07_encoder_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E08_eeprom_demo/.cproject b/Example/E08_eeprom_demo/.cproject
index 823f67f..4abbed4 100644
--- a/Example/E08_eeprom_demo/.cproject
+++ b/Example/E08_eeprom_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E08_eeprom_demo/libraries/doc/version.txt b/Example/E08_eeprom_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E08_eeprom_demo/libraries/doc/version.txt
+++ b/Example/E08_eeprom_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E08_eeprom_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E08_eeprom_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E08_eeprom_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E08_eeprom_demo/user/isr.c b/Example/E08_eeprom_demo/user/isr.c
index cfd54a6..8148b75 100644
--- a/Example/E08_eeprom_demo/user/isr.c
+++ b/Example/E08_eeprom_demo/user/isr.c
@@ -234,25 +234,16 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
-}
-
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E09_timer_demo/.cproject b/Example/E09_timer_demo/.cproject
index 6505807..38d38ce 100644
--- a/Example/E09_timer_demo/.cproject
+++ b/Example/E09_timer_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E09_timer_demo/libraries/doc/version.txt b/Example/E09_timer_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E09_timer_demo/libraries/doc/version.txt
+++ b/Example/E09_timer_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E09_timer_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E09_timer_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E09_timer_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E09_timer_demo/user/isr.c b/Example/E09_timer_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E09_timer_demo/user/isr.c
+++ b/Example/E09_timer_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E10_printf_debug_log_demo/.cproject b/Example/E10_printf_debug_log_demo/.cproject
index dedca35..c97264b 100644
--- a/Example/E10_printf_debug_log_demo/.cproject
+++ b/Example/E10_printf_debug_log_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E10_printf_debug_log_demo/libraries/doc/version.txt
+++ b/Example/E10_printf_debug_log_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E10_printf_debug_log_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E10_printf_debug_log_demo/user/isr.c b/Example/E10_printf_debug_log_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E10_printf_debug_log_demo/user/isr.c
+++ b/Example/E10_printf_debug_log_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E11_interrupt_priority_set_demo/.cproject b/Example/E11_interrupt_priority_set_demo/.cproject
index 6d51cbf..9717d97 100644
--- a/Example/E11_interrupt_priority_set_demo/.cproject
+++ b/Example/E11_interrupt_priority_set_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt
+++ b/Example/E11_interrupt_priority_set_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E11_interrupt_priority_set_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E11_interrupt_priority_set_demo/user/isr.c b/Example/E11_interrupt_priority_set_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E11_interrupt_priority_set_demo/user/isr.c
+++ b/Example/E11_interrupt_priority_set_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E12_cpu1_handles_interrupts_demo/.cproject b/Example/E12_cpu1_handles_interrupts_demo/.cproject
index ee4b064..313b0b8 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/.cproject
+++ b/Example/E12_cpu1_handles_interrupts_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E12_cpu1_handles_interrupts_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E12_cpu1_handles_interrupts_demo/user/isr.c b/Example/E12_cpu1_handles_interrupts_demo/user/isr.c
index 88535af..f81ccb2 100644
--- a/Example/E12_cpu1_handles_interrupts_demo/user/isr.c
+++ b/Example/E12_cpu1_handles_interrupts_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E13_dual_core_demo/.cproject b/Example/E13_dual_core_demo/.cproject
index dd6f495..bc772f0 100644
--- a/Example/E13_dual_core_demo/.cproject
+++ b/Example/E13_dual_core_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E13_dual_core_demo/libraries/doc/version.txt b/Example/E13_dual_core_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E13_dual_core_demo/libraries/doc/version.txt
+++ b/Example/E13_dual_core_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E13_dual_core_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E13_dual_core_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E13_dual_core_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E13_dual_core_demo/user/isr.c b/Example/E13_dual_core_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E13_dual_core_demo/user/isr.c
+++ b/Example/E13_dual_core_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E14_specifies_variable_or_code_location_demo/.cproject b/Example/E14_specifies_variable_or_code_location_demo/.cproject
index c4770a7..37e0f9d 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/.cproject
+++ b/Example/E14_specifies_variable_or_code_location_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E14_specifies_variable_or_code_location_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E14_specifies_variable_or_code_location_demo/user/isr.c b/Example/E14_specifies_variable_or_code_location_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E14_specifies_variable_or_code_location_demo/user/isr.c
+++ b/Example/E14_specifies_variable_or_code_location_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Example/E15_fft_demo/.cproject b/Example/E15_fft_demo/.cproject
index 526374b..c5c8445 100644
--- a/Example/E15_fft_demo/.cproject
+++ b/Example/E15_fft_demo/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -185,10 +111,21 @@
+
+
+
+
+
+ libraries
+
+
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+
diff --git a/Example/E15_fft_demo/libraries/doc/version.txt b/Example/E15_fft_demo/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Example/E15_fft_demo/libraries/doc/version.txt
+++ b/Example/E15_fft_demo/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c b/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c
+++ b/Example/E15_fft_demo/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c
+++ b/Example/E15_fft_demo/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.c b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.c
+++ b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.h b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.h
+++ b/Example/E15_fft_demo/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Example/E15_fft_demo/user/isr.c b/Example/E15_fft_demo/user/isr.c
index cfd54a6..27171d2 100644
--- a/Example/E15_fft_demo/user/isr.c
+++ b/Example/E15_fft_demo/user/isr.c
@@ -233,26 +233,18 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
-}
-IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
-{
- interrupt_global_enable(0); // 开启中断嵌套
-
-
-
-
}
// 串口通讯错误中断
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{
diff --git a/Seekfree_TC264_Opensource_Library/.cproject b/Seekfree_TC264_Opensource_Library/.cproject
index 4949865..47cc780 100644
--- a/Seekfree_TC264_Opensource_Library/.cproject
+++ b/Seekfree_TC264_Opensource_Library/.cproject
@@ -39,59 +39,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -100,65 +65,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -187,21 +113,25 @@
+
+
+
+
- /Libraries/iLLD/TC26B/Tricore/Cpu/Trap
- /Configurations/Debug
- /Libraries/iLLD/TC26B/Tricore/Cpu/CStart
- /Configurations
+ libraries/infineon_libraries/iLLD/TC26B/Tricore/Cpu/CStart
+
+ libraries
+
diff --git a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
index b91dce5..7faaf60 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
+++ b/Seekfree_TC264_Opensource_Library/libraries/doc/version.txt
@@ -1,3 +1,7 @@
+V3.2.4
+ 优化延时函数为中断延时,关闭总中断则为普通延时
+ 优化ips114屏幕的初始化时间,移除不必要的延时
+ 修复串口错误中断的串口号异常的问题
V3.2.3
优化所有SPI通信屏幕(OLED除外)的通信方式,显示速率将提升一倍左右
修改串口的默认通信方式
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c
index 081e2f3..5023270 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_common/zf_common_clock.c
@@ -97,6 +97,7 @@ void clock_init (void)
interrupt_global_disable(); // 关闭总中断
disable_Watchdog(); // 关闭看门狗
get_clock(); // 获取系统频率
+ system_delay_init(); // 延时函数初始化
interrupt_global_enable(0); // 打开全局中断
}
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c
index aa2f6bd..78c6f3b 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_device/zf_device_ips114.c
@@ -33,6 +33,7 @@
* 2022-09-15 pudding first version
* 2023-04-28 pudding 增加中文注释说明
* 2023-10-07 pudding 修改数据传输方式,性能提升一倍左右
+* 2023-11-29 pudding 优化初始化耗时,移除不必要的延时函数
********************************************************************************************************************/
/********************************************************************************************************************
* 接线定义:
@@ -293,7 +294,7 @@ void ips114_clear (void)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_full(RGB565_BLACK);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void ips114_full (const uint16 color)
{
@@ -373,7 +374,7 @@ void ips114_set_color (const uint16 pen, const uint16 bgcolor)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_point(0, 0, RGB565_RED); // 坐标 0,0 画一个红色的点
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 color 颜色格式 RGB565 或者可以使用 zf_common_font.h 内 rgb565_color_enum 枚举值或者自行写入
// 返回参数 void
// 使用示例 ips114_draw_line(0, 0, 10, 10, RGB565_RED); // 坐标 0,0 到 10,10 画一条红色的线
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 dat 需要显示的字符
// 返回参数 void
// 使用示例 ips114_show_char(0, 0, 'x'); // 坐标 0,0 写一个字符 x
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 dat 需要显示的字符串
// 返回参数 void
// 使用示例 ips114_show_string(0, 0, "seekfree");
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 num 需要显示的位数 最高10位 不包含正负号
// 返回参数 void
// 使用示例 ips114_show_uint(0, 0, x, 3); // x 可以为 uint32 uint16 uint8 类型
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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)
// 参数说明 x 坐标x方向的起点 参数范围 [0, ips114_width_max-1]
// 参数说明 y 坐标y方向的起点 参数范围 [0, ips114_height_max-1]
// 参数说明 dat 需要显示的变量 数据类型 double
-// 参数说明 num 整数位显示长度 最高8位
+// 参数说明 num 整数位显示长度 最高8位
// 参数说明 pointnum 小数位显示长度 最高6位
// 返回参数 void
// 使用示例 ips114_show_float(0, 0, x, 2, 3); // 显示浮点数 整数显示 2 位 小数显示 3 位
@@ -863,7 +864,7 @@ void ips114_show_rgb565_image (uint16 x, uint16 y, const uint16 *image, uint16 w
// 参数说明 dis_value_max 波形显示最大值 参数范围 [0, ips114_height_max]
// 返回参数 void
// 使用示例 ips114_show_wave(56,35,data,128,64,128,64);
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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
// 参数说明 void
// 返回参数 void
// 使用示例 ips114_init();
-// 备注信息
+// 备注信息
//-------------------------------------------------------------------------------------------------------------------
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);
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.c b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.c
index 737e267..9337e64 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.c
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.c
@@ -31,31 +31,68 @@
* 修改记录
* 日期 作者 备注
* 2022-09-15 pudding first version
+* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
********************************************************************************************************************/
#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); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
+ stm0_isr_flag = 0;
+}
+
+IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
+{
+ interrupt_global_enable(0); // 开启中断嵌套
+ IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_1);
+ stm1_isr_flag = 0;
+}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 system延时函数
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
-// 参数说明 num 延时多少轮
// 返回参数 void
-// 使用示例 无需用户调用,用户请使用h文件中的宏定义
+// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 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);
+ }
}
+//-------------------------------------------------------------------------------------------------------------------
+// 函数简介 system 延迟初始化函数
+// 返回参数 void
+// 使用示例 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);
+}
diff --git a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.h b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.h
index 6802ec8..88578e5 100644
--- a/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.h
+++ b/Seekfree_TC264_Opensource_Library/libraries/zf_driver/zf_driver_delay.h
@@ -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);
//====================================================延时 基础函数====================================================
diff --git a/Seekfree_TC264_Opensource_Library/user/isr.c b/Seekfree_TC264_Opensource_Library/user/isr.c
index cfd54a6..fd4287f 100644
--- a/Seekfree_TC264_Opensource_Library/user/isr.c
+++ b/Seekfree_TC264_Opensource_Library/user/isr.c
@@ -247,12 +247,12 @@ IFX_INTERRUPT(uart4_rx_isr, 0, UART3_RX_INT_PRIO)
IFX_INTERRUPT(uart0_er_isr, 0, UART0_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart0_handle);
}
IFX_INTERRUPT(uart1_er_isr, 0, UART1_ER_INT_PRIO)
{
interrupt_global_enable(0); // 开启中断嵌套
- IfxAsclin_Asc_isrError(&uart3_handle);
+ IfxAsclin_Asc_isrError(&uart1_handle);
}
IFX_INTERRUPT(uart2_er_isr, 0, UART2_ER_INT_PRIO)
{