完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件环境:ALIENTEK 阿波罗STM32F7开发板参考资源: 链接:miniLZO官网源码下载 链接:安富莱-STM32H7 miniLZO移植 链接:miniLZO无损压缩库评估 源码移植注意事项 工程中加入miniLZO源文件为 keil5中优化设置选项须设置禁止优化,否则压缩算法可能被优化导致无法正确运行。 测试程序 #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "key.h" #include "minilzo.h" #include /************************************************ ALIENTEK 阿波罗STM32F7开发板 实验3 串口实验-HAL库函数版 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ /* 定义例程名和例程发布日期 */ #define EXAMPLE_NAME "V7-MiniLZO无损压缩算法移植和使用" #define EXAMPLE_DATE "2019-10-11" #define DEMO_VER "1.0" static void PrintfLogo(void); static void PrintfHelp(void); static uint8_t TestMiniLZO(uint32_t _Len); /* 定义测试用的输入输出缓冲和大小 */ #define IN_LEN (20*1024ul) #define OUT_LEN (IN_LEN + IN_LEN / 16 + 64 + 3) static unsigned char __LZO_MMODEL in [ IN_LEN ]; static unsigned char __LZO_MMODEL out [ OUT_LEN ]; /* 压缩需要内存大小 */ #define HEAP_ALLOC(var,size) lzo_align_t __LZO_MMODEL var [ ((size) + (sizeof(lzo_align_t) - 1)) / sizeof(lzo_align_t) ] static HEAP_ALLOC(wrkmem, LZO1X_1_MEM_COMPRESS); /* 定义个变量,避免警告 */ #if defined ( __CC_ARM ) __attribute__((section (".RAM_D1"))) uint8_t InTempData[IN_LEN]; __attribute__((section (".RAM_D1"))) uint16_t TempValues1; __attribute__((section (".RAM_D2"))) uint16_t TempValues2; __attribute__((section (".RAM_D3"))) uint16_t TempValues3; #endif int main(void) { u8 len; u16 times=0; Cache_Enable(); //打开L1-Cache HAL_Init(); //初始化HAL库 Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz delay_init(216); //延时初始化 uart_init(115200); //串口初始化 LED_Init(); //初始化LED #if defined ( __CC_ARM ) TempValues1 = 0; /* 避免MDK警告 */ TempValues2 = 0; TempValues3 = 0; #endif PrintfLogo(); /* 打印例程名称和版本等信息 */ PrintfHelp(); /* 打印操作提示 */ /* 初始化 LZO */ if (lzo_init() != LZO_E_OK) { printf("LZO初始化失败 rn"); printf("一般是编译造成的操作,可以重新编译,并设置不做任何优化,同时使能-DLZO_DEBUG进行调试rn"); } /* 测试数据的压缩和解压 */ TestMiniLZO(1024*1); TestMiniLZO(1024*2); TestMiniLZO(1024*3); TestMiniLZO(1024*4); TestMiniLZO(1024*5); TestMiniLZO(1024*6); TestMiniLZO(1024*7); TestMiniLZO(1024*8); TestMiniLZO(1024*9); TestMiniLZO(1024*10); TestMiniLZO(1024*11); TestMiniLZO(1024*12); TestMiniLZO(1024*13); TestMiniLZO(1024*14); TestMiniLZO(1024*15); TestMiniLZO(1024*16); TestMiniLZO(1024*17); TestMiniLZO(1024*18); TestMiniLZO(1024*19); TestMiniLZO(1024*20); while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("rn您发送的消息为:rn"); HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据 while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束 printf("rnrn");//插入换行 USART_RX_STA=0; }else { times++; if(times%30==0)LED0_Toggle;//闪烁LED,提示系统正在运行. delay_ms(10); } } } /* ********************************************************************************************************* * 函 数 名: TestMiniLZO * 功能说明: _Len 要压缩的数据量。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static uint8_t TestMiniLZO(uint32_t _Len) { uint32_t i; int r; lzo_uint in_len; lzo_uint out_len; lzo_uint new_len; uint32_t start, end, cnt; if(_Len > IN_LEN) { printf("函数参数_Len超出允许的最大值%drn", IN_LEN); } /* 准备要压缩的数据 */ in_len = _Len; lzo_memset(in,0,in_len); for(i=0; i< in_len; i++) { in = rand()%256; InTempData = in; } printf("-----------------------------------rn"); printf("-----------------------------------rn"); /* 将in数组中的数据压缩到out数组 */ start = SysTick->VAL; r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem); end = SysTick->VAL; cnt = abs(end - start)/216; if (r == LZO_E_OK) printf("压缩 %lu 字节为 %lu 字节,耗时%dusrn", (unsigned long) in_len, (unsigned long) out_len, cnt); else { printf("内部错误 - 压缩失败: %drn", r); return 2; } /* 检查是否有位解压的数据 */ if (out_len >= in_len) { printf(" 有未解压的数据 rn"); return 0; } /* 将压缩后的数组out,解压到in数组 */ start = SysTick->VAL; r = lzo1x_decompress(out,out_len,in,&new_len,NULL); end = SysTick->VAL; cnt = abs(end - start)/216; if (r == LZO_E_OK && new_len == in_len) printf("解压 %lu 字节为 %lu 字节,耗时%dusrn", (unsigned long) out_len, (unsigned long) in_len, cnt); else { printf("内部错误 - 压缩失败: %drn", r); return 1; } /* 校验压缩是否成功 */ for(i = 0; i < in_len; i++) { if(InTempData != in) { printf("测试压缩失败rn"); } } return 0; } /* ********************************************************************************************************* * 函 数 名: PrintfHelp * 功能说明: 打印操作提示 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void PrintfHelp(void) { printf("操作提示:rn"); printf("1. 数据压缩和解压测试,请下载程序并重新给板子上电,上电后自动打印rn"); } /* ********************************************************************************************************* * 函 数 名: PrintfLogo * 功能说明: 打印例程名称和例程发布日期, 接上串口线后,打开PC机的超级终端软件可以观察结果 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void PrintfLogo(void) { printf("*************************************************************nr"); /* 检测CPU ID */ // { // uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2; // // CPU_Sn0 = *(__IO uint32_t*)(0x1FF1E800); // CPU_Sn1 = *(__IO uint32_t*)(0x1FF1E800 + 4); // CPU_Sn2 = *(__IO uint32_t*)(0x1FF1E800 + 8); // printf("rnCPU : STM32H743XIH6, BGA240, 主频: %dMHzrn", SystemCoreClock / 1000000); // printf("UID = %08X %08X %08Xnr", CPU_Sn2, CPU_Sn1, CPU_Sn0); // } printf("nr"); printf("*************************************************************nr"); printf("* 例程名称 : %srn", EXAMPLE_NAME); /* 打印例程名称 */ printf("* 例程版本 : %srn", DEMO_VER); /* 打印例程版本 */ printf("* 发布日期 : %srn", EXAMPLE_DATE); /* 打印例程日期 */ /* 打印ST的HAL库版本 */ printf("* HAL库版本 : V1.3.0 (STM32F7xx HAL Driver)rn"); printf("*************************************************************nr"); } 测试结果 ************************************************************* * 例程名称 : V7-MiniLZO无损压缩算法移植和使用 * 例程版本 : 1.0 * 发布日期 : 2019-10-11 * HAL库版本 : V1.3.0 (STM32F7xx HAL Driver) ************************************************************* 操作提示: 1. 数据压缩和解压测试,请下载程序并重新给板子上电,上电后自动打印 ----------------------------------- ----------------------------------- 压缩 1024 字节为 561 字节,耗时328us 解压 561 字节为 1024 字节,耗时9us ----------------------------------- ----------------------------------- 压缩 2048 字节为 565 字节,耗时334us 解压 565 字节为 2048 字节,耗时17us ----------------------------------- ----------------------------------- 压缩 3072 字节为 569 字节,耗时345us 解压 569 字节为 3072 字节,耗时27us ----------------------------------- ----------------------------------- 压缩 4096 字节为 573 字节,耗时357us 解压 573 字节为 4096 字节,耗时36us ----------------------------------- ----------------------------------- 压缩 5120 字节为 577 字节,耗时367us 解压 577 字节为 5120 字节,耗时46us ----------------------------------- ----------------------------------- 压缩 6144 字节为 581 字节,耗时379us 解压 581 字节为 6144 字节,耗时56us ----------------------------------- ----------------------------------- 压缩 7168 字节为 585 字节,耗时391us 解压 585 字节为 7168 字节,耗时66us ----------------------------------- ----------------------------------- 压缩 8192 字节为 589 字节,耗时596us 解压 589 字节为 8192 字节,耗时76us ----------------------------------- ----------------------------------- 压缩 9216 字节为 593 字节,耗时585us 解压 593 字节为 9216 字节,耗时86us ----------------------------------- ----------------------------------- 压缩 10240 字节为 597 字节,耗时572us 解压 597 字节为 10240 字节,耗时96us ----------------------------------- ----------------------------------- 压缩 11264 字节为 601 字节,耗时440us 解压 601 字节为 11264 字节,耗时892us ----------------------------------- ----------------------------------- 压缩 12288 字节为 605 字节,耗时548us 解压 605 字节为 12288 字节,耗时116us ----------------------------------- ----------------------------------- 压缩 13312 字节为 609 字节,耗时534us 解压 609 字节为 13312 字节,耗时128us ----------------------------------- ----------------------------------- 压缩 14336 字节为 613 字节,耗时476us 解压 613 字节为 14336 字节,耗时859us ----------------------------------- ----------------------------------- 压缩 15360 字节为 617 字节,耗时510us 解压 617 字节为 15360 字节,耗时149us ----------------------------------- ----------------------------------- 压缩 16384 字节为 621 字节,耗时501us 解压 621 字节为 16384 字节,耗时162us ----------------------------------- ----------------------------------- 压缩 17408 字节为 625 字节,耗时513us 解压 625 字节为 17408 字节,耗时173us ----------------------------------- ----------------------------------- 压缩 18432 字节为 630 字节,耗时525us 解压 630 字节为 18432 字节,耗时183us ----------------------------------- ----------------------------------- 压缩 19456 字节为 634 字节,耗时461us 解压 634 字节为 19456 字节,耗时194us ----------------------------------- ----------------------------------- 压缩 20480 字节为 638 字节,耗时550us 解压 638 字节为 20480 字节,耗时204us |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:06 , Processed in 0.760164 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号