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) {