需求:转动FS4412电阻(蓝色小旋钮),在超级终端显示采集到的电压值
ADC模数转换器:采集电压数据
模拟量-》数据量,电压值-》机器内部能够理解的数值 如:1V-》100 5V-》500
脚:特定功能脚、通用的IO脚、多功能脚(GPIO控制器配置) 精度:12位备注:
红色:外部管脚(仅仅是名字,与硬件一一对应)
蓝色:芯片内部管脚 连接内部的控制器,也可连接到第3方控制芯片
特定功能脚:专门实现一种功能的管脚,例如:ADC模数转换器所使用的管脚,XadcAINn
通用管脚:GPIO、PIO、IO开头的管脚多功能脚:一根管脚可以实现多个功能,以 '/' 连接,如LCD灯的XvSYS_OE
XvSYS_OE/GPF3_5 多功能管脚/普通IO脚
数值V: 1024/4096 == V/1.8 难点:裸机不支持浮点操作、但需要显示浮点值
解决办法:放大,手动标小数点
ADC模块的选择:General(通用) ADC and MTCADC_ISP 0x10010118 [16] 0
转换模式:ADCCON(ADC控制寄存器) 初始化后, ADCDAT(数据转换寄存器) read
待命模式:TSADCCON0寄存器的TSSEL位为0、STANDBY位为1,转换数据停止,TSDATXn寄存器保存数据
编程模式:中断和轮询,轮询是 read ADCDATXn寄存器、检查最末端的ADCCONn标志位
ADCCONn标志位启动读时需要设置为1,边读边转换
阅读文档后,初步寄存器筛选:ADCCON ADCDLY(启动或者延时) ADCDAT ADCMUX(指定模拟输入通道)
不确定的便设置为默认,厂家一般给出的默认数值普通适应性都是最好的
ADCCON -》Base Address: 0x126C0000 [16] 1
1、选择ADC模块:ADCCFG 0x1001_0118 [16] 0 : General ADC
2、设置为转换模式: ADCCON
3、转换后数据存储寄存器: ADCDAT
4、不需要standy mode
5、adc poll(轮询)寄存器筛选:
ADCCFG 0x10010118 [16] 0 : General ADC
ADCCON 0x126C0000 0x1<<16 | 0x1<<14 | 0xff<<6
ADCDLY 0x126C0008 X
ADCDAT 0x126C000c read..
ADCMUX 0x126C001c 0x3
main.c:
#include "uart.h" //ADC模块寄存器器 #define ADCCFG *(unsigned int volatile*)0x10010118 //控制寄存器 #define ADCCON *(unsigned int volatile*)0x126C0000 //数据寄存器 #define ADCDAT *(unsigned int volatile*)0x126C000c //指定模拟输入通道寄存器 #define ADCMUX *(unsigned int volatile*)0x126C001c //分频寄存器 #define ADCDLY *(unsigned int volatile*)0x126C0008 //自定义睡眠函数 void delay(){ int t = 0xfffff*3; while(t--); } void adc_init() { ADCCFG = ADCCFG & ~(0x1<<16); ADCCON = 0x1<<16 | 0x1<<14 | 0xff<<6 ; ADCMUX = 0x3; ADCCON = ADCCON | (0x1<<1); } int adc_read() { return ADCDAT&0xfff; } void main() { adc_init(); while(1) { int data = adc_read(); int v = data*18/4096; uart_send(v/10 +'0'); uart_send('.'); uart_send(v%10+'0'); uart_send('\n'); delay(); } }
Makefile、myadd.S、test.lds、uart.c、uart.h:ARM之串口的RTC时钟实现_承诺$枷锁的博客-CSDN博客
效果:
## Starting application at 0x41000000 ... 0.0 1.2 1.2 1.2 1.2 1.2 1.2 1.2 1.2 1.0 0.6 0.2 0.0 0.0 0.5 1.0 1.5 1.7 1.7 1.7