嵌入式系统基础概念与DSP开发要点
因项目需要转向嵌入式领域,开始系统学习相关知识。本文主要记录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位。芯片引脚通常具有复用功能,需通过配置选择工作模式。