你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】如何生成库文件(MDK 和 IAR)

[复制链接]
STMCU小助手 发布时间:2022-3-1 12:28
问题:
该问题由某客户提出,主要是想自己做一个库给第三方,但是又不想让别人得到源代码,不知道如何去做,尝试了几种办法,发现都会有些问题.

调研:
目前 ST 已经提供了各种开源的库文件(如 USB/Ethernet 等等),但是部分客户依然有使用 IDE 生成可加密的库文件的需求,因各种 IDE 之间在生成库的方法上有些不同,调用的方式也有细微的差别,所以大部分工程师还是需要有一个初级入门的文档供来参考。


结论:
撰写了一个小的说明文档发给客户,按照 demo 程序生成自己的库文件。


处理:
1.适用范围
本文基于 STM32F40xDiscovery 做的测试,MCU 为:STM32F407VGT6 和 STM32F4101VCT6。关于其他 ARM 未做相关测试。但基本原理是相同的。
2.思路概述
该文主要是讲解了在 Keil 和 IAR 环境中实现库文件的生成。并且如何使用已经生成的库函数。我们正常提供给别人的只有一个‘*.h’和‘*.lib’或‘*.a’,这样可以既实现了代码的加密(不可更改),又会给别人一个方便调用的库函数.
3.开发环境
IAR:V6.60

WOM$((0{S[`ADGZ6X1P.png

  1. Keil:V5.0
复制代码

{INPP){9JI{INP7{(GOV4$H.png

硬件:STM32F4DISCOVERY 和 STM32F401C-DISCO
4.技术实现
在此以生成库的方式来实现亮 LED 为例。这里我们先编写两个文件,LED.c 和 LED.h.LED.h 文件内容:


  1. /*----------------------------------------------------------------------------
  2. * Name: LED.c
  3. * Purpose: low level LED functions
  4. * Note(s):
  5. *-----------------------------------------------------------------------------*/
  6. #include "STM32F4xx.h"
  7. #include "LED.h"
  8. const unsigned long led_mask[] = {1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15};
  9. /*----------------------------------------------------------------------------
  10. initialize LED Pins
  11. *----------------------------------------------------------------------------*/
  12. void LED_Init (void) {
  13. RCC->AHB1ENR |= ((1UL << 3) ); /* Enable GPIOD clock */
  14. GPIOD->MODER &= ~((3UL << 2*12) |
  15. (3UL << 2*13) |
  16. (3UL << 2*14) |
  17. (3UL << 2*15) ); /* PD.12..15 is output */
  18. GPIOD->MODER |= ((1UL << 2*12) |
  19. (1UL << 2*13) |
  20. (1UL << 2*14) |
  21. (1UL << 2*15) );
  22. GPIOD->OTYPER &= ~((1UL << 12) |
  23. (1UL << 13) |
  24. (1UL << 14) |
  25. (1UL << 15) ); /* PD.12..15 is output Push-Pull */
  26. GPIOD->OSPEEDR &= ~((3UL << 2*12) |
  27. (3UL << 2*13) |
  28. (3UL << 2*14) |
  29. (3UL << 2*15) ); /* PD.12..15 is 50MHz Fast Speed */
  30. GPIOD->OSPEEDR |= ((2UL << 2*12) |
  31. (2UL << 2*13) |
  32. (2UL << 2*14) |
  33. (2UL << 2*15) );
  34. GPIOD->PUPDR &= ~((3UL << 2*12) |
  35. (3UL << 2*13) |
  36. (3UL << 2*14) |
  37. (3UL << 2*15) ); /* PD.12..15 is Pull up */
  38. GPIOD->PUPDR |= ((1UL << 2*12) |
  39. (1UL << 2*13) |
  40. (1UL << 2*14) |
  41. (1UL << 2*15) );
  42. }
  43. /*----------------------------------------------------------------------------
  44. Function that turns on requested LED
  45. *----------------------------------------------------------------------------*/
  46. void LED_On (unsigned int num) {
  47. if (num < LED_NUM) {
  48. GPIOD->BSRRL = led_mask[num];
  49. }
  50. }
  51. /*----------------------------------------------------------------------------
  52. Function that turns off requested LED
  53. *----------------------------------------------------------------------------*/
  54. void LED_Off (unsigned int num) {
  55. if (num < LED_NUM) {
  56. GPIOD->BSRRH = led_mask[num];
  57. }
  58. }
  59. /*----------------------------------------------------------------------------
  60. Function that outputs value to LEDs
  61. *----------------------------------------------------------------------------*/
  62. void LED_Out(unsigned int value) {
  63. int i;
  64. for (i = 0; i < LED_NUM; i++) {
  65. if (value & (1<<i)) {
  66. LED_On (i);
  67. } else {
  68. LED_Off(i);
  69. }
  70. }
  71. }
复制代码
LED.h 文件内容:
  1. /*----------------------------------------------------------------------------
  2. * Name: LED.h
  3. * Purpose: low level LED definitions
  4. * Note(s):
  5. *----------------------------------------------------------------------------
  6. * This file is part of the uVision/ARM development tools.
  7. * This software may only be used under the terms of a valid, current,
  8. * end user licence from KEIL for a compatible version of KEIL software
  9. * development tools. Nothing else gives you the right to use this software.
  10. *
  11. * This software is supplied "AS IS" without warranties of any kind.
  12. *
  13. * Copyright (c) 2011 Keil - An ARM Company. All rights reserved.
  14. *----------------------------------------------------------------------------*/
  15. #ifndef __LED_H
  16. #define __LED_H
  17. /* LED Definitions */
  18. #define LED_NUM 4 /* Number of user LEDs */
  19. extern void LED_Init(void);
  20. extern void LED_On (unsigned int num);
  21. extern void LED_Off (unsigned int num);
  22. extern void LED_Out (unsigned int value);
  23. #endif
复制代码


4.1Keil 环境中库的应用
4.1.1 如何生成*.Lib
新建一个工程,命名“lib source”,添加“startup_stm32f4xx.s”“LED.c”“system_stm32f4xx.c”三个文件在工程 usr lib 里:
注:“startup_stm32f4xx.s”和“system_stm32f4xx.c”在 keil 的安装目录中。


Q@8C5LVYZ6J@1)K4IZ3I3RY.png

Options 里设置“Create Library….”项。

$)PX9M%9W3Q9$%4@YDEC.png

点击 F7,运行生成 lib source.lib 文件。这时候在工程路径中就会生成 lib source.lib 这个文件。如下图所示。

8J()3Q)U143(1ZOOY{[UG)E.png

4.1.2 如何调用库
在新建的工程中添加上我们所需要的 lib source.lib 文件和对应的头文件 LED.h,在自建的主文件 uselib.c 中包含 LED.h 文件.
use lib.c 文件的内容如下:注意:以下 IAR 中的文件也是相同的内容。
  1. <div>#include "LED.h"</div><div>int main(void)</div><div>{</div><div>LED_Init();</div><div>LED_On(0x1);</div><div>LED_Off(0x1);</div><div>LED_Out(0x3);</div><div>}</div>
复制代码


在工程中添加上“lib source.lib”“system_stm32f4xx.c”“startup_stm32f4xx.c”“文件。如下图所示。



这时候我们的就可以正常调试了,试试你的 LED 是不是按照库中所实现的功能来运行了.
注意:system_stm32f4xx.c 和 startup_stmewf4xx.s 在上一个工程中可以复制过来,这个部分的内容是相同的.与 MCU 型号和 IDE 有关.
4.2IAR 环境中库的应用
4.2.1 如何生成 Lib 文件
新建工程选择如图:

%]N`~C%KGX~4S(C4J83GN_R.png

右键-Option

7PW7C6VCN9~6%~87H}BP8$E.png

OutPut 选择输出文件位置

2(45%X`J}%G6(G_@Z4~4_07.png

选择 Library 的类型

`QIH{K2G]GG69_TR_{97`01.png

选择优化最大

_8XP21)[XPRF)JW~SSL5X0S.png

覆盖旧文件

2_S5}X(KLN2IW~XX)4[4{I6.png

直接运行生成 lib source.a 文件,如下图所示:

07EB75OW2}J]5Q8`}II333H.png

4.2.2 如何调用 IAR 生成的库文件
新建立一个 IAR 工程,将生成的“lib source.a”文件添加到工程中。如下图所示。



use lib.c 文件的内容不变.即可编译调试代码运行情况了.
注意:startup_stm32f40xx.s 和 system_stm32f4xx.c 是在 IAR 环境下的文件.use lib.c 与在 Keil 环境下所使用的文件内容是相同的.

建议:
类似的问题其实是工程师的一个基本技能,以后我们是不是会针对工程师的基本技能出一个常见问题集锦,以便以后的工程师查阅。


















收藏 评论0 发布时间:2022-3-1 12:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版