6.16预计11月完成F1系统架构四个主动单元四个被动单元主动单元Cortex M3内核 DCode总线D-BusCortex M3内核 DCode总线D-Bus通用DMA1通用DMA2被动单元内部FLASH内部SRAMFSMCAHB到APB的桥它连接的所有APB外设AHB高级高性能总线 APB高级外围总线面试题6.171、什么是嵌入式嵌入式系统是专为特定应用场景设计的专用计算机系统以微控制器MCU或微处理器MPU为核心软硬件可裁剪。它通常对实时性、功耗、成本和可靠性有严格要求区别于通用PC典型特征是“软件固化在ROM中”且“软硬件强耦合”。2、嵌入式最小系统由哪些部分组成最小系统是指让MCU微控制器能够正常工作的最基本硬件电路集合。它通常由以下5个核心部分组成1. 电源电路供电2. 时钟电路心跳3. 复位电路重启4. 调试/下载接口烧录口5. 启动模式选择电路Boot3、嵌入式系统中常见的时钟源有哪些本质上分为外部时钟源和内部时钟源两大类具体常见类型如下1. 外部晶振/晶体无源晶振HSE/LSE高频晶振HSE通常为8MHz或25MHz作为PLL锁相环的输入经倍频后提供主频如72MHz、168MHz。低频晶振LSE通常为32.768KHz专门用于RTC实时时钟模块因为该频率分频后2^15恰好能产生1秒的精确时钟。2. 外部有源晶振振荡器内部已包含振荡电路的完整时钟源直接给MCU的OSC_IN引脚输入方波信号。它比无源晶振信号更稳定、抗干扰更强但成本较高常用于通信设备或对时钟抖动要求严苛的场景。3. 内部RC振荡器HSI/LSI由芯片内部的电阻电容构成无需外接元器件。高频内部时钟HSI通常为8MHz或16MHz。优点是启动快微秒级、节省引脚但精度较低温漂大常用于低功耗唤醒或作为备用时钟。低频内部时钟LSI通常为30KHz~40KHz左右主要用于独立看门狗IWDG和低功耗模式的唤醒。4. 外部时钟输入GPIO直输直接由外部其他芯片如蓝牙模块、GPS模块产生的时钟信号从外部时钟输入引脚灌入不经过晶振电路。实际运行时MCU很少直接使用原始时钟源而是通过内部的PLL锁相环对HSE或HSI进行‘倍频’如8MHz倍频到168MHz后再分频给内核、总线和各个外设使用。同时为了保证系统可靠性通常还会配置‘时钟安全系统CSS一旦检测到外部HSE失效硬件自动切换到内部HSI防止系统死机。4、什么是时钟树时钟树是MCU内部时钟系统的整体架构图它描述了原始时钟源晶振/RC是如何经过一系列路径最终分配给CPU、总线和各个外设使用的。时钟树的核心处理流程是时钟源 → 选择器Switch→ PLL锁相环倍频→ 分频器Divider→ 门控电路 → 外设/内核。5、GPIO有哪些模式一、输入浮空特点空闲时IO状态不确定高阻态由外部环境决定上下拉电阻关闭双MOS管关闭施密特触发器打开二、输入上拉 key012特点空闲时由于上拉电阻IO呈现高电平上拉电阻打开下拉电阻关闭施密特触发器打开双MOS管不导通三、输入下拉 key up按键特点空闲时由于下拉电阻IO呈现低电平上拉电阻关闭下拉电阻打开施密特触发器打开双MOS管不导通四、模拟功能特点专门用于模拟信号输入或输出ADC和DAC上下拉关闭施密特关闭双MOS管不导通输入的时候不能输出但是输出的时候可以输入输出模式触发器打开五、开漏输出特点不能输出高电平必须有外部上拉电阻才能输出高电平上下拉电阻关闭施密特触发器打开P-MOS管始终不导通往ORD对应位写0N-MOS管导通输出0写1则P-MOS管不导通呈现高阻态六、推挽输出特点可输出高低电平驱动能力强上下拉电阻关闭施密特触发器打开往ORD对应位写0N-MOS管导通输出0写1则P-MOS管导通输出1七、开漏输出复用模式开漏输出P-MOS管永远不导通所以不能输出高电平八、推挽输出复用模式来自片上外设的都是复用模式6、AHB总线时钟和APB总线时钟的关系AHB是APB的“父时钟”APB时钟由AHB时钟经过“分频器”分频得到。7、为什么外设使用前要使能时钟表层原因为了降低功耗但深层原因涉及寄存器操作的有效性。1. 核心原因时钟门控Clock Gating降低动态功耗CMOS电路的功耗主要由动态功耗翻转充放电决定。MCU内部所有外设的数字逻辑如寄存器、状态机都需要时钟边沿触发才能工作。如果所有外设时钟默认全开即使外设未使用也会产生巨大的无效翻转电流。因此芯片设计采用“时钟门控”技术——默认关闭所有外设时钟使用时再通过RCC复位和时钟控制模块使能从而大幅降低整机功耗。2. 根本原理寄存器写入需要有效时钟边沿如果外设时钟未使能其内部的总线接口APB/AHB桥接器处于休眠状态。此时即使CPU通过总线向外设寄存器写入配置值该写操作也无法被外设锁存因为没有时钟边沿触发作保持写入无效。读取时也会读到默认的复位值或产生总线错误。3. 面试必杀技避免进入HardFault硬错误在Cortex-M内核中如果外设时钟未使能而强行访问该外设的寄存器在某些系列如STM32F1/F4中虽不会立刻HardFault但寄存器写入无效极易引发业务逻辑乱套而在部分安全等级较高的MCU或某些总线配置下此类非法访问会直接触发总线错误Bus Fault进而导致HardFault使系统死机。因此正确的初始化顺序必须是先使能RCC对应外设时钟等待硬件稳定→ 再配置GPIO复用功能 → 最后配置外设寄存器并使能外设本身。6.18输出控制输入检测头文件配置#ifndef __LED_H #define __LED_H #include stm32f10x.h //寄存器配置 //宏定义函数 //PB5 低电平有效 #define LED0_ON() do{ GPIOB-ODR ~(0X01U 5); }while(0) //开 #define LED0_OFF() do{ GPIOB-ODR | (0X01U 5); }while(0) //关 #define LED0_TOGGLE() do{ GPIOB-ODR ^ (0X01U 5); }while(0) //翻转 //PE5 低电平有效 #define LED1_ON() do{ GPIOE-ODR ~(0X01U 5); }while(0) //开 #define LED1_OFF() do{ GPIOE-ODR | (0X01U 5); }while(0) //关 #define LED1_TOGGLE() do{ GPIOE-ODR ^ (0X01U 5); }while(0) //翻转 void Register_LED_Init(void); #endif#ifndef __BEEP_H #define __BEEP_H #include stm32f10x.h //PB8 高电平有效 //宏定义函数 #define BEEP_ON() do{ GPIOB-ODR | (0X01U 8); }while(0) //开 #define BEEP_OFF() do{ GPIOB-ODR ~(0X01U 8); }while(0) //关 #define BEEP_TOGGLE() do{ GPIOB-ODR ^ (0X01U 8); }while(0) //翻转 void Register_BEEP_Init(void); #endif#ifndef __KEY_H #define __KEY_H #include stm32f10x.h //按键读取 #define KEY_UP_READ() do{ (((GPIOA-IDR) (1U 0)) ? 1 : 0) ; }while(0) //开 #define KEY0_READ() do{ ((((GPIOE-IDR) (1U 4))0U)? 1 : 0) ; }while(0) //关 #define KEY1_READ() do{ ((((GPIOE-IDR) (1U 3))0U)? 1 : 0) ; }while(0) //翻转 #define KEY2_READ() do{ ((((GPIOE-IDR) (1U 2))0U)? 1 : 0) ; }while(0) //翻转 void Register_KEY_Init(void); #endif