当前位置: 首页 > news >正文

STM32 10个工程篇:1.IAP远程升级(二)

        一直提醒自己要更新CSDN博客,但是确实这段时间到了一个项目的关键节点,杂七杂八的事情突然就一涌而至。STM32FPGA下位机代码和对应LabviewIAP升级助手、波形设置助手上位机代码笔者已经调试通过,因为不想去水博客、凑数量,复制粘贴炒冷饭,所以导致整体上更新得比较慢。

       一方面需要组织好语言描述、搭配好图片说明、安排好篇幅章节,另一方面对于比较重要的东西写完以后还会修改精炼,可能这就是CSDN排名上不去的原因,各方面原因导致有时候不能每周都保证更新一篇当然会尽力做到周更,往往一周没更新则需要几周连更才能回到之前的排名吧。

        回归主题不管是撰写什么样的技术博客,笔者都更倾向于层层分章叙述,这可能也是在学习工作后养成的逻辑性吧,一般性地首先说明技术背景即这项技术通常应用在哪里;其次交代这项技术的原理,嵌入式研发一方面需要不断的项目迭代积累,另一方面也需要懂得些原理性的知识,否则在出故障的时候你如何去复现定位排查问题;再次会展开实施细节,在了解完背景应用和原理知识后,就到了具体的落地实施,怎么更好地去落地兼顾产品的稳定性、易用性、准确性和物料成本、开发周期、人力投入等本身就是一种权衡取其最优解;最后会把开发当中遇到的一些常见问题和注意事项列举出来,并给出自己的解决方法吧。

       在这里笔者举三个现实落地的项目其技术处理上包含一些相似点主要在ADC采样这块,大家可以从中直观比较感受应对不同的现实需求,硬件选型和软件设计上也是相辅相成的:1. 程控交流电源项目需要把输出端的高压信号通过分压电阻和运放调理到ADC芯片的采样范围内,且频率范围是1-500hz的可设定正弦波,电压范围是1-300V高压信号,整体上要求比较高的采样精度,为了加快这款产品的开发速度,选取了STM32F405RGT6作为ADC的采集端芯片硬件上搭配了一片14位双通道SPIADC,这款芯片本身Flash较大可以存储Bootloader、校准表数据、App程序且主频168Mhz速度较快通过定时器重加载可以保证对各个频率段的正弦波信号进行等间隔采集,随着频率的提高采样点从512128,再进行后期运算;2. 气体浓度检测项目需要把光源发出毫伏级的模拟电压信号通过运放调节到ADC芯片采样区间内,也是采样一个5hz固定频率的类正弦波信号,再去计算折合成当前某种气体的浓度,整个项目对精度要求非常高且对产品价格较为敏感,所以选择了2ksps较低采样速率的24位高精度ADC,搭配STM32F103RCT6ADC进行每个周期1024个点等间隔采样计算还原等,整体硬件成本很低但保证浓度精度却很高;3. 天线单元测量项目需要把一个上Mhz不同频率叠加的正弦波进行滤波计算、FFT还原波形等,而且是有16路模拟信号需要处理,主控芯片选型上有几种应用方案:一是用ZYNQPLPS等细节相关技术整体学习开发周期很长不易把控项目进度;二是用高端带DSP48资源丰富的FPGA芯片比如K7V7等,用纯FPGA逻辑进行采样、计算、通信等,但开发周期会非常长,顶级的FPGA芯片如V7价格动则上万并且引脚也很多对PCB层数要求很高;三是用中低端的FPGA芯片如A7,搭配DSP或者STM32进行一些外扩的浮点数计算,整体硬件设计和软件开发上更容易衔接,关于ADC芯片的选型如果使用16ADC去实时采样显然硬件成本会很高且产品市场竞争力很小,所以选择一款高性价比的164通道的LVDS接口的ADC,这样16路模拟信号用44通道ADC即可以完成采样,前端FPGA实时地切换不同的通道进行高速采样把16路的ADC得到的二进制数进行FIR滤波、FFT傅里叶变化等,后端选择主频216MhzSTM32F746进行后期浮点数计算把ADC采样计算处理得到的二进制数转换成对应的角度数据、波距数据等等,前端选择XC7A100T-2FBG484I即中档A7芯片外接两颗DDR3颗粒进行ADC采集的数据缓存,在节约成本的同时也取得了非常精确的测量结果。

       可能上面的内容其本身和STM32 IAP升级相关性并不大,但是写在这里主要帮助大家解除一些学习上的迷茫或者说写给曾经的自己,笔者在读研时候刚接触到STM32等一些MCU开发平台,跑过原子和野火的例程开发板demo后会感到不少迷茫,一方面会觉得通过学习这些市面上的主流开发板入门了STM32中常用的一些中断和配置等,但是另一方面具体在项目中怎么用,这样做好不好或者说对不对,稳定性和可靠性有没有保证等这些没有教程去手把手教学,而且看来看去就感觉网络上的STM32教程好像都是原子教程的改写版,比如IAP升级原子给出了STM32标准库的串口循环队列demo,然后几乎所有市面付费的教程千篇一律地这样写仿佛像考研计算机408统考一样全国考生都是一个老师教出来的,而在这背后可能真的大部分人只是在不断地复制粘贴,很少有人去静下心仔细思考或者亲手实践吧。

      笔者想在第二篇博客里把IAP升级的原理说明清楚,第一篇博客则写的是IAP升级的项目背景,IAPIn Application Programming)即在应用编程, IAP 是指用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品汇总的固件程序进行更新升级。

       然后我们再来看看如何去实现IAP,通常去实现IAP功能是需要用户程序可以在运行中实现独立更新自身Flash代码的目标。所以在设计固件程序时要编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式比如USBTMCLANUSART接收数据执行对第二部分代码的更新,第二个项目代码才是所需要的真正功能代码。 这两部分项目代码都同时烧录在 User Flash 中,当STM32芯片上电后首先是第一个项目代码开始运行并做如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4

3)执行更新操作

4)跳转到第二部分代码执行

       第一部分代码必须通过其他手段,比如JTAGISP下载器烧入,而第二部分代码则可以既使用第一部分代码IAP功能烧入,也可以连同和第一部分代码一起烧入,以后需要程序更新时再通过第一部分IAP代码更新。

      一般性地工程上我们将第一个项目代码称之为Bootloader程序,而第二个项目代码称之为Application程序,当然它们存放在Flash的不同地址范围,一般是从最低地址区开始存放 Bootloader,紧跟其后的就是Application程序,但是需要说明的是如果Flash容量足够大是可以设计很多Application程序的,但是在下文中我们只讨论一个Application程序的情况,下面笔者就STM32单片机分别举例说明普通程序(Bootloader)的执行流程和IAP程序(Bootloader)的执行流程。

       普通程序执行流程,当STM32程序中只包含了Application程序则运行流程如下图1所示:

1 STM32普通程序执行流程

       STM32 的内部闪存Flash地址起始于0x08000000,一般情况下程序文件就从此地址开始写入。例程中笔者选择了 STM32F103RCT6是一种基于 Cortex-M3 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张 “中断向量表”的起始地址是0x08000004,当中断来临STM32 的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量再去执行中断服务程序。    

        在上1图中,STM32 在复位后,先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到程序中的main函数,如图标号②所示;而在裸机程序里的main函数一般都是一个死循环,在main函数执行过程中,如果收到中断请求即发生重中断,此时STM32强制将PC指针指回中断向量表处,如图标号③所示;然后根据中断源进入响应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回main函数执行如图标号⑤所示。

       而当加入 IAP 程序之后,程序运行流程如下图2所示:

2 STM32 IAP程序执行流程

       在上图2所示流程中,STM32复位后,还是从0x08000004地址取出复位中断向量的地址并跳转到复位中断服务程序,在运行复位中断服务程序之后跳转到IAPmain函数,如图标号①所示;在执行完IAP以后,即将新的Application代码写入STM32Flash(图中灰色部分)。新的Application程序复位中断向量起始地址为0x08000004+N+M,跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,如图标号②和③所示,同样main函数为一个死循环,并且注意到此时STM32Flash,在不同位置上共有两个中断向量表。

       在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回main函数继续运行,如图标号⑥所示。

通过以上两个过程的分析,可以知道IAP程序必须满足两个要求:

1)新的Application程序必须在IAP程序之后的某个偏移量为x 的地址开始;

2)必须将新的Application程序中断向量表相应的移动,移动的偏移量为x

       在介绍完IAP升级原理和STM32启动机制后,接着我们来看看IAP升级过程吧,STM32上电或者复位以后,首先执行Bootloader程序,Bootloader程序启动后,检查串口是否有升级数据,等待10秒钟无升级数据,则自动跳转到功能固件Application程序开始运行,如果收到升级指令则进入升级模式,直到接收完成全部升级数据,并将新的固件Application程序升级到对应的Flash区域,启动运行新固件程序升级过程结束,并在上位机上做出提示详细细节会在下篇博客具体说明。

       最后笔者带着大家看一看STM32F103常用系列的Flash结构,STM32F103可以说是一款如同教科书般经典的MCU芯片,价格低廉且功能实用可以说能够胜任任何一款嵌入式产品的应用开发,IAP升级的本质就是STM32芯片通过Bootloader程序接到外部接口发来的BIN文件报文并将其准确写入Application对应的Flash地址中,所以搞清楚STM32F103内部的Flash结构则是IAP开发的关键性一步,就拿STM32F103R8T6来举例,其本身是STM32F103系列中较低端的型号内部具有64KBFlash空间,其中STM32F103R8T6 要按照IAP升级Flash的结构可以分配如下:

STM32F103R8T6 Flash地址范围 0x08000000 -- 0x08010000 (总大小64KB

Bootloader代码区地址范围       0x08000000 -- 0x08002000 (占用大小8KB

功能固件代码区地址范围         0x08002000 -- 0x08010000 (占用大小56KB

      如下表1所示是STM32F103常用系列的FLASH大小和扇区空间,笔者将其总结如下供大家进入STM32F103系列单片机IAP开发时参考,当然STM32F103系列单片机型号太多,下面表格只列举了常用型号的几种,用于描述FlashApplication固件和Bootloader固件存放的地址,便于用于理解程序,又因为STM32F103系列单片机,中等容量和大容量产品的扇区大小不一致,所以bootloader程序中也需要注意!

STM32F103C8T6

64KB

64个扇区

每个扇区占1KB

中等容量

STM32F103RBT6

128KB

128个扇区

每个扇区占1KB

STM32F103RCT6

256KB

128个扇区

每个扇区占2KB

大容量

STM32F103ZET6

512KB

256个扇区

每个扇区占2KB

1 STM32F103系列单片机常用型号的Flash扇区分配

相关文章:

STM32 10个工程篇:1.IAP远程升级(二)

一直提醒自己要更新CSDN博客,但是确实这段时间到了一个项目的关键节点,杂七杂八的事情突然就一涌而至。STM32、FPGA下位机代码和对应Labview的IAP升级助手、波形设置助手上位机代码笔者已经调试通过,因为不想去水博客、凑数量,复制…...

Unity+ChatGpt的联动 AICommand

果然爱是会消失的,对吗 chatGpt没出现之前起码还看人家的文章,现在都是随便你。 本着师夷长技以制夷的思路,既然打不过,那么我就加入 github地址:https://github.com/keijiro/AICommand 文档用chatGpt翻译如下&#…...

STM-32:按键控制LED灯 程序详解

目录一、基本原理二、接线图三、程序思路3.1库函数3.2程序代码注:一、基本原理 左边是STM322里电路每一个端口均可以配置的电路部分,右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是,VDD开关闭合,VSS开关断开。 浮空…...

北邮22信通:(8)实验1 题目五:大整数加减法(搬运官方代码)

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章: 北邮22信通:(7)实验1 题目四:一元多项式(节省内存版)_青山如…...

Fiddler抓取https史上最强教程

有任何疑问建议观看下面视频 2023最新Fiddler抓包工具实战,2小时精通十年技术!!!对于想抓取HTTPS的测试初学者来说,常用的工具就是fiddler。 但是初学时,大家对于fiddler如何抓取HTTPS难免走歪路&#xff…...

STM32开发基础知识入门

C语言基础 位操作 对基本类型变量可以在位级别进行操作。 1) 不改变其他位的值的状况下,对某几个位进行设值。 先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。 2) 移位操作提高代码的可读性。 3) ~取反操作使用技巧 可用于对某…...

学习操作系统的必备教科书《操作系统:原理与实现》| 文末赠书4本

使用了6年的实时操作系统,是时候梳理一下它的知识点了 摘要: 本文简单介绍了博主学习操作系统的心路历程,同时还给大家总结了一下当下流行的几种实时操作系统,以及在工程中OSAL应该如何设计。希望对大家有所启发和帮助。 文章目录…...

大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)

在大数据时代,数据挖掘是最关键的工作。大数据的挖掘是从海量、不完全的、有噪声的、模糊的、随机的大型数据库中发现隐含在其中有价值的、潜在有用的信息和知识的过程,也是一种决策支持过程。其主要基于人工智能,机器学习,模式学…...

【数据结构】详解二叉树与堆与堆排序的关系

🌇个人主页:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 🛸C语言专栏:https://blog.csdn.net/vhhhbb/category_12174730.html 🚀数据结构专栏&#xff…...

【Pandas】数据分析入门

文章目录前言一、Pandas简介1.1 什么是Pandas1.2 Pandas应用二、Series结构2.1 Series简介2.2 基本使用三、DataFrame结构3.1 DataFrame简介3.2 基本使用四、Pandas-CSV4.1 CSV简介4.2 读取CSV文件4.3 数据处理五、数据清洗5.1 数据清洗的方法5.2 清洗案例总结前言 大家好&…...

【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“

文章目录 前言一.list的基本功能的使用二.list的模拟实现总结前言 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中&#xff0…...

QT表格控件实例(Table Widget 、Table View)

欢迎小伙伴的点评✨✨,相互学习🚀🚀🚀 博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀 文章目录前言一、图示实例二、列…...

第二章Vue组件化编程

文章目录模块与组件、模块化与组件化模块组件模块化组件化Vue中的组件含义非单文件组件基本使用组件注意事项使用 kebab-case使用 PascalCase组件的嵌套模板templateVueComponent一个重要的内置功能单文件组件Vue脚手架使用Vue CLI脚手架先配置环境初始化脚手架分析脚手架结构实…...

面试官:vue2和vue3的区别有哪些

目录 多根节点,fragment(碎片) Composition API reactive 函数是用来创建响应式对象 Ref toRef toRefs 去除了管道 v-model的prop 和 event 默认名称会更改 vue2写法 Vue 3写法 vue3组件需要使用v-model时的写法 其他语法 1. 创…...

【TopK问题】——用堆实现

文章目录一、TopK问题是什么二、解决方法三、时间复杂度一、TopK问题是什么 TopK问题就是从1000个数中找出前K个最大的数或者最小的数这样的类似问题。 不过并不要求这k个数字必须是有序的,如果题目有要求,则进行堆排序即可。 还有比如求出全国玩韩信…...

【Spring从成神到升仙系列 四】从源码分析 Spring 事务的来龙去脉

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…...

使用Nginx反向代理OpenAI API

由于OpenAI的API在国内无法访问,所以可以通过海外服务器利用Nginx实现反向代理。 安装Nginx 这一步就不赘述了,不同的Linux系统安装方式略有不同,根据自己的服务器的系统自行百度即可。 OpenSSL创建证书 因为OpenAI的接口是https协议的&a…...

USB键盘实现——字符串描述符(四)

字符串描述符 字符串描述符内容解析和 HID鼠标 一致。 获取字符串描述符请求 标准设备请求 typedef struct __attribute__ ((packed)){union {struct __attribute__ ((packed)) {uint8_t recipient : 5; ///< Recipient type usb_request_recipient_t.uint8_t type …...

STM32的中断

目录 一、STM32中断概述 二、外部中断控制器EXTI 三、按键中断 四、串口中断 一、STM32中断概述 处理器中的中断在处理器中&#xff0c;中断是一个过程&#xff0c;即CPU在正常执行程序的过程中&#xff0c;遇到外部/内部的紧急事件需要处理&#xff0c;暂时中止当前程序的…...

Flink进阶篇-CDC 原理、实践和优化采集到Doris中

简介 基于doris官方用doris构建实时仓库的思路&#xff0c;从flinkcdc到doris实时数仓的实践。 原文 Apache Flink X Apache Doris 构建极速易用的实时数仓架构 (qq.com) 前提-Flink CDC 原理、实践和优化 CDC 是什么 CDC 是变更数据捕获&#xff08;Change Data Captur…...

看完这篇 教你玩转渗透测试靶机vulnhub——My File Server: 1

Vulnhub靶机My File Server: 1渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;FTP匿名登入&#xff1a;③&#xff1a;SMB共享服务&#xf…...

OpenHarmony实战STM32MP157开发板 “控制” Hi3861开发板 -- 中篇

一、前言 我们在 OpenHarmony实战STM32MP157开发板 “控制” Hi3861开发板 – 上篇 中介绍到了,App面板的开发,以及JS API接口的开发和调用。 那么本篇文章,会详解:BearPi-HM Nano开发板,如何实现数据上报和指令接收响应的。 看到这里,可能有同学可能已经知道思路了,因…...

【数据结构初阶】单链表

目录一、思路>>>>>>>>>>>>过程<<<<<<<<<<<<<<<1.打印2.尾插3.尾删4.头插5.头删6.查找7.指定位置后插入8.指定位置后删除9.链表的销毁二、整个程序1.SLTlist.c2.SLTlist.c一、思路 #define …...

多线程代码案例-阻塞队列

hi,大家好,今天为大家带来多线程案例--阻塞队列 这块知识点也很重要,要好好掌握呀~~~ &#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x…...

mysql的limit查询竟然有坑?

背景 最近项目联调的时候发现了分页查询的一个bug&#xff0c;分页查询总有数据查不出来或者重复查出。 数据库一共14条记录。 如果按照一页10条。那么第一页和第二页的查询SQL和和结果如下。 .png) 那么问题来了&#xff0c;查询第一页和第二页的时候都出现了11,12,13的记录…...

【Docker】MAC电脑下的Docker操作

文章目录安装Docker部署mysql 一主一从登录ChatGPT搞方案本地创建一个文件夹编辑docker-compose.yml文件启动检查并编排容器验证基于command的my.cnf配置的加载主数据库建一个用户给子数据库用于主从复制启动主从同步安装Docker 官网地址 https://www.docker.com/ 下载安装 验…...

【Python3】matplotlib,模块,进/线程,文件/xml,百度人脸api,hal/aiohttp/curl

文章目录1.matplotlib/时间复杂度/线性表&#xff1a;顺序表要求存储空间必须连续2.python模块导入&#xff1a;python3 -c ‘import sys;print(sys.path)’ 显示导入模块时会去哪些路径下查找3.进/线程&#xff1a;进/线程是不能随便创建&#xff0c;就像每招一个员工是有代价…...

异或相关算法

文章目录1. 异或的性质2. 题目一3. 题目二4. 题目三5. 题目四1. 异或的性质 我们知道&#xff0c;异或的定义是&#xff1a;相同为0&#xff0c;相异为1。所以也被称为无进位相加&#xff0c;根据这定义&#xff0c;我们可以得出三个性质&#xff1a; 1. N ^ N0。2. N ^ 0N。3…...

python 使用pyshp读写shp文件

安装 pip install pyshp 引入 import shapefile读取 sfshapefile.Reader("{路径名}",encodingutf-8) # 仅仅读取 shapes与shape shapessf.shapes() 返回值是一个列表&#xff0c;包含该文件中所有的”几何数据”对象shapesf.shape(0) Shape是第1个”几何数据”…...

eNSP FTP基础配置实验

关于本实验在本实验中&#xff0c;我们通过两台路由器来展示通过FTP在两台路由器之间传输文件。其中一台路由器AR2作为FTP服务器&#xff0c;另一台路由器AR1以FTP的方式登录AR2&#xff0c;并对AR2的文件系统进行一些更改。实验目的熟悉华为网络设备文件系统的管理。掌握华为网…...

政府网站规划/今天特大军事新闻

手动卸载基于 AutoCAD 产品的文件&#xff0c;从而删除所有残留文件。 清理安装失败所遗留的文件。 一、解决方案&#xff1a; 通过“控制面板”卸载该程序。 删除以下位置残留的 AutoCAD 文件夹&#xff1a; C:\Program Files\Autodesk C:\ProgramData\Autodesk C:\Users\All …...

wordpress主题著作权/百度商家平台登录

intitle 搜索网页中标题中函数有该文字的信息inurl  搜索路径中包含文字的信息alliurl  和inurl差不多,但是更精确filetype  搜索后缀名结尾的文件site    搜索制定域名的文件 转载于:https://www.cnblogs.com/52forjie/p/8682397.html...

什么网站可以做市场分析呢/谷歌优化推广

1&#xff09;实验平台&#xff1a;正点原子水星 STM32F4/F7 开发板2&#xff09;摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子http://weixin.qq.com/r/hEhUTLbEdesKrfIv9x2W (二维码自动识别)第十六章 电容触摸按键实…...

沈阳网站开发培训/网络营销工程师培训

bootstrap源码分析之scrollspy&#xff08;滚动侦听&#xff09; 源码文件&#xff1a; Scrollspy.js 实现功能1、当滚动区域内设置的hashkey距离顶点到有效位置时&#xff0c;就关联设置其导航上的指定项 2、导航必须是 .nav > li > a 结构&#xff0c;并且a上href或dat…...

桂林北站疫情防控最新消息/seo排名优化表格工具

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022高压电工复审题库为高压电工模拟考试题库考前必练习题目&#xff01;2022高压电工理论题库及在线模拟考试根据高压电工新版教材大纲编写。高压电工模拟考试试题随时根据安全生产模拟考试一点通上查找答案。 1、【…...

做棋牌网站抓到会怎么量刑/朝阳网站建设公司

在前面我们已经完成了ActiveX控件的开发&#xff0c;接下来的就是发布它了。 首先&#xff0c;我们建立一个windows安装项目&#xff0c;并将ActiveX控件的主输出添加到项目输出中。然后&#xff0c;改动ActiveX控件的主输出文件&#xff0c;将其Register属性改为vsdrpCOM.如图…...