<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>嵌入式 on lategege 的技术博客</title><link>https://lategege.com/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F/</link><description>Recent content in 嵌入式 on lategege 的技术博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 25 Nov 2022 09:04:05 +0000</lastBuildDate><atom:link href="https://lategege.com/categories/%E5%B5%8C%E5%85%A5%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>arm32位指令和芯片外设控制器知识总结</title><link>https://lategege.com/p/arm32%E4%BD%8D%E6%8C%87%E4%BB%A4%E5%92%8C%E8%8A%AF%E7%89%87%E5%A4%96%E8%AE%BE%E6%8E%A7%E5%88%B6%E5%99%A8%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/</link><pubDate>Fri, 25 Nov 2022 09:04:05 +0000</pubDate><guid>https://lategege.com/p/arm32%E4%BD%8D%E6%8C%87%E4%BB%A4%E5%92%8C%E8%8A%AF%E7%89%87%E5%A4%96%E8%AE%BE%E6%8E%A7%E5%88%B6%E5%99%A8%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/</guid><description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;32位arm cpu采用流水线设计，分为取址、译码、执行，一条汇编指令对应一条机器码，占用32位 4个字节。32位cpu最大寻址空间为4g，上电默认从0x00000000地址执行。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;一般而言，该地址存放芯片厂商的BL0程序，固化在芯片内部的irom中，一般大小只有几十KB，同时芯片内部还有一个较小的iram内存以供该段程序执行。BL0会获取开发板上的拨码开关状态来决定从SD卡还是EMMC运行，它其实是一条跳转指令B 地址，在SD卡中刷入uboot引导，uboot是二进制程序，是cpu能够直接运行的一个精简系统，它支持用户终端输入、文件系统、多种网络协议。由于它支持终端输入，所以可配置环境变量来引导linux内核，linux内核也是一段二进制程序，它通过和设备树结合来运行，运行后挂载根文件系统进入shell环境。根文件系统是一个包含很多工具已经内核配置以及众多库的一个文件列表。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;ARM 处理器共有 7 种不同的处理器模式：&lt;br/&gt;（1）USR（10000）：正常用户模式，程序正常执行模式。&lt;br/&gt;（2）FIQ（10001）：快速中断模式，以处理快速情况，支持高速数据传输或通道处理。&lt;br/&gt;（3）IRQ（10010）：外部中断模式，普通中断处理&lt;br/&gt;（4）SVC（10011）：操作系统保护模式（管理模式），即操作系统使用的特权模式（内核），处理软件中断swi reset&lt;br/&gt;（5）abt（10111）：数据访问中止模式，用于 虚拟存储器 和 存储器 保护&lt;br/&gt;（6）und（11011）：未定义指令终止模式，用于支持通过软件仿真硬件的协处理器&lt;br/&gt;（7）sys（11111）：系统模式，用于运行特权级的操作系统任务（ armv4 以上版本才具有）&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;在不同模式下，寄存器有的共用，有的有独立寄存器，见下图。&lt;br/&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" src="https://img.lategege.com:30443/images/web/2022/11-25/1.png"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;CPSR寄存器前面几位记录了cpu运算过程中发生溢出等，后面几位代表IRQ、FIQ中断的开启与否，指令集状态为thumb还是arm状态，以及arm处于具体的工作模式。IRQ和FIQ都是硬件中断，不过它们的优先级不同，SWI为软中断。当中断发生时，cpu会跳转到异常向量表，这个向量表默认为0x00 -0xXX ，每一种模式占向量表中的4个字节，只能包含一条跳转指令，硬件与cpu之间是通过中断控制器来处理中断的，中断控制器中有一个中断队列，负责管理中断，同时中断控制器包含所有外设的中断ID,当发生中断后，cpu处理中断过程中可以通过读取中断控制器中的id获知是哪个硬件产生的中断，从来处理逻辑。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;R15也就是PC寄存器，PC寄存器永远指向当前要执行的指令，R13也就是LR寄存器，指向跳转后返回需要执行的指令。如果有多级跳转，那么需要将数值压栈。指令的跳转一般伴随着寄存器存储值的入栈和出栈，当返回后不至于数据丢失。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;当CPU处于用户模式下，没有权限修改CPSR，所以CPU改变模式意味着发生中断，或者发生错误。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;FIQ的优先级优于IRQ，同时FIQ在异常向量表中的地址处于最末尾，后面可以紧跟一段程序，免去了跳转指令，同时FIQ模式下R8-R12都有它独立的寄存器，使用这些寄存器不需要出入栈，使得FIQ的运行速度更快。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;ARM最常用汇编指令：MOV 将值移入寄存器， LD开头 从内存载入寄存器 ST开头 从寄存器存入内存 B开头 跳转 SUB 减法 ADD 加法 M开头 协处理器 SWI 软中断指令 &lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;片内外设控制器：&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;GPIO 负责通用的输入输出，UART 串口 一般由两个线(TD、RD）它用来点对点通信，串口通过波特率来保证两段同步，串口最多每次发5-8位数据，发送之前要发送开始信号，结束要发送结束信号。WDT 开门狗 :本质是一个倒计时硬件，倒计时结束(意味着发生cpu错误)产生cpu复位，cpu需要时不时通知修改WDT的倒计时保证不归零，开门狗也可用来作为定时器，ADC 模数转换器，可用来监测电压的变化，RTC 时钟：一个具备统计当前时间的控制器，以BCD格式存储，一般由备用电池供电来保证断电后时间的准确性，PWM：能发出脉冲信号的控制器，用于无源蜂鸣器发声。IIC总线，芯片级通信协议，由SCL\SDA两条线构成，IIC默认情况下两条线都是高电平，SCL下降沿代表发送，上升沿代表结束。IIC是主从结构，初次发送一位开启位占领总线，然后发送7位地址信息以及发送方向，接收方发送应答，发送方发送数据，接收方发应答，发送方发结束信号，IIC是半双工通信协议。SPI: spi也是一种总线协议，它由多条线组成，时钟线、主-从线，从-主线、CS线，CS线有多少个从设备，主设备就要引出多少条CS线，CS线同一时间只有一条线的电平保持通信中该有的电平，时钟线保证数据同步收发，它是全双工的通信，所以它比IIC速度快。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;</description></item><item><title>mac使用vscode搭建stm32开发环境</title><link>https://lategege.com/p/mac%E4%BD%BF%E7%94%A8vscode%E6%90%AD%E5%BB%BAstm32%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link><pubDate>Thu, 15 Apr 2021 14:13:57 +0000</pubDate><guid>https://lategege.com/p/mac%E4%BD%BF%E7%94%A8vscode%E6%90%AD%E5%BB%BAstm32%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</guid><description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;最近在学习嵌入式开发，买了野火的stm32开发板，花了几天时间，目前算是入了个门吧。作为一名全栈开发工程师，用多了精致顺手的IDE，用惯macOS的我面对windows下的keil开发工具，实在是哭笑不得，无论是语法的检查和代码的补全都太弱了，而且界面太丑。于是寻找mac系统下的替代方案。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;找了一圈发现VS CODE不错，之前用过vscode写过一下c程序 也写过一些js相关的，对嵌入式开发来说有一个相当强悍的插件PLATFORMIO，这个插件到底有多牛后面来分析。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;在mac下搭建stm32主要就两个步骤：&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;一、下载vscode ---&amp;gt; https://code.visualstudio.com/&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;二、打开vscode安装PLATFORMIO插件 重启vscode&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"id":396,"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" class="wp-image-396" src="https://img.lategege.com:30443/images/web/uploads/2021/04/1-1024x590.png"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;如果发现左侧下方出现一个蚂蚁图标就说明安装好了，下方有个勾是编译开关、-&amp;gt;是将程序载入开发板&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"id":397,"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" class="wp-image-397" src="https://img.lategege.com:30443/images/web/uploads/2021/04/2-1024x750.png"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;点击New Project 取个名字 选择stm芯片型号 因为我是野火指南者开发板 所以选择stm32f103ve&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;固件库这里我选择STM32Cube,这个固件库和野火教程是不一样的，使用起来也不太一样，不过思想都是相通的。&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;由于野火配套的仿真器是cmsis-dap协议的，所以在工程根目录下platformio.ini修改调试协议 如下 :&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;[env:genericSTM32F103VE]&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;platform = ststm32&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;board = genericSTM32F103VE&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;framework = stm32cube&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;debug_tool = &lt;strong&gt;cmsis-dap&lt;/strong&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;upload_protocol = &lt;strong&gt;cmsis-dap&lt;/strong&gt;&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;最后编一个亮灯程序试下：&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"id":398,"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" class="wp-image-398" src="https://img.lategege.com:30443/images/web/uploads/2021/04/3-1024x592.png"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;编译，没错误&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"id":399,"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" class="wp-image-399" src="https://img.lategege.com:30443/images/web/uploads/2021/04/4-1024x578.png"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;
&lt;!-- wp:paragraph --&gt;
&lt;p&gt;加载，开发板成功点亮&lt;/p&gt;
&lt;!-- /wp:paragraph --&gt;
&lt;!-- wp:image {"id":400,"sizeSlug":"large"} --&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img alt="" class="wp-image-400" src="https://img.lategege.com:30443/images/web/uploads/2021/04/5-1-460x1024.jpeg"/&gt;&lt;/figure&gt;
&lt;!-- /wp:image --&gt;</description></item></channel></rss>