ARM 单片机不止传统用的哪几家,还有ADI,哈哈哈哈哈。所以学过的知识可以迁移。
在以前就写过355的相关内容。
ARM-Cortex M核心的启动过程 上午写过ARM的启动过程,也可以看看355的启动过程。
我才知道355和356的区别在RAM上面,官网一直看不出来
Keli上面还给了内存布局
1. afe_die_registers 7 KiB 描述:AFE(模拟前端)相关的寄存器区域。AFE通常用于处理模拟信号(如传感器信号),这部分内存用于存储AFE模块的配置和控制寄存器。
2. digital_die_registers 276 KiB 数字核心相关的寄存器区域。这部分内存用于存储数字外设(如GPIO、UART、SPI等)的配置和控制寄存器。
3. dRAM_always_retained_region 8 KiB 始终保留的DRAM区域。这部分内存在芯片休眠或复位时不会被清除,通常用于存储关键数据或状态信息。
4. dRAM_bank1_retained_region 8 KiB Bank1保留的DRAM区域。这部分内存在特定条件下(如休眠模式)可以保留数据,通常用于存储需要持久化的数据。
5. dRAM_bank2_retained_region 16 KiB Bank2保留的DRAM区域。与Bank1类似,但容量更大,适用于存储更多的持久化数据。
6. dRAM_never_retained_region 32 KiB 从不保留的DRAM区域。这部分内存在芯片休眠或复位时会被清除,通常用于存储临时数据或缓存。
7. IROM1 128 KiB 内部ROM区域。这部分内存通常用于存储固件或引导代码,是只读的,用于芯片启动时加载和执行初始代码。
8. uart_registers UART(通用异步收发传输器)相关的寄存器区域。这部分内存用于配置和控制UART通信模块。
其实没有什么库说明,就找个合适的demo去修改
文件分类就比较好
使用了正儿八经的CMSIS,ADI没啥MCU的野心,听ARM的话
定义符号__intial_sp指向栈顶。
如果使用堆,还需定义符号__heap_base和__heap_limit。
堆栈大小为 0x400(1KB)。 使用 AREA 指令定义了一个名为 STACK 的区域,用于存储堆栈。 __initial_sp 是堆栈的初始指针。
堆大小为 0xC00(3KB)。 使用 AREA 指令定义了一个名为 HEAP 的区域,用于存储堆。 __heap_base 和 __heap_limit 分别表示堆的起始和结束地址。
跟着是向量表
定义了芯片的中断向量表,包括系统异常(如复位、NMI、硬错误等)和外部中断(如GPIO、UART、SPI等)。 每个中断向量对应一个处理函数(Handler),默认情况下这些函数是弱定义的([WEAK]),可以被用户重写。 __vector_table_Size 计算了向量表的大小。
都是这样的
复位
首先禁用ISRAM(如果启用ADI_DISABLE_INSTRUCTION_SRAM)。 调用 SystemInit 函数初始化系统(如时钟、外设等)。 跳转到 __main,进入主程序。
这是中断
默认的中断处理函数都是无限循环(B .),用户可以根据需要重写这些函数。
如果使用 __MICROLIB(小型库),则直接导出堆栈和堆的地址。 否则,使用 __user_initial_stackheap 函数初始化堆栈和堆。
还有一段代码
禁用中断:使用
__disable_irq()
禁用所有中断,确保初始化过程不会被中断打断。设置中断向量表:如果定义了
RELOCATE_IVT
,则将中断向量表重定位到__relocated_vector_table
(通常在SRAM中)。否则,使用默认的中断向量表__vector_table
。启用SRAM保留:
调用
adi_system_EnableRetention(ADI_SRAM_BANK_1, true)
,使SRAM Bank1在休眠模式下保留数据。启用系统异常:设置
SCB->SHCSR
寄存器,启用用法错误(Usage Fault)、总线错误(Bus Fault)和内存管理错误(Memory Fault)异常。刷新指令和数据流水线:使用
__ISB()
和__DSB()
确保新的设置立即生效。调用默认设置:调用
adi_default_setting()
,执行其他默认的系统配置。启用中断:使用
__enable_irq()
重新启用中断。
先初始化一下
然后就是时钟配置
DigClkSel(DIGCLK_SOURCE_HFOSC):选择高频振荡器(HFOSC)作为数字时钟源。 ClkDivCfg(1,1):配置时钟分频器,使HCLK(系统时钟)和PCLK(外设时钟)都为26MHz。
乱糟糟的
和这个数据手册倒是挺一致的
串口
DioCfgPin(pADI_GPIO0,PIN10|PIN11,1):配置GPIO0的PIN10和PIN11为UART引脚。 UrtCfg(pADI_UART0,B230400,(BITM_UART_COMLCR_WLS|3),0):配置UART0为230400波特率,8位数据位,无校验位,1位停止位。 UrtFifoCfg(pADI_UART0, RX_FIFO_1BYTE, BITM_UART_COMFCR_FIFOEN):配置UART0的FIFO为1字节深度,并启用FIFO。 UrtFifoClr(pADI_UART0, BITM_UART_COMFCR_RFCLR|BITM_UART_COMFCR_TFCLR):清除UART0的接收和发送FIFO。
AD5940_MCUResourceInit(0):初始化AD5940所需的MCU资源(如GPIO、SPI等)。
AD5940_Main():进入AD5940的主程序,通常用于执行AD5940的主要功能(如信号采集、处理等)。
对AFE的操作在另外一个文件:
APPBUFF_SIZE:定义应用程序缓冲区的大小为512。
AppBuff:用于存储AD5940的测量数据和命令。
Keli还行,补全
keli这个阅读功能也行
AFE的传感器传感器非常多怎么办?
第一要了解整个测量系统,然后就没了。
然后就是控制对应的位
就这样的,就可以使用了
这个是封装在芯片内部的样子
昨天群里面发了一个这个,如果使用355就很更小
内部的ADC很眼熟 精密小体积ADC-AD7682 16位4通道 结构是差不多的,但是结构是不一样的。
后面是加入了一个仪表放大器的,然后PGA放大,传入ADC
自带的可以进行工频干扰抑制,以及一部分的DFT处理。
这个芯片现在有人拿来做阻抗测量
可以更少的硬件
因为温漂对ADC的影响非常大,这里居然使用了两个温度计来校准
测量完可以通过这个寄存器写入
下篇继续