固件库升级笔记
GigaDevice Semiconductor Inc. GD32 USBD固件库使用指南说明书

GigaDevice Semiconductor Inc. GD32 USBD固件库使用指南应用笔记AN049目录目录 (2)图索引 (4)表索引 (6)1.前言 (7)2.固件库说明 (8)2.1.main.c文件及函数说明 (9)2.1.1.时钟配置 (11)2.1.2.GPIO配置 (13)2.1.3.中断配置 (14)2.1.4.应用配置 (15)bd_driver底层文件及库函数说明 (16)3.应用类协议及例程说明 (18)3.1.HID (18)3.1.1.协议简介 (18)3.1.2.描述符解析 (18)3.1.3.应用类请求简介 (20)3.1.4.数据传输 (20)3.1.5.输出结果 (21)3.2.CDC (22)3.2.1.协议简介 (22)3.2.2.描述符解析 (22)3.2.3.应用类请求简介 (26)3.2.4.数据传输 (26)3.2.5.输出结果 (26)3.3.DFU (28)3.3.1.协议简介 (28)3.3.2.描述符解析 (28)3.3.3.应用类请求简介 (29)3.3.4.数据传输 (30)3.3.5.输出结果 (30)3.4.UAC (32)3.4.1.协议简介 (32)3.4.2.描述符解析 (32)3.4.3.应用类请求简介 (36)3.4.4.数据传输 (36)3.4.5.输出结果 (37)4.版本历史 (39)图索引图2-1. 固件库框架 (8)图2-2. USBD工程框架图 (9)图2-3. USBD时钟域 (11)图3-1. HID配置描述符 (18)图3-2. HID接口描述符 (19)图3-3. HID描述符 (19)图3-4. HID端点描述符 (19)图3-5. HID报文描述符 (20)图3-6. HID键盘应用示例 (21)图3-7. HID键盘打印 (21)图3-8. CDC配置描述符 (22)图3-9. CDC控制接口描述符 (23)图3-10. CDC标题描述符 (23)图3-11. CDC通话管理描述符 (23)图3-12. CDC抽象控制管理描述符 (24)图3-13. CDC联合功能描述符 (24)图3-14. CDC命令端点描述符 (24)图3-15. CDC数据接口描述符 (25)图3-16. CDC OUT描述符 (25)图3-17. CDC IN描述符 (25)图3-18. CDC设备枚举 (26)图3-19. 虚拟串口数据交互 (26)图3-20. 虚拟串口打印 (27)图3-21. DFU配置描述符 (28)图3-22. DFU接口描述符 (29)图3-23. DFU功能描述符 (29)图3-24. DFU设备枚举 (30)图3-25. DFU上位机 (31)图3-26. UAC配置描述符 (32)图3-27. UAC控制接口描述符 (32)图3-28. UAC 标题描述符 (33)图3-29. UAC输入终端描述符 (33)图3-30. UAC特性单元描述符 (34)图3-31. UAC输出终端描述符 (34)图3-32. UAC标准数据流零带宽接口描述符 (35)图3-33. UAC标准数据流接口描述符 (35)图3-34. UAC通用数据流描述符 (35)图3-35. UAC音频格式描述符 (35)图3-36. UAC标准端点描述符 (36)图3-37. UAC数据流端点描述符 (36)图3-38. UAC设备枚举 (37)图3-39. UAC声道配置 (37)图3-40. 音频播放 (38)表索引表1-1. USBD示例 (7)表1-2. 适用产品 (7)表2-1. Main函数 (9)表2-2. USBD系统时钟和分频 (11)表2-3. RCU配置代码 (11)表2-4. GPIO配置代码 (13)表2-5. 中断配置代码 (14)表2-6. 应用配置代码 (15)表2-7. 设备驱动层文件说明列表 (16)表2-8. usbd_core.h/c库函数说明列表 (16)表2-9. usbd_transc.c文件中的库函数说明列表 (16)表2-10. usbd_pwr.h/.c文件中的库函数说明列表 (17)表2-11. usbd_enum.h/.c文件中的库函数说明列表 (17)表3-1. HID部分设备部分应用类请求简介 (20)表3-2. CDC设备部分应用类请求简介 (26)表3-3. DFU设备应用类请求 (29)表3-4. DFU特定类请求的参数总结 (30)表3-5. UAC设备部分应用类请求简介 (36)表4-1. 版本历史 (39)1. 前言本文基于GD32 MCU产品的USBD模块,分析GD32 USBD固件库架构,简要描述了固件库函数的功能,通过具体的应用实例,阐明部分USBD设备类的实现过程,为用户的后续开发提供借鉴。
控制器的固件升级与软件更新

控制器的固件升级与软件更新对于现代控制器设备而言,固件升级与软件更新是十分重要的环节。
随着技术的不断进步和硬件功能的扩展,保持控制器的固件和软件处于最新版本是确保设备性能和功能发挥最佳状态的关键。
本文将介绍控制器的固件升级与软件更新的重要性,并提供一些建议和步骤以帮助您进行有效的升级和更新。
一、固件升级的重要性控制器的固件是嵌入式设备的操作系统,它负责控制和管理硬件资源,并提供与用户交互的界面。
固件升级可以带来诸多好处,包括但不限于以下几点:1.修复漏洞和错误:固件升级可以修复已知的漏洞和错误,提高设备的稳定性和安全性。
通过升级固件,可能会修复已知的系统故障,消除潜在的安全风险,并提升整体的性能。
2.增加新功能和改进性能:随着技术的发展,硬件设备的功能和性能也在不断提升。
通过固件升级,您可以获得新功能和性能改进的好处,从而满足不断变化的需求。
3.提供兼容性:在一些情况下,新的硬件设备或软件系统可能不兼容旧的固件版本。
通过固件升级,您可以保持设备与新硬件和软件的兼容性,确保一切正常运行。
二、软件更新的重要性除了固件升级,软件更新也是保持控制器设备运行正常的关键因素。
软件更新通常指的是控制器上运行的应用程序或软件的升级。
以下是进行软件更新的几个原因:1.修复软件缺陷:与固件升级类似,软件更新可以修复已知的软件缺陷和错误,从而提高设备的可用性和稳定性。
2.改进性能和优化算法:通过软件更新,您可以获得更好的性能和更优化的算法,从而提升设备的功能和效率。
3.适应新需求:随着用户需求的变化,通过软件更新可以适应新的应用场景和功能要求。
通过更新软件,您可以满足不断变化的需求,并使设备更具竞争力。
三、有效的固件升级和软件更新方法为了进行有效的固件升级和软件更新,以下是一些建议和步骤:1.备份重要数据:在进行任何升级和更新之前,务必备份重要的数据和设置。
这样可以避免意外情况导致数据丢失或配置丢失的风险。
2.了解最新版本和更新内容:在升级和更新之前,确保了解最新版本的固件和软件以及更新的详细内容。
STM32学习笔记-STM32F103ZET6

STM32F103 系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。
GPIO 输入输出,外部中断,定时器,串口。
理解了这四个外设,基本就入门了一款MCU。
时钟控制RCC:-4~16M 的外部高速晶振-内部8MHz 的高速RC 振荡器-内部40KHz低速RC 振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到- 外部低速32.768K 的晶振,主要做RTC 时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。
一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
存储器映像与寄存器映射:ARM 存储器映像4GB0X0000 00000X1FFF FFFF0X2000 00000X3FFF FFFF0X4000 00000X5FFF FFFF寄存器名称相对外设基地址的偏移值编号位表读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2 首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写//定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义APB2 总线基地址#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)//定义GPIOC 外设基地址#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)//定义寄存器基地址这里以GPIOC 为例#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)//控制GPIOC 第0 管脚输出一个低电平5)GPIOC_BSRR = (0x01<<(16+0));//控制GPIOC 第0 管脚输出一个高电平GPIOC_BSRR = (0x01<<0);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedef unsigned int uint32_t; /*无符号32 位变量*/typedef unsigned short int uint16_t; /*无符号16 位变量*//* GPIO 寄存器列表*/typedef struct{uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。
Atmel SAM4S Xplained pro学习笔记

今天就先简单的介绍到这里吧,下次分享一下 例程代码和 ASF(Atmel Software Framework)。。。 希望可以跟跟多爱好者们多多交流学习。 如果有什么建议问题欢迎私信或者 Email(574433742@)我哦。。。。
Atmel SAM4S 学习笔记(三)-- 示例代码分析
上一篇文章中,介绍了环境的搭建和示例程序编译和下载到单片机中。这篇文章主要是介 绍一下 Atmel SAM4S Xplained pro 开发板的示例程序和 ASF。
记得刚接触单片机的时候使用的是 STC89C52 单片和 keil 开发环境,记得当时写程 序都是把程序要实现的功能全部放到一个 main.c 的函数中去,刚开始完成的功能还是比较 简单。后来学习了 STM32F407 知道了还有固件库这么个可以加快开发速度的东西。将不 同的功能的代码放在了不同的文件中去(gpio.c、IIC.c 等)进行归类。这种方法便于程序 的管理维护和扩展其他的功能,现在的单片机以不再是十几年前的 51 汇编时代,现在动辄 上 M 的 flash 存储空间,除非一些对时序要求特别高,或者是操作系统内核调度中会用到 汇编,基本上单片机开发使用的是 C 语言。模块化、分层的思想对开发和维护以及后期的 功能扩展都是很有帮助。
详细参数请查看官网的数据手册:
/Images/Atmel-11100-32-bit-Cortex-M4-Microcontroller_D atasheet.pdf
今天就先简单的介绍到这里吧,下次讲一下开发环境的搭建和如何使用 atmel Studio 6.2 学习其中的例程,简单上手开发。。。
首先将 main.c 函数的内容全部清空,我们一步一步来建立这个函数。 因为要在 OLED 屏上输出,所以要查看液晶屏的驱动函数。 详细的可以去项目文件 中 ASF -> common -> components -> display -> ssd1306 中查看驱 动文件。 #include<asf.h> #include<string.h> intmain(void) { sysclk_init();// 初始化时钟 board_init();// 初始化 GPIO ssd1306_init();//初始化 OLED 液晶屏 ssd1306_clear();//清空 OLED 屏幕 /*显示 helloWorld*/ ssd1306_set_page_address(0);//行 ssd1306_set_column_address(0);//列 ssd1306_write_text("HelloWorld"); /*显示我的论坛 ID*/ ssd1306_set_page_address(3);
STM32F4DISCOVERY板固件更新应用笔记说明书

2011 年 10 月文档 ID 022318 第 1 版1/13AN3990应用笔记使用 U 盘更新 STM32F4DISCOVERY 板固件前言对于大多数基于 Flash 存储器的系统而言,能够更新最终产品中安装的固件,这一点非常重要。
本文档介绍了基于 STM32F4DISCOVERY 板创建固件升级应用程序的通用规则。
STM32F4 系列微控制器能够运行用户指定的应用程序,从而对存储在微控制器片上 Flash 上的固件进行升级。
借助这一特性,在重新编程过程中可以使用任意类型的通信协议(例如CAN 、USART 和 USB )。
本应用笔记以 USB 大容量存储主机为例进行说明。
由于 USB 主机程序代码可单独执行,用户无需使用电脑主机执行固件升级,因此,利用 USB 主机升级固件具有显著优势。
用户只需使用一个 Flash 磁盘即可升级目标 STM32 器件。
文档内容●第 1 节:固件升级概述概述了固件升级过程,并介绍了固件升级方法。
●第 2 节:如何使用固件升级应用程序介绍了用户程序以及软件和硬件的系统要求。
参考文档●STM32F4DISCOVERY STM32F4 高性能探索板 (UM1472)●STM32F405xx 、STM32F407xx 、STM32F415xx 和 STM32F417xx 基于 ARM 内核的32 位高级 MCU 参考手册 (RM0090)●STM32F405xx STM32F407xx 数据手册●STM32F415xx STM32F417xx 数据手册如需上述文档,请访问 /stm32f4-discovery 。
固件升级概述AN39902/13文档 ID 022318 第 1 版1 固件升级概述要将固件升级应用程序编程到 Flash 中,请使用 STM32F4xx 内嵌的自举程序或任意在线编程工具来轻松地对此应用程序进行烧录。
固件升级应用程序使用 USB 主机执行以下操作:●从 Flash 磁盘(U 盘)将二进制文件 (.bin) 下载到 STM32F4xx 的内部 Flash 中。
SSD优化篇之固件升级

优化篇之固件升级SSD的优化进程超级简单,可是有些费时刻,需要用户耐心并认真操作,下面我将带大伙儿一步一步的操作,把整个优化进程完成。
● 升级SSD固件SSD刷固件要紧作用是对FLT进行升级,FTL层确实是一个让闪存模拟传统硬盘操作的软件层,有了FTL闪存设备才能利用,FTL层的效率直接阻碍设备的性能。
FTL层的要紧作用有逻辑块映射、写前擦除操作和花费平稳技术。
更新固件确实是对这些操作的算法进行升级,优化后的算法能提高并有效的使整个读写时刻大大缩短,使系统整体性能取得提升。
除能提升性能之外,SSD升级固件还能解决一些旧版本存在的的BUG,因此也能够把SSD的固件升级当做是显卡的驱动升级或是游戏的升级补丁。
因此,升级SSD固件至最新是购买SSD以后首要完成的事。
固然任何事物都具有两面性,SSD固件升级能提升产品性能但必然要到官方网站下载固件进行操作,不然可能因升级不妥致使固态硬盘故障。
当咱们购买SSD以后,第一不要着急把SSD当系统盘利用,先把SSD接到电脑上并开机以后,右键单击我的电脑,选择治理,在设备治理器中咱们能够看到SSD的名称,现在右键选择SSD,在弹出的菜单当选择属性-详细信息-硬件ID,这时咱们就能够够看到SSD当前的固件版本,如以下图所示。
有了以上的信息,咱们就能够够登岸SSD的官方网站,下载最新的SSD固件,并做更新,如此,算是完成了SSD优化的第一步。
由于不同主控产品,刷新固件方式不同,因此就再也不那个地址赘述,大伙儿在网上应该很容易能搜索到相关的教程,并完成刷新工作。
优化篇之BIOS设置● 开启AHCI模式优化SSD的第二步确实是要开启磁盘读写模式为AHCI,进行这步的操作需要大伙儿进入BIOS里面设置,操作方式超级简单,开机的时候按DEL键,即可进入BIOS设置,不同的主板进入方式可能有少量不同。
进入以后请依照以下图来操作,简单的选择以后按保留并重启,或按F10以后点选确信(yes),上面的方式适用于新装机或那么并未装系统的用户。
STM32 固件库的使用

2012-03-14 10:40iar for stm32 固件库的学习笔记系统、源程序文件和头文件命名都以“stm32f10x-”作为开头寄存器作为常量处理外设函数的命名以外设的缩写加下划线开头每个单词的开头字母大写每个函数名只有一个下划线分隔外设缩写和函数名的其他部分ppp_Init :::根据PPP_InitTypeDef中指定的参数,初始化外设PPP。
PPP_DeInit::::复位外设PPP的所有寄存器至缺省值PPP_StructInit :::其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能PPP_Cmd:::使能或失能外设PPPPPP_ITConfig:::为使能或者失能来自外设PPP某中断源PPP_DMAConfig:::失能或者使能外设PPP的DMA接口用以配置外设功能的函数总是以字符串“Config”结尾PPP_GetFlagStatus:::检查外设PPP某标志位被设置与否PPP_ClearFlag:::清楚外设PPP标志位PPP_GetITStatus:::判断来自外设PPP的中断发生与否PPP_ClearITPendingBit:::清除外设PPP中断待处理标志位typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */stm32f10x_type.h文件中布尔型变量typedef enum{FALSE = 0,TRUE = !FALSE} bool;标志位状态类型 SET & RESETtypedef enum{RESET = 0,SET = !RESET} FlagStatus;功能状态类型 ENABLE&DISABLEtypedef enum{DISABLE = 0,ENABLE = !DISABLE} FunctionalState;错误状态类型 SUCCESS or ERRORtypedef enum{ERROR = 0,SUCCESS = !ERROR} ErrorStatus;stm32f10x_map.h文件包含了所有外设控制寄存器的结构,下例为SPI寄存器结构的声明:/*------------------ Serial Peripheral Interface ----------------*/ typedef struct{vu16 CR1;u16 RESERVED0;vu16 CR2;u16 RESERVED1;vu16 SR;u16 RESERVED2;vu16 DR;u16 RESERVED3;vu16 CRCPR;u16 RESERVED4;vu16 RXCRCR;u16 RESERVED5;vu16 TXCRCR;u16 RESERVED6;} SPI_TypeDef;RESERVEDi(i为一个整数索引值)表示被保留区域stm32f10x_map.h函数包含了所有的外设声明,下例为spi外设的声明:#ifndef EXT#Define EXT extern#endif...#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000).../* SPI2 Base Address definition*/#define SPI2_BASE (APB1PERIPH_BASE + 0x3800).../* SPI2 peripheral declaration*/#ifndef DEBUG...#ifdef _SPI2#define SPI2 ((SPI_TypeDef *) SPI2_BASE)#endif /*_SPI2 */...#else /* DEBUG */...#ifdef _SPI2EXT SPI_TypeDef *SPI2;#endif /*_SPI2 */...#endif /* DEBUG */如果用户希望使用外设SPI,那么必须在文件STM32f10x_conf.h中定义_SPI标签例如:#define _SPI#define _SPI1#define _SPI2每个外设都有若干寄存器专门分配给标志位。
掌握控制器的固件升级方法

掌握控制器的固件升级方法控制器是指在电子设备中负责控制和管理硬件资源的计算机程序。
随着科技的发展,电子产品的性能和功能越来越强大,控制器所需要的软件功能也随之增加。
而为了保证设备的正常运转,我们也需要对控制器的固件进行升级。
本文将简要介绍掌握控制器的固件升级方法。
1.确定升级前的版本在升级固件之前,我们需要确定设备控制器当前的固件版本,以便选择正确的升级程序。
在设备说明书或者生产厂家的网站上可以找到相应的信息。
一些设备还可以在控制器的菜单中查看固件版本号。
在确认设备型号和固件版本之后,我们可以下载相应的升级程序。
2.备份旧版本在升级固件之前,备份旧版本可以帮助我们避免升级失败的风险。
备份通常需要使用特殊的软件,不同设备可能需要使用不同的备份工具。
一般来说,备份的固件文件应该存储在另一台电脑或者存储设备中,以便在出现问题时进行恢复。
3.连接设备在升级之前,我们需要将电脑与设备连接。
连接的方式取决于设备类型,可以使用USB、串口、网络等方式。
连接后,我们需要确保设备处于升级模式下。
升级模式通常可以在设备的菜单中或者使用特定的组合键进行激活。
4.升级固件现在我们可以运行相应的升级程序来更新控制器的固件了。
升级程序会提示我们选择正确的固件版本文件,并进行升级。
升级的过程可能需要一些时间,具体时间取决于固件的大小和设备的类型。
在升级过程中,我们需要保持连接状态,防止数据传输中断。
如果升级失败,我们可以使用备份的旧版本进行恢复。
5.测试设备升级完成后,我们需要测试设备以确保其正常运转。
在测试过程中,应验证设备的所有功能是否正常,以确保升级固件没有影响到设备的性能。
如果发现问题,可以尝试重新升级固件或者使用备份的旧版本进行恢复。
总之,控制器固件的升级是设备正常运转的重要保障。
通过本文介绍的方法,我们可以更好地掌握控制器固件升级技巧,保证设备性能的稳定和顺畅。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
固件库升级1.STM32F10xxx固件库(FWLib)V2.0.3升级为标准外设库(StdPeriph_Lib)V3.0. STM32F10xxx标准外设库(StdPeriph_Lib)V3.0.0由固件库(FWLib)V2.0.3升级而来:(1)它使库与CortexTM微控制器软件接口标准(CMSIS)兼容(2)改进了库包的体系结构(3)源代码符合Doxygen格式(4)升级不影响STM32外设驱动的API(应用编程接口)注意:标准外设库(StdPeriph_Lib)V3.0.0只对STM32F10xxx CAN驱动进行了升级,目的是支持即将面世的STM32F10xxx连接型产品(带双CAN)。
注释:Doxygen格式注释风格可以通过Doxygen工具直接生成手册等帮助文档。
2.要升级到STM32F10xxx标准外设库V3.0.0,用户只需要更新:(1)与工具链相关的文件(2)项目(project)设置(3)库文件的位置:即目录结构,其变化可参照下图。
(4)用户无需改变或者更新应用程序的代码,有一些宏定义发生了改变。
注释:CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。
3.CMSIS与v2.0.3差别(1)对每一个Cortex-M3异常和STM32的IRQ,有:─异常服务程序带后缀_Handler,中断服务程序带后缀_IRQHandler 。
─弱定义(Weak)的默认异常/中断服务程序,包含一个无限循环─带_IRQn 后缀的中断号码“#define”启动文件更名为”startup_stm32f10x_xx.s/.c”,其中xx可以是hd,md或者ld,分别对应大容量,中容量,小容量产品。
(2)只提供精简的NVIC和SysTick函数,其他一些常用函数作为一个新的驱动加入STM32F10xxx标准外设库,文件命名为misc.h/.c。
(3)某些宏的名字与STM32F10xxx固件库V2.0.3中的相同功能宏不同(见表1)4.Stm32体系结构5. STM32F10xxx标准外设库包文件夹描述表1. 固件库目录结构表2. CMSIS目录结构6. STM32F10xxx标准外设库变动列表6 .1 STM32F10xxx标准外设库文件6.1.1 库的内核文件(1)文件stm32f10x.h更名为stm32f10x.h。
它包含─STM32 中断IRQ 列表─Cortex-M3 内核的特别选项─STM32 外设存储器映像和寄存器物理地址定义─专用define “__STM32F10X_STDPERIPH_vERSION”表示STM32F10xxx 标准外设库的版本─配置信息:a) 应用程序需要选择运行它的STM32 产品具体型号,每个产品只要一个defineb) 应用程序需要选择是否使用外设驱动(2)移除了Debug模式,因此在调试时不再可以通过一个监视窗口观察外设寄存器,但是可以利用特定工具链的调试功能监视外设的寄存器。
因此,移除/更新下列文件:─main.c:把#ifdef DEBUG 替换为#ifdef USE_FULL_ASSERT─移除文件stm32f10x_lib.h,它的内容合并到文件stm32f10x_conf.h─移除文件stm32f10x_lib.c─更新文件stm32f10x_conf.h:a) 移除“#define DEBUG 1”,为完全断言函数增加专用define“#define USE_FULL_ASSERT 1”b) 不再需要枚举式地define 用到的外设(如#define _USART, #define _USART1, #define _USART2)c) 用户需要去掉相关行的注释符号来使用相应外设驱动,例如,想使用SPI 驱动,去掉#include “stm32f10x_spi.h”这行的注释符号即可─用文件<stdint.h>替换文件stm32f10x_type.h,出于兼容旧版本库的目的,在文件stm32f10x.h 中保留了原有的类型定义。
在文件stm32f10x.h 中添加一些标准外设库专用的类型定义(bool, FlagStatus, ITStatus, FunctionalState, ErrorStatus)。
─移除文件cortexm3_macro.h 和cortexm3_macro.s,因为CMSIS 文件覆盖了它们的内容。
注意:标准外设库提供了一个名为”Lib_DEBUG”的特别示例,示范了如何为选中的外设定义DEBUG功能。
6.1.2 库的外设驱动(1)移除NVIC和SysTick驱动,它们的功能已由CMSIS内核设备层覆盖,另添加了5个常用函数作为新的驱动(misc.h / misc.c)。
─void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup); 用来简化Cortex-M3 优先级位设置─void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); 用来简化NVIC IRQ 设置─void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset); 用来从内部SRAM 启动并把中断向量表重新映射到存储器不同地址─void NVIC_SystemLPConfig(u8 LowPowerMode, FunctionalState NewState);─void SysTick_CLKSourceConfig(u32 SysTick_CLKSource);(2)更新CAN驱动:在所有的CAN驱动函数中,添加新的参数CAN_TypeDef* CANx.6.1.3库的用户和工具链专用文件(1)启动文件stm32f10x_vector.s / stm32f10x_vector.c更名为startup_stm3210f10x_xx.s / startup_stm3210f10x_xx.c,每个启动文件对应一系列产品:─startup_stm3210f10x_ld.s,STM32 小容量产品─startup_stm3210f10x_md.s,STM32 中容量产品─startup_stm3210f10x_hd.s,STM32 大容量产品(2)stm32f10x_it.h/ stm32f10x_it.c:在这两个文件中移除了全部STM32 IRQ服务程序,只保留了Cortex-M3的异常处理程序。
这些IRQ服务程序已经弱定义(Weak)在启动文件(startup_stm32f10x_xx.s/.c)中,用户需要在文件stm32f10x_it.h/ stm32f10x_it.c中手动添加外设的中断服务程序(ISR)来替换掉启动文件中的默认中断服务程序。
(3)根据CMSIS重新命名Cortex-M3异常(4)main.c:移除下面的代码:#ifdef DEBUGdebug();#endif6.2 代码的书写规则和惯例6.2.1 数据类型和IO类型限定词注意:出于兼容旧版本的目的,文件”stm32f10x.h”中仍然定义了STM32F10xxx固件库原有数据类型。
6.2.2异常的命名6.3 外设驱动更新6.3.1 NVICSTM32F10xxx中断IRQ命名STM32F10xxx中断IRQ命名按照CMSIS的规范,修改了STM32F10xxx中断号码定义命名。
所有中断号码的#define在它们的名称中都添加了后缀_IRQn。
表8展示了名称的变化CAN总线也有变化,因为是工业总线所以先不做解释。
NVIC驱动从STM32F10xxx标准外设库中移除了NVIC驱动,因此应用程序应当调用CMSIS的NVIC函数。
表10展示了CMSIS的函数。
STM32F10xxx标准外设库不覆盖其他的STM32F10xxx固件库NVIC函数。
为了简化NVIC和STM32中断设置,在文件”misc.h/.c”中保留了原有NVIC驱动的一些函数。
它们是:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);在应用程序开发中进行中断设置时,用户可以选用CMSIS 的NVIC 函数,或者选用在文件”misc.h/.c”中原有固件库函数。
这些函数的优点是提供了相对简单的中断配置方法,使得用户无需深入研究NVIC规范。
6.3.2 SysTick在标准外设库中移除了SysTick的驱动,因此用户必须调用CMSIS定义的函数。
CMSIS 只提供了一个SysTick设置的函数,替代了STM32原有SysTick驱动的全部函数。
SysTick_Config(uint32_t ticks);该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。
SysTick时钟默认使用系统时钟。
下面的例程为使用固件库V2.0.3进行SysTick设置:/* Select the HCLK Clock as SysTick clock source (72MHz) */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/* SysTick end of count event each 1ms with input clock equal to72MHz (HCLK) */SysTick_SetReload(72000);/* Enable SysTick interrupt */SysTick_ITConfig(ENABLE);下面的例程为使用标准外设库V3.0.0进行SysTick设置:/* Setup SysTick Timer for 1 msec interrupts */if (SysTick_Config(SystemFrequency / 1000)) /* SystemFrequency isdefined in “system_stm32f10x.h” and equal to HCLK frequency */{while (1);}6.3.3 CAN总线现在不介绍。