S5PV210裸机(九):ADC

        本文主要探讨210的ADC相关知识。   

        ADC
         
       ADC:模数转换(模拟信号转数字信号)
                量程:模拟电压信号范围(210为0~3.3V)
                精度:若10二进制位来表示精度(210为10位或12位),量程为0~3.3V,则精度为3.3V/2^10=0.0032265V
                转换速率(MSPS):每秒转多少M数字值,210为 1 MSPS
                通道数:模拟信号输入的路数,210共10ADC通道(AIN[0]~AIN[9]),同时可做10路AD转换,通道引脚为模拟引脚

        ADC寄存器


                

                TSADCCON0 ADC的配置


                TSDATX0,TSDATY0转出的AD值


 

                CLRINTADC0清中断


                ADCMUX选择AD通道

demo:

        测试ADC的值变化状况(转动螺丝)

start.S

#define WTCON           0xE2700000
#define SVC_STACK       0xd0037d80
#define SOFT_SW         0xE010E81C
 
.global _start
 
_start:
 
        //set soft switcher,mean set XEINT[0] as PS_HOLD_OUT_EN,set output high level
        ldr r0, =SOFT_SW
        ldr r1, [r0]
        orr r1, r1, #0x300
        orr r1, r1, #0x01
        str r1, [r0]
 
        //close WatchDog
        ldr r0,=WTCON
        ldr r1,=0x0
        str r1,[r0]
 
        //init SVC stack
        ldr sp,=SVC_STACK
 
 
        //init icache
        mrc p15,0,r0,c1,c0,0
        bic r0,r0,#(1<<12)      //close icache
        orr r0,r0,#(1<<12)      //open icache
        mcr p15,0,r0,c1,c0,0 
 
 
        //use func
        bl main
 
        b .

main.c 

#include "uart_printf.h"
#include "adc.h"
#include "stdio.h"

int main()
{
        //init uart
        init_uart();
        printf("init uart\r\n");

        //init adc
        printf("init adc\r\n");
        init_adc();

        //read adc
        printf("read adc data\r\n");
        read_adc_data();

        return 0;
}

uart_printf.h

void init_uart();

uart_printf.c

#define GPA0CON         0xE0200000
 
#define ULCON0          0xE2900000
#define UCON0           0xE2900004
#define UFCON0          0xE2900008
#define UMCON0          0xE290000C
#define UTRSTAT0        0xE2900010
#define UTXH0           0xE2900020
#define URXH0           0xE2900024
#define UBRDIV0         0xE2900028
#define UDIVSLOT0       0xE290002C
 
#define rGPA0CON        (*(volatile unsigned int *)GPA0CON)
#define rULCON0         (*(volatile unsigned int *)ULCON0)
#define rUCON0          (*(volatile unsigned int *)UCON0)
#define rUFCON0         (*(volatile unsigned int *)UFCON0)
#define rUMCON0         (*(volatile unsigned int *)UMCON0)
#define rUTRSTAT0       (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0          (*(volatile unsigned int *)UTXH0)
#define rURXH0          (*(volatile unsigned int *)URXH0)
#define rUBRDIV0        (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0      (*(volatile unsigned int *)UDIVSLOT0)
 
//init uart
void init_uart()
{
        //set gpio as uart(rx,tx)
        rGPA0CON &= ~(0xff);
        rGPA0CON |= ((1<<2)|(1<<5));
 
        //set uart base configure(mode)
        rULCON0 = 0x3;
        rUCON0 = 0x5;
        rUMCON0 = 0;
        rUFCON0 = 0;
 
        //set uart baud
        //DIV_VAL = (PCLK / (bps x 16))-1
        //(66000000 /(115200 * 16)) -1 = 34.8
        rUBRDIV0 = 34;
 
        //set uart baud calibration
        //0.8 * 16 = 13,check 210 table
        rUDIVSLOT0 = 0xdfdd;
}
 
 
//send data
void putc(char data)
{                  
        while (!(rUTRSTAT0 & (1<<1)));
        rUTXH0 = data;
}
 
//receive data
char getc()
{
        while (!(rUTRSTAT0 & (1<<0)));
        return (rURXH0 & 0xff);
}

adc.h

void init_adc();

void read_adc_data();

adc.c

#include "stdio.h"

#define TSADCCON0       0xE1700000
#define TSDATX0         0xE170000C
#define TSDATY0         0xE1700010
#define ADCMUX          0xE170001C

#define rTSADCCON0      (*(volatile unsigned int *)TSADCCON0)
#define rTSDATX0        (*(volatile unsigned int *)TSDATX0)
#define rTSDATY0        (*(volatile unsigned int *)TSDATY0)
#define rADCMUX         (*(volatile unsigned int *)ADCMUX)

static void dealy_time()
{
        volatile unsigned int num = 900000;
        while(num--);
}

void init_adc()
{
        //set adc is 10 bit 
        rTSADCCON0 |= (1<<16); 
        //set adc enable prescaler 
        rTSADCCON0 |= (1<<14);
        //set adc prescaler value,value = 66 / (65 + 1) = 1Mhz
        rTSADCCON0 &= ~(0xff<<6);
        rTSADCCON0 |= (65<<6); 
        //set adc mode(normal)
        rTSADCCON0 &= ~(1<<2);
        //close when start adc is read only
        rTSADCCON0 &= ~(1<<1);
        //select adc channel 0
        rADCMUX &= ~(0xf);
}

void read_adc_data()
{
        volatile unsigned int x_value = 0;
        volatile unsigned int y_value = 0;
        while(1)
        {
                //start adc
                rTSADCCON0 |= (1<<0);
                //judge adc adc covert status(end or ing)
                while(!(rTSADCCON0 & (1<<15)));
                //read adc data
                x_value = rTSDATX0;
                y_value = rTSDATY0;
                printf("read adc data :   x : %d    y : %d\r\n",(x_value & 0xfff),(y_value & 0xfff));
                dealy_time();
        }
}

link.lds

SECTIONS
{
        . = 0xd0020010;
 
        .text : 
        {
                start.o
                * (.text)
        }
    
        .data : 
        {
                * (.data)
        }
 
        bss_start = .;
 
        .bss : 
        {
                * (.bss)
        }
}

Makefile

 

CC      =       arm-linux-gcc
LD      =       arm-linux-ld
OBJCOPY =       arm-linux-objcopy
OBJDUMP =       arm-linux-objdump
 
INCDIR  := $(shell pwd)
 
#预处理器的flag,flag就是编译器可选的选项
CPPFLAGS  := -nostdlib -nostdinc -I$(INCDIR)/include
#C编译器的flag
CFLAGS    := -Wall -O2 -fno-builtin
 
export CC LD OBJCOPY OBJDUMP CPPFLAGS CFLAGS
 
objs      := start.o uart_printf.o main.o adc.o
objs      += lib/libc.a
 
led.bin:$(objs)
        $(LD) -Tlink.lds -o adc.elf $^
        $(OBJCOPY) -O binary adc.elf adc.bin
        $(OBJDUMP) -D adc.elf > adc.dis
        gcc mkv210.c -o mkv210
        ./mkv210 adc.bin sd.bin
 
lib/libc.a:
        cd lib;  make;  cd ..
 
%.o:%.S
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
 
%.o:%.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
 
clean:
        rm *.o *.elf *.bin *.dis mkv210 -f
        cd lib; make clean; cd ..

文件示例:

结果示例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/110237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性代数 第三章 向量

一、运算 加法、数乘、内积 施密特正交化 二、线性表出 概念&#xff1a;如果&#xff0c;则称可由线性表出&#xff08;k不要求不全为0&#xff09; 判定&#xff1a; 非齐次线性方程组有解无关&#xff0c;相关 如果两个向量组可以互相线性表出&#xff0c;则称这两个…

Xilinx 7 系列 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性

如果通过LVDS进行接口&#xff0c;可以按照以程图中的步骤操作&#xff0c;以确保满足正确使用LVDS的所有要求。 40191 - 7 系列 - 1.8V LVDS 和 2.5V LVDS 信号之间的 LVDS 兼容性 与LVDS兼容驱动器和接收器连接时&#xff0c;7系列LVDS和LVDS_25输入和输出应该不存在兼容性问…

案例分析真题-系统建模

案例分析真题-系统建模 2009年真题 【问题1】 【问题2】 【问题3】 2012年真题 【问题1】 【问题2】 【问题3】 2014年真题 【问题1】 【问题2】 骚戴理解&#xff1a;这个题目以前经常考&#xff0c;不知道今年会不会考&#xff0c;判断的话就是看加工有没有缺少输入和输出&a…

C++面试——多线程详解

C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread>中。它解决了跨平台的问题&#xff0c;提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C11 新标准中引入了5个头文件来支持多线程编程&#xff0c;如下图所示&#xff1a; 多进程与多线程 多…

SSH 无密登录设置

1 &#xff09; 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的 IP 地址&#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [libaihadoop102 ~]$ ssh hadoop103 ➢ 如果出现如下内容 Are you sure you want to continue c…

MAC缓解WebUI提示词反推

当前环境信息&#xff1a; 在mac上安装好stable diffusion后&#xff0c;能做图片生成了之后&#xff0c;遇到一些图片需要做提示词反推&#xff0c;这个时候需要下载一个插件&#xff0c;参考&#xff1a; https://gitcode.net/ranting8323/stable-diffusion-webui-wd14-tagg…

mac 安装homebrew ,golang

mac 安装homebrew ,golang 安装homebrew安装golang选择 apple arm 版本安装配置环境变量 安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"回车执行指令后&#xff0c;根据提示操作。具体包括以下提示操作&am…

ios 代码上下文截屏之后导致的图片异常问题

业务场景&#xff0c;之前是直接将当前的collectionview截长屏操作&#xff0c;第一次截图会出现黑色部分原因是视图未完全布局&#xff0c;原因是第一次使用了Masonry约束然后再截图的时候进行了frame赋值&#xff0c;可以查看下Masonry约束和frame的冲突&#xff0c;全部修改…

除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

Qt 重写QSlider简单实现滑动解锁控件(指定百分比回弹效果)

组件效果图&#xff1a; 应用场景&#xff1a; 用于滑动解锁相关场景&#xff0c;Qt的控件鼠标监听机制对于嵌入式设备GUI可触摸屏依旧可用。 实现方式&#xff1a; 主要是通过继承QSlider以及搭配使用QStyleOptionSlider来实现效果。 注意细则&#xff1a; QStyleOption…

【IDEA】每个方法之间如何设置分隔线

修改后效果&#xff1a; 各个方法之间出现了分隔线

洞察运营机会的数据分析利器

这套分析方法包括5个分析工具&#xff1a; 用“描述性统计”来快速了解数据的整体特点。用“变化分析”来寻找数据的问题和突破口。用“指标体系”来深度洞察变化背后的原因。用“相关性分析”来精确判断原因的影响程度。用“趋势预测”来科学预测未来数据的走势&#xff0c;

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一&#xff1a;function function declarations2.1.1 示例 2.2 方式二&#xff1a;class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

vscode开启emmet语法

需要在setting.json中添加配置 首先进入设置&#xff0c;然后点击右上角 Vue项目添加如下配置 "emmet.syntaxProfiles": { "vue-html": "html", "vue": "html" },React项目添加如下配置 "emmet.includeLanguages&quo…

剑指JUC原理-5.synchronized底层原理

Java对象头 以32位虚拟机为例&#xff1a; 普通对象 在Java虚拟机中&#xff0c;每个对象都有一个对象头&#xff08;Object Header&#xff09;&#xff0c;其中包含了一些用于管理对象的元数据信息。对象头通常由两部分组成&#xff1a;mark word&#xff08;标记字&#x…

第三章 远程连接服务器

目录 1、远程连接服务器简介 2、连接加密技术简介 第一阶段&#xff1a;TCP三次握手版本协商过阶段&#xff1a; 第二阶段&#xff1a;协商算法和确定对称秘钥阶段 3、用户登录ssh服务器 4.举例说明 例一&#xff1a;Linux互连 第一步&#xff1a;生成非对称秘钥&#…

【Linux】权限

目录 1&#xff0c;切换用户 1&#xff0c;su 普通用户名 2&#xff0c;su - 普通用户名 2&#xff0c;权限的管理 1&#xff0c;文件访问者的分类&#xff08;人) 2&#xff0c;文件类型和访问权限&#xff08;事物属性&#xff09; 3&#xff0c;文件权限值的表示方法…

信息系统项目管理师教程 第四版【第8章-项目整合管理-思维导图】

信息系统项目管理师教程 第四版【第8章-项目整合管理-思维导图】 课本里章节里所有蓝色字体的思维导图

Vue组件自定义事件实现子组件给父组件传递数据

一、绑定自定义事件 &#xff08;一&#xff09;使用v-on或绑定事件 事件是绑定在组件身上的&#xff0c;当我们触发这个事件的时候&#xff0c;就会执行事件回调函数。 <组件标签 v-on:事件名"事件回调函数"/> // 或 <组件标签 事件名"事件回调函…