1.为ä»ä¹è¦ç¨CMSIS RTOS
2.鸿蒙轻内核M核源码分析:中断Hwi
3.STM32 HAL库的码下框架结构
4.å¦ä½ä½¿ç¨STM32
5.å¦ä½å¨MDKä¸å»ºç«stm32å·¥ç¨
6.树莓派Zero 2W安装Pyocd经验分享
为ä»ä¹è¦ç¨CMSIS RTOS
1ãéæå¨keilä¸ï¼æ²¡ææè°ç§»æ¤æ¦å¿µãé对任ä½MCUé½å¯ä»¥ä¸é®æ·»å ï¼è¯æ³ä¸ä¸ï¼å¦æä½ å°æ¥ç¨çä¸æ¯STMï¼é£ä¹ç§»æ¤OSæ¯ä¸æ¯è¿æ¯é£ä¹å®¹æï¼ï¼
2ãå ç¨èµæºæå°ã大约5kBï¼èä¸é对cortexç³»åARMå®æ¹ä¼åï¼æçä¸è¨èªæï¼
3ãç»ä»¶ä¸°å¯ã常ç¨ä¸é´ä»¶USB/network/GUI/æ件系ç»çï¼ARMå®æ¹å·²ç»åå¤å¥½ï¼åªéè¦å¨keilä¸ä¸é®æ·»å ï¼åæ ·æ²¡æ移æ¤æ¦å¿µï¼
4ã仿çé常æ¹ä¾¿ãå¨keilçdebug模å¼ä¸ï¼è½»æ¾æ¥çä»»å¡çCPUãå åå ç¨ï¼è¿æåä»»å¡çè¿è¡æ¶é´ãè¿è¡ç¶æï¼åä»»å¡ä¹é´å¦ä½æ¢å ï¼é常ç´è§ï¼ä¸éè¦åå ¶ä»RTOSé£æ ·è°ç¨ä¸ç¨çæ¥çå½æ°ï¼
5ãCMSIS RTOSæ¯ARMç°å¨çæ¨çç©èç½æä½ç³»ç»mbedOSçåºç¡ï¼ææè¿ä¸ªRTOS APIï¼mbedOSæ´å®¹æä¸æï¼ç©èç½æ¯å¤§å¿æè¶ï¼ARMçå¨è¿ä¸ªæµªæ½®ä¸çå°ä½ä¼æå¨ç¥ï¼è½¯é¶æ¶è´ARMçæ ¸å¿åå ï¼ï¼ç©èç½ä»¥å估计ä¼äº§ç大éçç¸å ³å·¥ä½æºä¼ï¼
6ã使ç¨æç®åãå次æéï¼CMSIS RTOSåªæ¯ä¸å¥APIï¼æå ´è¶£çå¯ä»¥å»ç 究å®å°è£ OSæºç ï¼æ²¡å ´è¶£çï¼ççAPIæ¿æ¥å°±ç¨ï¼
7ãå è´¹ï¼è¿ç¹åfreeRTOSä¸æ ·ï¼æ¯uc/oSæ´ææ½åï¼ä¸è¿freeRTOSæ¯ä¸ªäººå¼æºé¡¹ç®ï¼åç»å级维æ¤ç¼ºä¹åä¸æ¨¡å¼ï¼èARMåä»è½¯é¶é£éææ¥å¤§ç¬é±ï¼ä¼°è®¡åç»åå±æ¨å¹¿æ´ä¸ºå¼ºå²ï¼è¯è¯´åæ¥ï¼å¦æfreeRTOSççé常ä¼ç§ï¼ARMä¹å¯ä»¥å¯¹å®è¿è¡å°è£ ã
鸿蒙轻内核M核源码分析:中断Hwi
在鸿蒙轻内核源码分析系列中,本文将深入探讨中断模块,码下旨在帮助读者理解中断相关概念、码下鸿蒙轻内核中断模块的码下源代码实现。本文所涉及源码基于OpenHarmony LiteOS-M内核,码下读者可通过开源站点 gitee.com/openharmony/k... 获取。码下人类溯源码4中断概念介绍
中断机制允许CPU在特定事件发生时暂停当前执行的码下任务,转而处理该事件。码下这些事件通常由外部设备触发,码下通过中断信号通知CPU。码下中断涉及硬件设备、码下中断控制器和CPU三部分:设备产生中断信号;中断控制器接收信号并发出中断请求给CPU;CPU响应中断,码下执行中断处理程序。码下中断相关的码下硬件介绍
硬件层面,中断源分为设备、码下中断控制器和CPU。设备产生中断信号;中断控制器接收并转发这些信号至CPU;CPU在接收到中断请求后,大话假人源码暂停当前任务,转而执行中断处理程序。中断相关的概念
每个中断信号都附带中断号,用于识别中断源。中断优先级根据事件的重要性和紧迫性进行划分。当设备触发中断后,CPU中断当前任务,执行中断处理程序。中断处理程序由设备特定,且通常以中断向量表中的地址作为入口点。中断向量表按中断号排序,存储中断处理程序的地址。鸿蒙轻内核中断源代码
中断相关的声明和定义
在文件 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中定义了结构体、全局变量和内联函数。关键变量 g_intCount 记录当前正在处理的中断数量,内联函数 HalIsIntActive() 用于检查是手相app源码否正在处理中断。中断向量表在中断初始化过程中设置,用于映射中断号到相应的中断处理程序。中断初始化 HalHwiInit()
系统启动时,在 kernel\src\los_init.c 中初始化中断。HalHwiInit() 函数在 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中实现,负责设置中断向量表和优先级组,配置中断源,如系统中断和定时器中断。创建中断 HalHwiCreate()
开发者可通过 HalHwiCreate() 函数注册中断处理程序,传入中断号、优先级和中断模式。函数内部验证参数,设置中断处理程序,最终通过调用 CMSIS 函数完成中断创建。删除中断 HalHwiDelete()
中断删除操作通过 HalHwiDelete() 实现,接收中断号作为参数,开心岛源码调用 CMSIS 函数失能中断,设置默认中断处理程序,完成中断删除。中断处理执行入口程序
默认的中断处理程序 HalHwiDefaultHandler() 仅用于打印中断号后进行死循环。HalInterrupt() 是中断处理执行入口程序的核心,它包含中断数量计数、中断号获取、中断前后的操作以及调用中断处理程序的逻辑。开关中断
开关中断用于控制CPU是否响应外部中断。通过宏 LOS_IntLock() 关闭中断, LOS_IntRestore() 恢复中断状态, LOS_IntUnLock() 使能中断。这组宏对应汇编函数,使用寄存器 PRIMASK 控制中断状态。小结
本文详细解析了鸿蒙轻内核中断模块的源代码,涵盖了中断概念、逻辑源码解析初始化、创建、删除以及开关操作。后续文章将带来更多深入技术分享。欢迎在 gitee.com/openharmony/k... 分享学习心得、提出问题或建议。关注、点赞、Star 和 Fork 到个人账户,便于获取更多资源。STM HAL库的框架结构
全文链接:
HAL库的框架结构涉及了Cortex系列微控制器软件接口标准(CMSIS)的背景,以及STM微控制器库的构建方式。CMSIS标准由ARM与芯片厂商共同制定,旨在解决不同芯片厂商生产的Cortex微控制器软件兼容性问题,提供通用API接口以简化移植工作。STM的库遵循CMSIS标准,分为三种类型,提供硬件抽象层,屏蔽硬件差异,便于软件移植。
MCU固件包包含HAL库,它是STM芯片开发的核心部分,文件结构清晰,分为Src和Inc两个主要部分,分别存储源码和头部文件。HAL库API函数遵循特定命名规则,提供初始化、读写、控制、状态和错误查询等功能。对寄存器位操作使用宏定义,便于高效操作。
HAL库设计借鉴面向对象思想,采用句柄概念抽象外设,简化用户代码编写。句柄贯穿整个外设操作流程,例如USART2初始化时定义句柄huart2,用于管理串口操作。句柄内部结构包含串口初始化数据类型,用于配置串口参数。初始化过程涉及配置寄存器和中断处理,确保外设功能正常。
总之,STM HAL库通过CMSIS标准和面向对象设计,提供了高效、统一的微控制器软件接口,简化了开发流程,提高了代码可移植性。
å¦ä½ä½¿ç¨STM
å ³äºè·åSTå ¬å¸çSTMåºä»¶åºæºç ï¼æå ç§æ¹æ³ãæ们å¯ä»¥å¨ç¾åº¦ä¸æï¼ç½ä¸æè¿è¡äºå享ï¼ä¹å¯ä»¥å°STå ¬å¸çå®ç½è¿è¡æ¥æ¾å¹¶ä¸è½½ãä¸è¿ï¼å¦æè±æä¸å¥½çè¯ï¼è¦å¨å®ç½ä¸æ¾å°STMåºä»¶åºç¡®å®æ¯ä»¶å¾ååçäºãå¨å®ç½ä¸å¯ä»¥æ ¹æ®è±ææ示æä¸åæ¡ä»¶è¿è¡çéï¼å ·ä½æä½å¦ä¸å¾æ示ï¼
END
第äºæ¥ï¼æ°å»ºå·¥ç¨æ件夹ââãSTMå·¥ç¨æ¨¡æ¿ã
é¦å ï¼æ°å»ºå·¥ç¨æ件夹ãSTMå·¥ç¨æ¨¡æ¿ãï¼ç¶ååå¨è¯¥æ件夹ä¸æ°å»º6个æ件夹ï¼åå«ä¸ºï¼ãDocãããLibrariesãããListingãããOutputãããProjectãåãUserããå ¶ä¸ï¼ãDocãç¨äºåæ¾åç§è¯´æææ¡£ï¼ãLibrariesãç¨äºåæ¾åç§åºæ件ï¼ãListingãç¨äºåæ¾ç¼è¯æ¶äº§ççä¸é´æ件ï¼ãOutputãç¨äºåæ¾çæçä¸è½½æéçæ件ï¼ãProjectãç¨äºåæ¾å·¥ç¨æ件ï¼ãUserãç¨äºåæ¾ç¨æ·æ件ï¼å³æ们èªå·±ç¼åçåç§æºæ件ãå ·ä½æ åµå¦ä¸å¾æ示ï¼
END
第ä¸æ¥ï¼å建ç«çå·¥ç¨æ件夹ä¸æ·»å åºæ件
å°åºæ件ä¸çincåsrcæ件夹å¤å¶å°æ¨¡æ¿å·¥ç¨æ件夹ä¸çFWLIBæ件夹ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
å°åºæ件ä¸CoreSupportæ件夹ä¸çæ件å¤å¶å°å·¥ç¨æ¨¡æ¿æ件夹ä¸çCMSISæ件夹ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
å°åºæ件ä¸DeviceSupportæ件夹ä¸çç¸å ³æ件å¤å¶å°å·¥ç¨æ¨¡æ¿æ件夹ä¸çCMSISæ件夹ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
å°åºæ件ä¸startupæ件夹ä¸armä¸çæä»¶å ¨é¨å¤å¶å°å·¥ç¨æ¨¡æ¿æ件夹ä¸çstartupæ件夹ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
å°åºæ件ä¸Projectæ件夹ä¸çç¸å ³æ件å¤å¶å°å·¥ç¨æ¨¡æ¿æ件夹ä¸çUseræ件夹ä¸ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
第åæ¥ï¼ä½¿ç¨MDKï¼Keilï¼æ°å»ºå·¥ç¨æ¨¡æ¿
é¦å å¾éæ©CPUï¼è¿ä¸ªå¨æ°å»ºå·¥ç¨æ¶ï¼ä¼æä¸ä¸ªéæ©è¯çççé¢ï¼æ们åªéææ示以åèªå·±çå®é æ åµæ¥éæ©å°±å¥½äºãå ·ä½æä½æ åµå¦ä¸å¾ï¼
æ´æ¹å·¥ç¨åï¼å°é»è®¤çå·¥ç¨åæ¹ä¸ºâTemplateâçæ¹æ³ï¼éä¸å·¥ç¨ï¼æâF2âé®ï¼å¹¶ä¸ºå·¥ç¨æ·»å 项ç®ç»ï¼Add group to projectï¼ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
åå«åå个项ç®ç»ä¸æ·»å æ们ååä»åºä¸å¤å¶è¿æ¥çæ件æ件ï¼Add files to groupï¼ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
第äºæ¥ï¼å·¥ç¨é ç½®
é ç½®Targeté项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
é ç½®Outputé项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
é ç½®Listingé项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
é ç½®C/C++é项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
é ç½®Debugé项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
é ç½®Utilitiesé项å¡ãå ·ä½æä½æ åµå¦ä¸å¾ï¼
å¦ä½å¨MDKä¸å»ºç«stmå·¥ç¨
1.解åstmfx_stdperiph_lib.zip å¯ä»¥ä»STå®æ¹ç½ç«å è´¹ä¸è½½ã
2.å建ä¸ä¸ªDemoæ件夹
2.1 æ°å»ºåæ件夹Userï¼ç¨äºåæ¾ç¨æ·æºç¨åº
2.2 æ°å»ºåæ件夹Projectï¼ç¨æ·KEILå·¥ç¨æ件
2.3 å¨Projectä¸ä¾æ¬¡å建ObjåListåæ件夹ï¼åæ¾ç¼è¯è¿ç¨ä¸äº§ççä¸é´æ件ã
3. å¤å¶æºä»£ç å°Demoæ件夹
3.1 å°stmfx_stdperiph_lib\STMFx_StdPeriph_Lib_V3.1.2Librariesæ件æ´ä½å¤å¶å°Demoæ件夹ä¸ãè¿å°±æ¯STçæ ååºï¼æ¯ä»¥æºä»£ç å½¢å¼æä¾çã
3.2 å°åºä¸çæ¼ç¤ºä»£ç IOToggleä¸çæ件å¤å¶å°Demo\Useræ件夹.
4. æ°å»ºä¸ä¸ªKeil MDKå·¥ç¨
4.1 å¯å¨Keil MDKï¼ç¹å»èå New uVision Projectï¼ç¶åæå导è¿è¡æä½
4.2 éæ©CPUç±»å为 STMFZE ï¼è¿æ¯å®å¯è±STMå¼åæ¿éç¨CPUç±»åï¼
4.3 å½æ示æ¯å¦å¤å¶å¯å¨ä»£ç æ¶ï¼è¯·éæ©å¦ãï¼æ们ç¨ææ°çåºä¸çå¯å¨ä»£ç ï¼ä¸ç¨Keil软件èªå¸¦çæ§çæ¬å¯å¨æ件ï¼
4.4 æ ¹æ®èªå·±çéè¦ä¿®æ¹Targetååãï¼ååä»»æï¼
4.5 为äºä¾¿äºä»£ç 管çï¼å¨è¿ä¸ªProjectä¸å建å 个Group (ååå¯ä»¥ä»»æ)
User : åæ¾ç¨æ·èªå·±åçæºä»£ç
RVMDK : åæ¾å¯å¨æ件ï¼æ±ç¼æ件ï¼
StdPeriph_Driver : åæ¾STæ ååºæ件
CMSIS : åæ¾CMSISæ¥å£æ件ï¼è¿ä¹æ¯åºçä¸é¨åï¼
4.6 å建好Groupåï¼æ们å¼å§ä¾æ¬¡æ·»å æ件ã
5. ä¿®æ¹æºä»£ç ãæ们å°ä¿®æ¹main.c æ件ï¼æ¢ææ们èªå·±è·é©¬ç¯ç¨åºã
6. é 置工ç¨, ç¹å»âOptionsâæé®
6.1 åæ¢å°Outputã
éæ©Objectæ件夹ã
å¨Create Hex File åæé©ã
6.2 åæ¢å¸¦Listingã
éæ©Listingsæ件夹
6.3 åæ¢å°C/C++
æ·»å 两个é¢ç¼è¯å® STMFX_HD, USE_STDPERIPH_DRIVER ï¼è¿æ¯STåºç¨å°äºè¿ä¸¤ä¸ªå®ï¼
ä¿®æ¹Includesè·¯å¾
6.4 åæ¢å°Debug
éæ©ç¡¬ä»¶è°è¯å¨ï¼ç¼ºçæ¯è½¯ä»¶ä»¿çï¼ï¼æ们éæ©Cortex-M3 J-Linkè°è¯å¨
å Run to mainåæé©
6.4 åæ¢å°Utilities
éé¢è°è¯å¨ç±»åï¼æ们éæ©Cortex-M3 J-Link
ç¹settingsæé®ï¼æ·»å Flashç¼ç¨ç®æ³ï¼æ们éæ©STMé«å¯åº¦å¨ä»¶ï¼Flash容éKåè
7. é 置工ç¨å®æ¯ãä¸é¢å¼å§ç¼è¯ã
8. ç¼è¯OKï¼å¼å§è°è¯ã
9. æç¨ç»æã
å·²ç»è®²å¾å¾æ¸ æ¥äºå§ï¼å¦æè¿æä»ä¹çé®å¯ä»¥åé®ææè èç³»æã
树莓派Zero 2W安装Pyocd经验分享
树莓派Zero 2W安装Pyocd的经验分享,我直接跳过系统的安装配置和更新软件源的部分,因为这些网上都有详尽的指南。树莓派内置的烧写系统流程简单,但有几个关键步骤需要特别注意。
首要任务是安装libusb库,这是Pyocd运行的基础。紧随其后,我需要安装pip(由于没有预先安装,这部分是必要的)。随后更新pip版本,确保兼容性。
安装过程中,理解python命令前加sudo与不加的区别十分重要。它们操作在不同的环境中,因此避免混淆。
下载并解压pyocd源码后,我遇到了一个挑战:Zero 2W的内存限制导致编译过程异常。官方文档指出问题可能与CMSIS-Pack-Manager有关,但经过实际测试,我发现卡死的原因是capstone包,一个用于反编译的工具。由于我主要使用Zero 2W来下载程序,因此并不需要编译capstone包。如果需要反编译功能,可以尝试交叉编译或在4B上编译后复制到Zero 2W。
解决capstone包的问题,我注释了该包,并在项目根目录的setup.cfg文件中进行调整。随后,我执行编译命令,加入了sudo以获得足够的权限访问USB调试设备。尝试发现,Zero 2W在执行此命令时存在权限问题,但4B和Zero W并无此困扰。因此,我选择将pyocd编译到管理员目录下,成功解决了权限问题。
成功编译后,我尝试烧写固件,这一过程顺利无阻。如果你也想烧写F,可以参考特定的安装指南,注意过程可能较为漫长,需要耐心等待。