运算放大器技术文章分享RTThreadIAR(运算放大器函数技术文章倍数链接)

RT-Thread下IAR工程函数重定向为何失效?痞子衡旧文 《在IAR下将关键函数重定向到RAM中执行的方法》 里介绍了三种关键函数重定向方法,不过这三种方法只是写法形式不同,本质上没啥区别,都是利用 IAR 链接器特性将函数重定向到工程数据段(RW)所在 RAM 里。
对于 i.MXRT 这种拥有多块地址非连续的 RAM 的芯片,其实我们也可以单独将这些重定向函数放到一个指定的 RAM 里,不一定非得跟数据段放在同一个 RAM 里。
具体实现也很简单,只需要在链接文件里额外加一句 place in 语句处理即可,恩智浦官方 SDK 包里就是这么做的。
然而痞子衡最近在移植一个 i.MXRT1170 RT-Thread 工程时发现,在 IAR 链接文件里用自定义段来单独指定重定向函数到 ITCM 竟然失效了,这是怎么回事?今天我们一起来看一下:Note 1:阅读本文前需要对 《IAR链接文件(.icf)》、《IAR映射文件(.map)》 这两种文件有所了解。
Note 2:本文使用的 IAR EWARM 软件版本是 v9.10.2。
一、回顾SDK里函数重定向做法我们以最经典的 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7\iar 例程来看,工程 Build 选择 flexspi_nor_sdram_debug(仅该 build 预编译宏里有 XIP_BOOT_HEADER_DCD_ENABLE=1),即代码段放在 Flash 里(0x30000000 - ),数据段放在 SDRAM 里(0x80000000 - )。
在时钟初始化函数 BOARD_BootClockRUN() 里会调用如下 UpdateSemcClock() 函数,这个函数需要重定向到 RAM 里执行,在代码里先将它放到自定义 CodeQuickAccess 段里。
#define AT_QUICKACCESS_SECTION_CODE(func) func @"CodeQuickAccess"#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)AT_QUICKACCESS_SECTION_CODE(void UpdateSemcClock(void));void UpdateSemcClock(void){ SEMC->IPCMD = 0xA55A000D; while ((SEMC->INTR & 0x3) == 0); SEMC->INTR = 0x3; SEMC->DCCR = 0x0B; CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x602;}#endif#endif查看原文:https://www.dianyuan.com/eestar/article-7999.html运算放大器电路的放大倍数为什么不能太大或太小?在运算放大器的应用电路中,电路的闭环放大倍数必须设计为一个合适的值,不能太大,也不能太小,这是为什么呢?1、为什么不能太大在深度负反馈条件下,运算放大器电路的闭环放大倍数可以近似表示为但是,这只是近似放大倍数,而不是实际放大倍数,闭环放大倍数的准确表示为利用软件绘制一下电路实际闭环放大倍数与近似放大倍数之间的误差曲线,可以看出,随着电路闭环放大倍数的增加,二者的误差随之增加,因此,为保证准确近似,电路的闭环放大倍数不宜设计过高。
2、为什么不能太小从相位裕度的角度来考虑,相位裕度是指环路放大倍数为1时,环路相移与-180的差值。
运算放大器电路的闭环放大倍数设计的太小,会降低其相位裕度,从而影响电路稳定性。
假设电路反馈网络为纯电阻网络,此时环路增益环路相移为运算放大器的开环相移……查看原文:https://www.dianyuan.com/eestar/article-8001.html启动Flash时DQS与Dummy Cycle设置是怎样的关系?关于在 i.MXRT 上启动 NOR Flash 时如何设置正确的 Dummy Cycle 值,痞子衡一共写过四篇文章:《IS25WP系列Dummy Cycle设置》、《IS25LP系列Dummy Cycle设置》、《Dummy Cycle设置为0的误区》、《DTR模式下Dummy Cycle设置》, 这四篇文章都是针对普通 QuadSPI 型 Flash 而言的(一般没有 DQS 信号)。
而如果在 i.MXRT 上启动的是包含 DQS 信号的 Octal Flash 或者 Hyper Flash,此时 Dummy Cycle 设置有什么不同之处呢?今天痞子衡就和大家聊聊这个话题:一、Flash读时序中DQS与Dummy Cycle作用我们知道对于普通 QuadSPI 型 Flash,在 FlexSPI 模块 LUT 里配置读时序时,其中 Dummy Cycle 子序列中填的值必须要与 Flash 端的 Dummy Cycle 严格一致,否则会发生时序错乱(如下图 Extended 时序所示,图中是单线模式,四线模式类似)。
Flash 里一般都会开放寄存器给用户去配置 Dummy Cycle 值,Flash 工作频率越高,所需的最小 Dummy Cycle 也越大(可以理解为 Flash 存储体从接收到读命令开始到输出有效数据这一段时间间隔是恒定的,而我们衡量时间的基准是连接到 Flash 的 SCK,SCK 频率越高,相同间隔内所需 SCK 周期数就越多)。
Note1: 简单来说,Dummy Cycle 就是 Flash 响应主机每一次读时序所需要的准备时间,在 NOR Flash 上这个时间是固定且可设的,跟访问地址无关。
Note2: 一个确定的 Dummy Cycle 值决定了 Flash 上限工作频率,但此时 Flash 并不是只能在这个上限频率下工作,低于这个上限频率均可以。
DQS 信号正常是为 OctalSPI / HyperBus 型 Flash 工作在八线 DTR 模式下同步 DQ[7:0] 线输出而生的(见上图 Octal DDR 时序),关于其基本概念详见痞子衡旧文 《DQS信号简介》。
Note: 在 Hyper Flash 上负责 DQS 功能的信号是 RWDS。
当 OctalSPI / HyperBus 型 Flash 工作在 Octal DDR 模式下时,DQS/RWDS 信号会向主设备(这里指 i.MXRT)提示 DQ[7:0] 何时有效,所以这时候 DQS 信号其实也兼备了 Dummy Cycle 的作用。
不过考虑到有时候主设备端不一定会使能 DQS 信号,Dummy Cycle 的存在仍然是有必要的。
二、FlexSPI外设里DQS和Dummy Cycle联系在 《FlexSPI外设的LUT机制》 和 《DTR模式下Dummy Cycle设置》 两篇文章里有详细的关于 FlexSPI 外设中 Dummy Cycle 设置方法和 DQS 引脚功能配置方法介绍,但是这两者是怎样的联系关系呢?我们在 i.MXRT 参考手册 FlexSPI 章节可以找到如下 Hyper Bus 读时序示意图(对于 Octal Flash 也基本适用,仅微小区别),这张图很清晰地阐述了 RWDS 信号与 Latency Count 的联系,FlexSPI 外设在发起实际读时序时一定会输出 DUMMY_DDR 子序列里实际配置的延时周期,但如果配置的延时周期结束后,RWDS 有效信号还没有到来,FlexSPI 会自动插入足够的延时周期(即图中所谓的 Additional Latency count)直到 RWDS 信号有效……查看原文:https://www.dianyuan.com/eestar/article-7931.html深扒IAR启动函数流程里RW/ZI段初始化实现本篇是 《IAR启动函数流程及其__low_level_init设计对函数重定向的影响》 一文的后续,在上篇文章里我们在 IAR 软件安装目录下找到了标准启动函数 __iar_program_start() 相关源文件,并且分析了 __iar_program_start() 函数里的全部动作。
我们知道了其中负责 .data/.bss/.textrw 段初始化工作的是 __iar_data_init3() 函数,但是这个函数的具体实现并没有详细介绍,今天我们就仔细说说这个 __iar_data_init3() 函数:Note 1:阅读本文前需要对 《IAR链接文件(.icf)》 有所了解。
Note 2:本文使用的 IAR EWARM 软件版本是 v9.10.2。
一、为什么有些段需要初始化?《IAR链接文件(.icf)》 一文第一小节列出了 IAR 工程里定义的全部系统段(Section)名,其中 .data/.bss/.textrw 段是需要初始化的,因为这些段是链接在 RAM 里,而 RAM 上电其内容都是随机值,所以需要一段启动代码将 .data/.bss/.textrw 段所在的 RAM 区填上对应的初值(初值来自于下载了程序镜像文件的 Flash 区),然后应用程序才能正常运行。
Note: 除了 .data/.bss/.textrw 之外,还有一些段(.noinit/CSTACK/HEAP等)也链接在 RAM 区,但这些段对初值没有依赖,所以不需要初始化。

运算放大器技术文章分享RTThreadIAR(运算放大器函数技术文章倍数链接)

.bss // 初值为 0 的静态/全局变量(RAM).data // 初值为非 0 的全局变量(RAM).data_init // .data 段的初值(Flash).textrw // __ramfunc 修饰的重定向函数实际执行区(RAM).textrw_init // .textrw 段的机器码存储区(Flash)Copy二、RW/ZI段初始化的一般实现应用程序工程在编译链接结束后,.data/.bss/.textrw 段实际链接地址就确定了(这里指默认由 IAR 链接器自由分配具体链接地址,而不是用户在链接文件中指明具体链接地址的情况),我们知道了这些段的链接地址,就可以完成对应初始化工作(说白了,就是初值数据从 Flash 到 RAM 的拷贝工作),实际链接地址可以通过如下 IAR 链接器提供的接口来获取,具体拷贝过程可参看 《IAR下将关键函数重定向到RAM中执行的方法》 一文最后一节里的代码。
Note: IAR 链接器为了后续初始化的方便,都是将程序中全部的全局变量紧挨着放到一块连续的 RAM 区域(.data),然后其全部初值也一一对应紧挨着放一起(.data_init,下载到一块连续的 Flash 区);对于 .textrw 的处理也类似。
#pragma section = ".data"#pragma section = ".data_init"#pragma section = ".bss"#pragma section = ".textrw"#pragma section = ".textrw_init"uint8_t data_ram = __section_begin(".data");uint8_t data_rom = __section_begin(".data_init");uint8_t data_rom_end = __section_end(".data_init");uint8_t bss_start = __section_begin(".bss");uint8_t bss_end = __section_end(".bss");uint8_t code_relocate_ram = __section_begin(".textrw");uint8_t code_relocate_rom = __section_begin(".textrw_init");uint8_t code_relocate_rom_end = __section_end(".textrw_init");段初始化的一般实现虽然简单,但有个缺点,就是对于用户自定义 RW/ZI 段或者多个分散的 RW/ZI 段无法自动适应,需要根据实际情况不断调整代码实现……查看原文:https://www.dianyuan.com/eestar/article-7942.html同相比例放大器为什么对共模抑制比要求高?运放的共模抑制比如何仿真?昨天群友提了一个问题,为什么同相比例放大器对共模抑制比的要求会比较高?今天针对共模抑制比展开以下仿真思考。
我的回答其实也是很笼统,也是我在别的地方学习得到的现有的结论,大家这么说我也这样说。
对于这个问题,我也是比较好奇,到底共模抑制比会怎么影响同相比例放大器?那么就跟着仿真走一走吧。
共模抑制比的定义节选自《你好,放大器》:可以肯定的是同相比例放大器和反相比例放大器对于共模抑制比这个参数的要求是不一样的。
仿真分析-反向比例放大器为了验证反相比例放大器对CMRR这参数的要求,搭建了如下电路。
还是采用了理想运放,为防止偏置电流和失调电压对运放产生额外的影响,所以将这几项均设为0,且为了突出共模抑制比的影响,将共模抑制比调到20db(对共模信号抑制10倍,比较低),运放的放大倍数设为10倍(-R1/R2),输入信号幅值为1khz,幅值为1V的正弦波。
可以看到输出结果如预想一般,输出为1khz,幅值为10V(放大了10倍)的正弦波,可以看出反向比例放大器对CMRR变小并不是很care……查看原文:https://www.dianyuan.com/eestar/article-8006.html更多精彩内容,尽在电子星球 APP(https://www.eestar.com/)六篇技术文章,让你秒懂电容的脾气秉性七篇DIY技术文章献给你,让你脑洞全开五篇文章帮你开启DSP的学习思路汇总篇:关于PID知识,重点在此

联系我们

在线咨询:点击这里给我发消息