|
該演示程序使用的芯片為:STM32F103C8T6
功能:
單片機(jī)采集ADS1292模塊數(shù)據(jù),通過(guò)串口輸出。
串口:
UART1
波特率:115200
停止位:1
數(shù)據(jù)為:8
奇偶校驗(yàn):無(wú)
引腳定義及連線:
1292模塊--STM32F1:
VDD---3.3V/5V
GND---GND
DRDY---PA8
CS---PB12
SCK---PB13
MISO---PB14
MOSI---PB15
單片機(jī)源程序如下:
- #include "ADS1292.h"
- #include "spi.h"
- #include "delay.h"
- #include "usart.h"
- #include "Timer.h"
- #include "key.h"
- #include "led.h"
- #define DEBUG_ADS1292 //寄存器printf調(diào)試
- u8 ADS1292_REG[12]; //ads1292寄存器數(shù)組
- ADS1292_CONFIG1 Ads1292_Config1 ={DATA_RATE}; //CONFIG1
- ADS1292_CONFIG2 Ads1292_Config2 ={PDB_LOFF_COMP,PDB_REFBUF,VREF,CLK_EN,INT_TEST}; //CONFIG2
- ADS1292_CHSET Ads1292_Ch1set ={CNNNLE1_POWER,CNNNLE1_GAIN,CNNNLE1_MUX}; //CH1SET
- ADS1292_CHSET Ads1292_Ch2set ={CNNNLE2_POWER,CNNNLE2_GAIN,CNNNLE2_MUX}; //CH2SET
- ADS1292_RLD_SENS Ads1292_Rld_Sens ={PDB_RLD,RLD_LOFF_SENSE,RLD2N,RLD2P,RLD1N,RLD1P}; //RLD_SENS
- ADS1292_LOFF_SENS Ads1292_Loff_Sens ={FLIP2,FLIP1,LOFF2N,LOFF2P,LOFF1N,LOFF1P}; //LOFF_SENS
- ADS1292_RESP1 Ads1292_Resp1 ={RESP_DEMOD_EN1,RESP_MOD_EN,RESP_PH,RESP_CTRL}; //RSP1
- ADS1292_RESP2 Ads1292_Resp2 ={CALIB,FREQ,RLDREF_INT}; //RSP2
-
- //ADS1292的IO口初始化
- void ADS1292_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
- SPI2_Init();//初始化SPI引腳
- //250ns 頻率4.5M 發(fā)送八組時(shí)鐘需要23 us
- //125ns 頻率9M, 發(fā)送八組時(shí)鐘需要14 us
- //55ns 頻率18M 發(fā)送八組時(shí)鐘需要9.2us
- //30ns 36M 發(fā)送八組時(shí)鐘需要9.2us
- //手冊(cè)10頁(yè)里寫(xiě)的最小時(shí)鐘周期為50ns
- //DRDY //待機(jī)時(shí)高電平,采集時(shí)低電平有效
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- //CS
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- // //RESRT
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- // //START
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- // //CLKSEL
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- //DRDY中斷初始化
- EXTI_ClearITPendingBit(EXTI_Line8);//清除中斷標(biāo)志
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);//選擇管腳
- EXTI_InitStructure.EXTI_Line=EXTI_Line8; //選擇中斷線路
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設(shè)置為中斷請(qǐng)求,非事件請(qǐng)求
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
- EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中斷使能
- EXTI_Init(&EXTI_InitStructure);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //選擇中斷通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級(jí)
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子優(yōu)先級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
- NVIC_Init(&NVIC_InitStructure);
-
- EXTI->IMR &= ~(EXTI_Line8);//屏蔽外部中斷
- ADS_CS=1;
- ADS1292_PowerOnInit();//上電復(fù)位,進(jìn)入待機(jī)模式
- }
- volatile u8 ads1292_recive_flag=0; //數(shù)據(jù)讀取完成標(biāo)志
- volatile u8 ads1292_Cache[9]; //數(shù)據(jù)緩沖區(qū)
- void EXTI9_5_IRQHandler(void)
- {
-
- if(EXTI->IMR&EXTI_Line8 && ADS_DRDY==0)//數(shù)據(jù)接收中斷
- {
- EXTI_ClearITPendingBit(EXTI_Line8);
- ADS1292_Read_Data(ads1292_Cache);//數(shù)據(jù)存到9字節(jié)緩沖區(qū)
- ads1292_recive_flag=1;
- }
- }
- //讀取72位的數(shù)據(jù)1100+LOFF_STAT[4:0]+GPIO[1:0]+13個(gè)0+2CHx24位,共9字節(jié)
- // 1100 LOFF_STAT[4 3 2 1 0 ] //導(dǎo)聯(lián)脫落相關(guān)的信息在LOFF_STAT寄存器里
- // RLD 1N2N 1N2P 1N1N 1N1P
- // 例 C0 00 00 FF E1 1A FF E1 52
- u8 ADS1292_Read_Data(u8 *data)//72M時(shí)鐘下函數(shù)耗時(shí)大約10us 8M時(shí)鐘下 函數(shù)耗時(shí)大約 100us
- {
- u8 i;
-
- ADS_CS=0;//讀9個(gè)字節(jié)的數(shù)據(jù)
- //delay_us(10);
- for(i=0;i<9;i++)
- {
- *data=ADS1292_SPI(0X00);
- data++;
- }
- //delay_us(10);
- ADS_CS=1;
- return 0;
- }
- //設(shè)置寄存器數(shù)組
- void ADS1292_SET_REGBUFF(void)
- {
- ADS1292_REG[ID] = ADS1292_DEVICE;//ID只讀
-
- ADS1292_REG[CONFIG1] = 0x00; //0000 0aaa [7] 0連續(xù)轉(zhuǎn)換模式 [6:3] 必須為0
- ADS1292_REG[CONFIG1] |= Ads1292_Config1.Data_Rate;//[2:0] aaa 采樣率設(shè)置采樣率
- ADS1292_REG[CONFIG2] = 0x00; //1abc d0e1 [7] 必須為1 [2] 必須為0 [0] 設(shè)置測(cè)試信號(hào)為1HZ、±1mV方波
- ADS1292_REG[CONFIG2] |= Ads1292_Config2.Pdb_Loff_Comp<<6; //[6]a 導(dǎo)聯(lián)脫落比較器是否掉電
- ADS1292_REG[CONFIG2] |= Ads1292_Config2.Pdb_Refbuf<<5; //[5]b 內(nèi)部參考緩沖器是否掉電
- ADS1292_REG[CONFIG2] |= Ads1292_Config2.Vref<<4; //[4]c 內(nèi)部參考電壓設(shè)置,默認(rèn)2.42V
- ADS1292_REG[CONFIG2] |= Ads1292_Config2.Clk_EN<<3; //[3]d CLK引腳輸出時(shí)鐘脈沖?
- ADS1292_REG[CONFIG2] |= Ads1292_Config2.Int_Test<<1; //[1]e 是否打開(kāi)內(nèi)部測(cè)試信號(hào),
- ADS1292_REG[CONFIG2] |= 0x81;//設(shè)置默認(rèn)位
-
- ADS1292_REG[LOFF] = 0x10;//[7:5] 設(shè)置導(dǎo)聯(lián)脫落比較器閾值 [4] 必須為1 [3:2] 導(dǎo)聯(lián)脫落電流幅值 [1] 必須為0 [0] 導(dǎo)聯(lián)脫落檢測(cè)方式 0 DC 1 AC
- ADS1292_REG[CH1SET] = 0x00; //abbb cccc
- ADS1292_REG[CH1SET] |=Ads1292_Ch1set.PD<<7; //[7] a 通道1斷電?
- ADS1292_REG[CH1SET] |=Ads1292_Ch1set.GAIN<<4; //[6:4]bbb 設(shè)置PGA增益
- ADS1292_REG[CH1SET] |=Ads1292_Ch1set.MUX; //[3:0]cccc 設(shè)置通道1輸入方式
- ADS1292_REG[CH2SET] = 0x00; //abbb cccc
- ADS1292_REG[CH2SET] |=Ads1292_Ch2set.PD<<7; //[7] a 通道2斷電?
- ADS1292_REG[CH2SET] |=Ads1292_Ch2set.GAIN<<4; //[6:4]bbb 設(shè)置PGA增益
- ADS1292_REG[CH2SET] |=Ads1292_Ch2set.MUX; //[3:0]cccc 設(shè)置通道2輸入方式
-
- ADS1292_REG[RLD_SENS] = 0X00; //11ab cdef [7:6] 11 PGA斬波頻率 fMOD/4
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Pdb_Rld<<5; //[5]a 該位決定RLD緩沖電源狀態(tài)
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld_Loff_Sense<<4; //[4]b 該位使能RLD導(dǎo)聯(lián)脫落檢測(cè)功能
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2N<<3; //[3]c 這個(gè)位控制通道2負(fù)輸入 用于右腿驅(qū)動(dòng)的輸出
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld2P<<2; //[2]d 該位控制通道2正輸入 用于右腿驅(qū)動(dòng)的輸出
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1N<<1; //[1]e 這個(gè)位控制通道1負(fù)輸入 用于右腿驅(qū)動(dòng)的輸出
- ADS1292_REG[RLD_SENS] |=Ads1292_Rld_Sens.Rld1P; //[0]f 該位控制通道1正輸入 用于右腿驅(qū)動(dòng)的輸出
- ADS1292_REG[RLD_SENS] |= 0xc0;//設(shè)置默認(rèn)位
- ADS1292_REG[LOFF_SENS] = 0X00; //00ab cdef [7:6] 必須為0
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip2<<5; //[5]a 這個(gè)位用于控制導(dǎo)聯(lián)脫落檢測(cè)通道2的電流的方向
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Flip1<<4; //[4]b 這個(gè)位控制用于導(dǎo)聯(lián)脫落檢測(cè)通道1的電流的方向
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2N<<3; //[3]c 該位控制通道2負(fù)輸入端的導(dǎo)聯(lián)脫落檢測(cè)
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff2P<<2; //[2]d 該位控制通道2正輸入端的導(dǎo)聯(lián)脫落檢測(cè)
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1N<<1; //[1]e 該位控制通道1負(fù)輸入端的導(dǎo)聯(lián)脫落檢測(cè)
- ADS1292_REG[LOFF_SENS] |=Ads1292_Loff_Sens.Loff1P; //[0]f 該位控制通道1正輸入端的導(dǎo)聯(lián)脫落檢測(cè)
-
- ADS1292_REG[LOFF_STAT] = 0x00; //[6]0 設(shè)置fCLK和fMOD之間的模分頻比 fCLK=fMOD/4 [4:0]只讀,導(dǎo)聯(lián)脫落和電極連接狀態(tài)
-
- ADS1292_REG[RESP1] = 0X00;//abcc cc1d
- ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_DemodEN<<7;//[7]a 這個(gè)位啟用和禁用通道1上的解調(diào)電路
- ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_modEN<<6; //[6]b 這個(gè)位啟用和禁用通道1上的調(diào)制電路
- ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_ph<<2; //[5:2]c 這些位控制呼吸解調(diào)控制信號(hào)的相位
- ADS1292_REG[RESP1] |=Ads1292_Resp1.RESP_Ctrl; //[0]d 這個(gè)位設(shè)置呼吸回路的模式
- ADS1292_REG[RESP1] |= 0x02;//設(shè)置默認(rèn)位
-
- ADS1292_REG[RESP2] = 0x00; //a000 0bc1 [6:3]必須為0 [0]必須為1
- ADS1292_REG[RESP2] |= Ads1292_Resp2.Calib<<7; //[7]a 啟動(dòng)通道偏移校正?
- ADS1292_REG[RESP2] |= Ads1292_Resp2.freq<<2; //[2]b 呼吸頻率設(shè)置
- ADS1292_REG[RESP2] |= Ads1292_Resp2.Rldref_Int<<1; //[1]c RLDREF信號(hào)源外部饋電?
- ADS1292_REG[RESP2] |= 0X01;//設(shè)置默認(rèn)位
-
- ADS1292_REG[GPIO] = 0x0C; //GPIO設(shè)為輸入 [7:4]必須為0 [3:2]11 GPIO為輸入 [1:0] 設(shè)置輸入時(shí),指示引腳電平,設(shè)置輸出時(shí)控制引腳電平
- }
- //通過(guò)SPI總線與ADS1292通信
- u8 ADS1292_SPI(u8 com)
- {
- return SPI2_ReadWriteByte(com);
- }
- //寫(xiě)命令
- void ADS1292_Send_CMD(u8 data)
- {
- ADS_CS=0;
- delay_us(100);
- ADS1292_SPI(data);
- delay_us(100);
- ADS_CS=1;
- }
- /*ADS1291、ADS1292和ADS1292R串行接口以字節(jié)形式解碼命令,需要4個(gè)tCLK周期來(lái)解碼和執(zhí)行.
- 因此,在發(fā)送多字節(jié)命令時(shí),4 tCLK周期必須將一個(gè)字節(jié)(或操作碼)的結(jié)束與下一個(gè)字節(jié)(或操作碼)分開(kāi)。
- 假設(shè)CLK(時(shí)鐘)為512 kHz,則tSDECODE (4 tCLK)為7.8125 us。
- 當(dāng)SCLK(數(shù)據(jù)速率)為16mhz時(shí),一個(gè)字節(jié)可以在500ns中傳輸,此字節(jié)傳輸時(shí)間不符合tSDECODE規(guī)范;
- 因此,必須插入一個(gè)延遲,以便第二個(gè)字節(jié)的末尾晚于7.3125us到達(dá)。
- 如果SCLK為1 MHz,則在8u秒內(nèi)傳輸一個(gè)字節(jié)。由于此傳輸時(shí)間超過(guò)tSDECODE規(guī)范,處理器可以不延遲地發(fā)送后續(xù)字節(jié)。
- 在后面的場(chǎng)景中,可以對(duì)串行端口進(jìn)行編程,使其從每個(gè)循環(huán)的單字節(jié)傳輸轉(zhuǎn)移到多個(gè)字節(jié)*/
- //讀寫(xiě)多個(gè)寄存器
- void ADS1292_WR_REGS(u8 reg,u8 len,u8 *data)
- {
- u8 i;
- ADS_CS=0;
- delay_us(100);
- ADS1292_SPI(reg);
- delay_us(100);
- ADS1292_SPI(len-1);
- if(reg&0x40) //寫(xiě)
- {
- for(i=0;i<len;i++)
- {
- delay_us(100);
- ADS1292_SPI(*data);
- data++;
- }
- }
- else //讀
- {
- for(i=0;i<len;i++)
- {
- delay_us(100);
- *data = ADS1292_SPI(0);
- data++;
- }
- }
- delay_us(100);
- ADS_CS=1;
- }
- //寄存器數(shù)組寫(xiě)入寄存器
- u8 ADS1292_WRITE_REGBUFF(void)
- {
- u8 i,res=0;
- u8 REG_Cache[12]; //存儲(chǔ)寄存器數(shù)據(jù)
- ADS1292_SET_REGBUFF();//設(shè)置寄存器數(shù)組
- ADS1292_WR_REGS(WREG|CONFIG1,11,ADS1292_REG+1);//數(shù)組變量寫(xiě)入寄存器
- delay_ms(10);
- ADS1292_WR_REGS(RREG|ID,12,REG_Cache);//讀寄存器
- delay_ms(10);
-
- // #ifdef DEBUG_ADS1292
- // printf("WRITE REG:\r\n");
- // for(i=0;i<12;i++ )//要寫(xiě)的數(shù)據(jù)
- // printf("%d %x\r\n",i,ADS1292_REG[i]);
- // printf("READ REG:\r\n");
- // #endif
-
-
- for(i=0;i<12;i++ ) //檢查寄存器
- {
- if(ADS1292_REG[i] != REG_Cache[i])
- {
- if(i!= 0 && i!=8 && i != 11) //0 8 和11是ID 導(dǎo)聯(lián)脫落和GPIO相關(guān)
- res=1;
- else
- continue;
- }
- // #ifdef DEBUG_ADS1292
- // printf("%d %x\r\n",i,REG_Cache[i]); //讀到的數(shù)據(jù)
- // #endif
- }
- #ifdef DEBUG_ADS1292
- if(res == 0)
- printf("REG write success\r\n");
- else
- printf("REG write err\r\n");
- #endif
- return res;
- }
- void ADS1292_PowerOnInit(void)
- {
- u8 i;
- u8 REG_Cache[12];
-
- // ADS_CLKSEL=1;//啟用內(nèi)部時(shí)鐘
- // ADS_START=0; //停止數(shù)據(jù)輸出
- // ADS_RESET=0; //復(fù)位
- // delay_ms(1000);
- // ADS_RESET=1;//芯片上電,可以使用
- // delay_ms(100); //等待穩(wěn)定
-
- ADS1292_Send_CMD(SDATAC);//發(fā)送停止連續(xù)讀取數(shù)據(jù)命令
- delay_ms(100);
- ADS1292_Send_CMD(RESET);//復(fù)位
- delay_s(1);
- ADS1292_Send_CMD(SDATAC);//發(fā)送停止連續(xù)讀取數(shù)據(jù)命令
- delay_ms(100);
-
- //#ifdef DEBUG_ADS1292
- // ADS1292_WR_REGS(RREG|ID,12,REG_Cache);
- // printf("read default REG:\r\n");
- // for(i=0;i<12;i++ ) //讀默認(rèn)寄存器
- // printf("%d %x\r\n",i,REG_Cache[i]);
- //#endif
- //ADS1292_Send_CMD(STANDBY);//進(jìn)入待機(jī)模式
- }
- //設(shè)置通道1內(nèi)部1mV測(cè)試信號(hào)
- u8 ADS1292_Single_Test(void) //注意1292R開(kāi)了呼吸解調(diào),會(huì)對(duì)通道一的內(nèi)部測(cè)試信號(hào)波形造成影響,這里只參考通道2即可,1292不受影響
- {
- u8 res=0;
- Ads1292_Config2.Int_Test = INT_TEST_ON;//打開(kāi)內(nèi)部測(cè)試信號(hào)
- Ads1292_Ch1set.MUX=MUX_Test_signal;//測(cè)試信號(hào)輸入
- Ads1292_Ch2set.MUX=MUX_Test_signal;//測(cè)試信號(hào)輸入
-
- if(ADS1292_WRITE_REGBUFF())//寫(xiě)入寄存器
- res=1;
- delay_ms(10);
- return res;
- }
- //設(shè)置內(nèi)部噪聲測(cè)試
- u8 ADS1292_Noise_Test(void)
- {
- u8 res=0;
- Ads1292_Config2.Int_Test = INT_TEST_OFF;//關(guān)內(nèi)部測(cè)試信號(hào)
- Ads1292_Ch1set.MUX = MUX_input_shorted;//輸入短路
- Ads1292_Ch2set.MUX = MUX_input_shorted;//輸入短路
- if(ADS1292_WRITE_REGBUFF())//寫(xiě)入寄存器
- res=1;
- delay_ms(10);
- return res;
- }
- //正常信號(hào)采集模式
- u8 ADS1292_Single_Read(void)
- {
- u8 res=0;
- Ads1292_Config2.Int_Test = INT_TEST_OFF;//關(guān)內(nèi)部測(cè)試信號(hào)
- Ads1292_Ch1set.MUX = MUX_Normal_input;//普通電極輸入
- Ads1292_Ch2set.MUX = MUX_Normal_input;//普通電極輸入
-
- if(ADS1292_WRITE_REGBUFF())//寫(xiě)入寄存器
- res=1;
- delay_ms(10);
- return res;
- }
- //配置ads1292采集方式
- u8 Set_ADS1292_Collect(u8 mode)
- {
- u8 res;
-
- delay_ms(10);
- switch(mode)//設(shè)置采集方式
- {
- case 0:
- res =ADS1292_Single_Read();
- break;
- case 1:
- res =ADS1292_Single_Test();
- break;
- case 2:
- res =ADS1292_Noise_Test();
- break;
- }
- if(res)return 1;//寄存器設(shè)置失敗
- ADS1292_Send_CMD(RDATAC); //啟動(dòng)連續(xù)模式
- delay_ms(10);
- ADS1292_Send_CMD(START); //發(fā)送開(kāi)始數(shù)據(jù)轉(zhuǎn)換(等效于拉高START引腳)
- delay_ms(10);
- return 0;
- }
復(fù)制代碼
- #include "sys.h" //系統(tǒng)配置
- #include "delay.h" //延時(shí)
- #include "usart.h" //串口
- #include "led.h"
- #include "ADS1292.h"
- #include "Timer.h"
- #include "dma.h"
- u8 xinlv;
- extern u8 xinlv1;
- s32 get_volt(u32 num);
- u8 flag;
- u16 flag1;
- //main
- int main(void)
- {
- u8 res,i,sum;
- u8 data_to_send[60];//串口發(fā)送緩存
- u8 usbstatus=0;
- u32 cannle[2]; //存儲(chǔ)兩個(gè)通道的數(shù)據(jù)
- s32 p_Temp[2]; //數(shù)據(jù)緩存
-
- data_to_send[0]=0xAA;
- data_to_send[1]=0xAA;
- data_to_send[2]=0xF1;
- data_to_send[3]=8;
- data_to_send[13] = 0X0D; //校驗(yàn)和
- data_to_send[14] = 0X0A; //校驗(yàn)和
- //初始化系統(tǒng)時(shí)鐘 72M
- SystemInit();
- delay_init();
- delay_ms(100);
- uart1_init(500000);//串口初始化為115200
- DMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)data_to_send);//串口1DMA設(shè)置
- USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //DMA
- LED_Init();
- ADS1292_Init(); //初始化ads1292
- while(Set_ADS1292_Collect(0))
- {
- printf("1292寄存器設(shè)置失敗\r\n");
- delay_s(1);
- }
- printf("寄存器設(shè)置成功\r\n");
- delay_s(1);
- TIM2_Init(50,1439);//系統(tǒng)指示
- TIM4_Init(50,1439);//打印心率
-
- EXTI->IMR |= EXTI_Line8;//開(kāi)DRDY中斷
- while(1)//循環(huán)發(fā)送數(shù)據(jù)
- {
-
- if(ads1292_recive_flag==1)
- {
- flag1++;
- cannle[0]=ads1292_Cache[3]<<16 | ads1292_Cache[4]<<8 | ads1292_Cache[5];//獲取原始數(shù)據(jù)
-
- cannle[1]=ads1292_Cache[6]<<16 | ads1292_Cache[7]<<8 | ads1292_Cache[8]; //
-
- p_Temp[0] = get_volt(cannle[0]); //把采到的3個(gè)字節(jié)轉(zhuǎn)成有符號(hào)32位數(shù)
-
- p_Temp[1] = get_volt(cannle[1]); //把采到的3個(gè)字節(jié)轉(zhuǎn)成有符號(hào)32位數(shù)
-
-
- cannle[0] = p_Temp[0];
-
- cannle[1] = p_Temp[1];
- data_to_send[4]=cannle[0]>>24; //25-32位
- data_to_send[5]=cannle[0]>>16; //17-24
- data_to_send[6]=cannle[0]>>8; //9-16
- data_to_send[7]=cannle[0]; //1-8
- data_to_send[8]=cannle[1]>>24; //25-32位
- data_to_send[9]=cannle[1]>>16; //17-24
- data_to_send[10]=cannle[1]>>8; //9-16
- data_to_send[11]=cannle[1]; //1-8
-
- for(i=0;i<12;i++)
- sum += data_to_send[i];
- // printf("%d\r\n",sum);
- data_to_send[12] = sum; //校驗(yàn)和
- // DMA_Enable(DMA1_Channel4,13);//串口1DMA
-
- ads1292_recive_flag=0;
- sum = 0;
-
- if((p_Temp[1]>265000)&&(flag==1))
- {
- xinlv++;
- flag=0;
- }
- else if((p_Temp[1]<265000)&&(flag==0))
- flag=1;
- }
-
- }
- }
- /*功能:把采到的3個(gè)字節(jié)轉(zhuǎn)成有符號(hào)32位數(shù) */
- s32 get_volt(u32 num)
- {
- s32 temp;
- temp = num;
- temp <<= 8;
- temp >>= 8;
- return temp;
- }
復(fù)制代碼
Keil代碼下載:
代碼.7z
(207.13 KB, 下載次數(shù): 50)
2023-3-21 20:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|