当前位置:首页 > 技术 > 正文内容

嵌入式系统基础概念与DSP开发要点

访客 技术 2026年6月23日 1

因项目需要转向嵌入式领域,开始系统学习相关知识。本文主要记录DSP开发中的核心概念,资料主要源自网络整理。

MCU(微控制器)

MCU(Microcontroller Unit)是将CPU、RAM、ROM、定时器和I/O接口集成于单芯片的微型计算机系统,专用于控制电子设备,如家电、汽车电子和工业设备等。

寄存器

寄存器是处理器或外设中的物理硬件单元,每个寄存器分配有唯一地址。通过地址映射,程序可直接读写寄存器的比特位,实现对硬件的底层控制。寄存器由触发器构成,读写速度极快(通常一个时钟周期内完成),用于设置外设模式、读取状态标志或控制数据流。

中断优先级

嵌入式系统中的中断优先级分为抢占优先级和子优先级:

  • 抢占优先级:决定中断是否可以嵌套。高抢占优先级的中断可以打断正在执行的低优先级中断或任务。
  • 子优先级(响应优先级):当多个中断具有相同抢占优先级时,子优先级决定它们的处理顺序。子优先级高的中断先被响应。

中断向量表存储所有中断服务程序的入口地址。当多个同优先级中断同时发生时,处理器按向量表中的顺序依次检查并响应。

EALLOW;  // 关闭写保护
PieVectTable.XINT1 = &My_Ctrl;    // 将中断处理函数绑定到中断向量号
EDIS;    // 开启写保护

中断机制

中断是指CPU在处理程序时因突发事件(外部或内部)暂停当前任务,转去执行中断处理程序,完成后恢复原任务。以F28335为例,中断分为三级:外设级、PIE级和CPU级。该芯片有16个中断线,包括2个不可屏蔽中断(Reset和NMI)和14个可屏蔽中断,其中12个通过PIE与外设相连。

PIE与IER

PIE(外设中断扩展)管理外设中断,将中断分为多个组,每组有独立的使能寄存器。IER(全局中断使能寄存器)控制系统是否响应特定PIE组的中断,其每一位对应一个PIE组的全局使能。

PIE相关重要寄存器:

  • PIEIER:外设中断使能寄存器,每位对应一个外设的中断使能。
  • PIEIFR:中断标志寄存器,由硬件控制,标识外设是否触发中断。
  • PIEACK:中断确认寄存器,处理完中断后需清除对应标志。
  • PIECTRL:配置中断优先级和处理逻辑。
  • PIEIV:中断向量寄存器,用于确定中断服务程序入口。

示例:启用PIE组1的第3个外设中断:IER |= M_INT1;PIEIER1.bit.INT3 = 1;,清除中断使用 PieCtrlRegs.PIEACK.all = 0xFFFF;

XINTF(外部接口)

XINTF用于DSP与外部存储器或外设通信,支持SRAM、Flash、EEPROM等。每个区域的读写访问分为建立(Lead)、有效(Active)和跟踪(Trail)三个阶段,每个阶段的时间可单独配置。例如写操作时,片选信号XZCS0拉低,写选通XWE0随后拉低,数据送到数据总线XD。

SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
InitXintf16Gpio();

EALLOW;
XintfRegs.XINTCNF2.bit.XTIMCLK = 1; // XTIMCLK = 1/2 SYSCLKOUT
XintfRegs.XINTCNF2.bit.WRBUFF = 0;  // 无写缓冲
XintfRegs.XINTCNF2.bit.CLKOFF = 0;  // 使能XCLKOUT
XintfRegs.XINTCNF2.bit.CLKMODE = 1; // XCLKOUT = XTIMCLK/2

XintfRegs.XTIMING0.bit.XWRLEAD = 3;
XintfRegs.XTIMING0.bit.XWRACTIVE = 7;
XintfRegs.XTIMING0.bit.XWRTRAIL = 3;
XintfRegs.XTIMING0.bit.XRDLEAD = 3;
XintfRegs.XTIMING0.bit.XRDACTIVE = 7;
XintfRegs.XTIMING0.bit.XRDTRAIL = 3;

XintfRegs.XTIMING0.bit.X2TIMING = 0;
XintfRegs.XTIMING0.bit.USEREADY = 0;
XintfRegs.XTIMING0.bit.READYMODE = 0;
XintfRegs.XTIMING0.bit.XSIZE = 3;   // 数据总线宽度16位

时序设置中,0表示1个XTIMCLK周期。当XCLKOUT = XTIMCLK/2时,跟踪阶段结束时若逢下降沿,会多出一段校准周期。

NMI(非屏蔽中断)

NMI具有最高优先级,无法被屏蔽或忽略,即使系统关闭中断也能立即执行。

RCC(复位和时钟控制)

RCC是STM32中的模块,负责时钟源选择、时钟配置、复位控制以及外设时钟的启用/禁用,以节省功耗。

GPIO(通用输入输出)

GPIO可配置为输入或输出模式,用于读取传感器状态或控制LED等外设。上拉/下拉通过电阻将引脚默认拉到高电平(Vcc)或低电平(GND),防止悬空。

SPI(串行外设接口)

SPI是一种同步串行通信标准,由SCK、MISO、MOSI和NSS四线组成,采用环形总线结构,数据高位先行传输。

DMA(直接内存访问)

DMA控制器允许外设直接访问内存,无需CPU干预。传输时,DMA向CPU请求总线控制权,完成后释放,适用于高速数据传输。

PWM与ePWM

PWM通过调节占空比模拟电压。ePWM模块包含:

  • 时基模块(TB):由周期寄存器(PRD)、计数器(CNT)、比较寄存器(CMP)和时钟源组成,控制PWM频率。
  • 计数比较模块(CC):比较计数器值与CMPA/CMPB,决定占空比,支持对称和非对称模式。
  • 动作限定模块(AQ):通过AQCTLA/AQCTLB控制PWM信号的高低电平或事件触发。

锁相环(PLL)

PLL用于倍频和频率同步,由鉴相器(PD)、环路滤波器(LPF)和压控振荡器(VCO)组成。其工作过程:输入信号与VCO输出比较相位,误差经滤波后调整VCO频率,最终锁定。

RMS(均方根)

RMS用于表示交流信号的有效值,计算步骤:平方→平均→开方。例如,220V交流电的RMS对应峰值约311V。

LPF/HPF(低通/高通滤波器)

LPF允许低频通过、衰减高频;HPF反之。用于去除噪声或提取信号分量。

USART

USART支持全双工异步或同步串行通信,可配置波特率、数据位和停止位。

RAM与Flash

RAM速度快但易失,Flash非易失。DSP中,RAM启动从0x0000 0000开始,Flash启动从0x0008 0000开始。不接仿真器时,需注意GPIO72和GPIO84的电平设置。

Bootloader

Bootloader是系统上电后首先执行的代码,负责加载操作系统或应用程序到内存并移交控制权。

工程文件结构

  • cmd:链接命令文件,定义存储区域和段定位。
  • Debug:编译输出文件,如.out。
  • include:头文件(.h),定义寄存器数据结构。
  • lib:库文件,如rts.lib和csl.lib。
  • common:通用函数和宏定义。
  • targetConfig:仿真器配置文件(.ccxml)。
  • source:源文件(.c/.asm)。

C语言编程要点(TMS320F28x)

关键字

  • interrupt:声明中断服务函数。
  • register/cregister:提示编译器将变量存入寄存器或控制寄存器。

GPIO配置示例

GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;    // 功能设置为GPIO
GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;     // 输出方向
GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;     // 启用上拉

中断保护

为防止中断嵌套和重入,在中断函数开头禁用其他中断:

volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER3.all;
IER |= M_INT3;
IER &= ~M_INT3;
PieCtrlRegs.PIEIER3.all &= MG31;
PieCtrlRegs.PIEACK.all = 0xFFFF;
EINT;

链接器与段

程序段分为已初始化(.text、.cinit、.const等)和未初始化(.bss、.stack、.sysmem等)。通过#pragma CODE_SECTION#pragma DATA_SECTION可将代码或数据分配到指定区域。CMD文件使用MEMORY定义物理存储,SECTIONS指定段布局。

#pragma CODE_SECTION(Main_Ctrl, "ramfuncs");
#pragma DATA_SECTION(GpioDataRegs, "GpioDataRegsFile");

其他要点

DSP中每个地址对应16位数据,ARM则为8位。芯片引脚通常具有复用功能,需通过配置选择工作模式。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。