📄 dac.c
字号:
#include "stdio.h"
#include "addr.h"
#include "conv_da.c"
/*定义32路I/O端口 */
volatile ioport u16 port0020;
volatile ioport u16 port0021;
volatile ioport u16 port0022;
volatile ioport u16 port0023;
volatile ioport u16 port0024;
volatile ioport u16 port0025;
volatile ioport u16 port0026;
volatile ioport u16 port0027;
volatile ioport u16 port0048;
volatile ioport u16 port0049;
volatile ioport u16 port004A;
volatile ioport u16 port004B;
volatile ioport u16 port004C;
volatile ioport u16 port004D;
volatile ioport u16 port004E;
volatile ioport u16 port004F;
volatile ioport u16 port0050;
volatile ioport u16 port0051;
volatile ioport u16 port0052;
volatile ioport u16 port0053;
volatile ioport u16 port0054;
volatile ioport u16 port0055;
volatile ioport u16 port0056;
volatile ioport u16 port0057;
volatile ioport u16 port0058;
volatile ioport u16 port0059;
volatile ioport u16 port005A;
volatile ioport u16 port005B;
volatile ioport u16 port005C;
volatile ioport u16 port005D;
volatile ioport u16 port005E;
volatile ioport u16 port005F;
volatile ioport u16 port00FC;
/*声明32路通道的DA转换函数*/
extern void conv_da1(void);
extern void conv_da2(void);
extern void conv_da3(void);
extern void conv_da4(void);
extern void conv_da5(void);
extern void conv_da6(void);
extern void conv_da7(void);
extern void conv_da8(void);
extern void conv_da9(void);
extern void conv_da10(void);
extern void conv_da11(void);
extern void conv_da12(void);
extern void conv_da13(void);
extern void conv_da14(void);
extern void conv_da15(void);
extern void conv_da16(void);
extern void conv_da17(void);
extern void conv_da18(void);
extern void conv_da19(void);
extern void conv_da20(void);
extern void conv_da21(void);
extern void conv_da22(void);
extern void conv_da23(void);
extern void conv_da24(void);
extern void conv_da25(void);
extern void conv_da26(void);
extern void conv_da27(void);
extern void conv_da29(void);
extern void conv_da30(void);
extern void conv_da31(void);
extern void conv_da32(void);
/*声明单、双极性通道的校准函数*/
extern u16 da_adjust1();
extern u16 da_adjust2();
/*申明停止D/A操作的函数*/
extern void stop_da(void);
/*开始D/A操作*/
void da_convert()
{
u16 channel_num; //通道地址
u16 real_parameter; //未经过校准的数据值,校准函数da_adjust的实参
u16 sixth_bit; //判断re_selc_addr第6位的变量
u16 data_regulate; //校准过的数据值
asm(" STM #0001h,SWCR "); //*SWWSR=0x7fff; //设置14个等待
real_parameter=*(volatile u16 *)re_data_addr; //把读到的数据给da_adjust的实参
sixth_bit=*(volatile u16 *)re_selc_addr && 0x0020;//先用第6位来判断是否停止D/A工作
if(sixth_bit==0x0020) {port00FC=0x0000;} //如果第6位为1,则停止D/A
else //判断通道
{
channel_num =*(volatile u16 *)re_selc_addr && 0x001F; //求低5位
switch(channel_num)
{
case 0: data_regulate=da_adjust1(real_parameter);//单极性8路
port0020=data_regulate; break;
case 1: data_regulate=da_adjust1(real_parameter);
port0021=data_regulate; break;
case 2: data_regulate=da_adjust1(real_parameter);
port0022=data_regulate; break;
case 3: data_regulate=da_adjust1(real_parameter);
port0023=data_regulate; break;
case 4: data_regulate=da_adjust1(real_parameter);
port0024=data_regulate; break;
case 5: data_regulate=da_adjust1(real_parameter);
port0025=data_regulate; break;
case 6: data_regulate=da_adjust1(real_parameter);
port0026=data_regulate; break;
case 7: data_regulate=da_adjust1(real_parameter);
port0027=data_regulate; break;
case 8: data_regulate=da_adjust1(real_parameter);//双极性带隔离3路
port0048=data_regulate; break;
case 9: data_regulate=da_adjust2(real_parameter);
port0049=data_regulate; break;
case 10: data_regulate=da_adjust2(real_parameter);
port004A=data_regulate; break;
case 11: data_regulate=da_adjust2(real_parameter);//双极性21路
port004B=data_regulate; break;
case 12: data_regulate=da_adjust2(real_parameter);
port004C=data_regulate; break;
case 13: data_regulate=da_adjust2(real_parameter);
port004D=data_regulate; break;
case 14: data_regulate=da_adjust2(real_parameter);
port004E=data_regulate; break;
case 15: data_regulate=da_adjust2(real_parameter);
port004F=data_regulate; break;
case 16: data_regulate=da_adjust2(real_parameter);
port0050=data_regulate; break;
case 17: data_regulate=da_adjust2(real_parameter);
port0051=data_regulate; break;
case 18: data_regulate=da_adjust2(real_parameter);
port0052=data_regulate; break;
case 19: data_regulate=da_adjust2(real_parameter);
port0053=data_regulate; break;
case 20: data_regulate=da_adjust2(real_parameter);
port0054=data_regulate; break;
case 21: data_regulate=da_adjust2(real_parameter);
port0055=data_regulate; break;
case 22: data_regulate=da_adjust2(real_parameter);
port0056=data_regulate; break;
case 23: data_regulate=da_adjust2(real_parameter);
port0057=data_regulate; break;
case 24: data_regulate=da_adjust2(real_parameter);
port0058=data_regulate; break;
case 25: data_regulate=da_adjust2(real_parameter);
port0059=data_regulate; break;
case 26: data_regulate=da_adjust2(real_parameter);
port005A=data_regulate; break;
case 27: data_regulate=da_adjust2(real_parameter);
port005B=data_regulate; break;
case 28: data_regulate=da_adjust2(real_parameter);
port005C=data_regulate; break;
case 29: data_regulate=da_adjust2(real_parameter);
port005D=data_regulate; break;
case 30: data_regulate=da_adjust2(real_parameter);
port005E=data_regulate; break;
case 31: data_regulate=da_adjust2(real_parameter);
port005F=data_regulate; break;
default: *(volatile u16 *)tr_ctr_addr=0x0002;
*(volatile u16 *)tr_selc_addr=0xffff; //给0xffff表示地址出错
goto L1;
}
}
/***把信息回写给dsp***/
*(volatile u16 *)tr_ctr_addr=0x0002;
*(volatile u16 *)tr_selc_addr=*(volatile u16 *)re_selc_addr;
L1: *(volatile u16 *)tr_dadata_addr=real_parameter;
/*********************/
asm(" STM #0000h,SWCR "); //复位SWCR
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -