STM32操作24位AD芯片ADS1246

发布者:ArtisticSoul最新更新时间:2017-02-24 来源: eefocus关键字:STM32  24位  AD芯片  ADS1246 手机看文章 扫描二维码
随时随地手机看文章

ADS1246是TI公司大致在2009年中期推出的24位ADC,最高采样速率可达2Ksps,其为单通道器件,与之相对应的还有ADS1247和ADS1248三通道器件,但特性并非完全一致。据TI资料介绍,ADS1246在ADS1247/ADS1248功能上做出简化,保留了其部分特性。本次设计,需要用到24位单通道转换器件,于是考虑用到ADS1246,主控制器用STM32L系列。以下为ADS1246的引脚图:

 

 


    上图显示ADS1246引脚图,其CS/SCLK/DIN/DUT为SPI通讯接口,RESET/START/DRDY为控制与状态脚,AVDD/AVSS以及DVDD/DGND分别为模拟/数字电源供电端,REFP/REFN为基准源输入脚,AINP/AINN为模拟信号输入端。其中,DRDY忙信号指示功能可以附加到DOUT引脚上,这样DRDY脚可以留空。在实际使用中发现,START脚做为ADC的启动脚,还必须得接出来,因我还未找到有通过软件能启动ADS1246转换的方法,但其DS中有提到START信号和SLEEP/WAKEUP相类似的功能,暂未深研究。顺便 提一下,TI关于ADS1246的文档是改自于另一颗ADC器件的文档,所以极其烂……

    ADS1246的SPI时序,这个是需要提一下的,一般来说,SPI协议在上升沿锁存数据,下降沿更新数据,这是一般SPI协议的作法。但ADS1246需要在下降沿锁存数据,上升沿更新数据,在设置SPI寄存器的时候需要注意一下,当我采用一般性设置的时候,发现通讯不正常。以下是STM32L的SPI设置,用的是SPI2。

   

  1. //SPI2配置  

  2.     RCC->APB1ENR|=RCC_APB1ENR_SPI2EN;      

  3.     SPI2->CR1=SPI_CR1_MSTR|SPI_CR1_BR|SPI_CR1_SSM|SPI_CR1_SSI|SPI_CR1_CPHA;          //8位模式    

  4.     SPI2->CR1|=SPI_CR1_SPE;    

SPI2的驱动:


  1. //SPI2写数据  

  2. void SPI2_WriteBytes(uint8 *TxBuffer,uint16 TxLenth)  

  3. {  

  4.     uint8 i;  

  5.     while(TxLenth--){  

  6.         while( (SPI2->SR & SPI_SR_TXE) == 0 );  

  7.         SPI2->DR=*TxBuffer++;                  

  8.         while((SPI2->SR&SPI_SR_RXNE)==0);  

  9.         i=SPI2->DR;  

  10.     }  

  11.     i++;      

  12. }  

   上程序中i++的引入在于避免keil-MDK产生编译警告。

 

  1. //SPI2读数据  

  2. void SPI2_ReadBytes(uint8 *RxBuffer,uint16 RxLenth)  

  3. {  

  4.     while(RxLenth--){             

  5.         while((SPI2->SR&SPI_SR_TXE)==0);  

  6.         SPI2->DR=*RxBuffer;  

  7.         while((SPI2->SR&SPI_SR_RXNE)==0);  

  8.         *RxBuffer++=SPI2->DR;          

  9.     }  

  10. }  

    以上驱动代码,能保证SPI在最后一个字节完全发送完成之后退出,如果没有等待SPI_SR_RXNE,则仅仅只是把数据转移到SPI移位寄存器,并未完全送出,不详述。

    以下介绍我的驱动过程,在驱动ADS1246的时候,主要参考那个网方的58页的极烂文档,上面没有明确提到整个上电过程以及初始化过程,至于那个相当重要的自校准过程及操作方法也没有提到,所以本人摸索了一整天时间,在此整理。

    ADS1246采用SPI通讯 ,其所有通讯引脚(SCK/DIN/DOUT)都在CS脚为低电平的时候有效,在CS为高时均为三态,当DRDY绑定到DOUT脚时,只有在CS为低时才能正确的指示忙状态,若DRDY采用单独的引脚,则不受CS控制。ADS1246的所有通讯过程被分为若干个命令组,有的需要带参数,有的不需要带参数,其实我也不明白它为什么要搞那么麻烦,感觉本来可以很简单的处理,结果弄的很乱。以下为其命令分组:

    

    大致分为命令类(不带参数),读寄存器,写寄存器三类,以下分别分其实现:


  1. //ADS1246命令码列表  

  2. #define ADC_CMD_WAKEUP      0x00            //退出睡眠模式  

  3. #define ADC_CMD_SLEEP       0x02            //进入睡眠模式  

  4. #define ADC_CMD_SYNC        0x04            //同步ADC转换  

  5. #define ADC_CMD_RESET       0x06            //芯片复位  

  6. #define ADC_CMD_NOP     0xFF            //空操作  

  7. #define ADC_CMD_RDATA       0x12            //单次读取数据  

  8. #define ADC_CMD_RDATAC      0x14            //连续读取数据  

  9. #define ADC_CMD_SDATAC      0x16            //停止连续读取  

  10. #define ADC_CMD_RREG        0x20            //读寄存器  

  11. #define ADC_CMD_WREG        0x40            //写寄存器  

  12. #define ADC_CMD_SYSOCAL     0x60            //系统偏移校准  

  13. #define ADC_CMD_SYSGCAL     0x61            //系统增益校准  

  14. #define ADC_CMD_SELFOCAL    0x62            //系统自校准  

  15. #define ADC_CMD_RESTRICTED  0xF1            //  


  1. /*--------------------------------------------------------- 

  2.  写命令 

  3. ---------------------------------------------------------*/  

  4. void ADS1246_WriteCmd(uint8 Cmd)  

  5. {  

  6.     ADC_SPI_CS_CLR  

  7.     ADC_WriteBytes(&Cmd,1);  

  8.     ADC_SPI_CS_SET  

  9. }  

  10.   

  11.   

  12. /*--------------------------------------------------------- 

  13.  读寄存器 

  14. ---------------------------------------------------------*/  

  15. void ADS1246_ReadReg(uint8 RegAddr,uint8 *Buffer,uint8 Length)  

  16. {  

  17.     uint8 Cmd[2];  

  18.     ADC_SPI_CS_CLR  

  19.     Cmd[0]=ADC_CMD_RREG|RegAddr;  

  20.     Cmd[1]=Length-1;  

  21.     ADC_WriteBytes(Cmd,2);  

  22.     ADC_ReadBytes(Buffer,Length);  

  23.     Cmd[0]=ADC_CMD_NOP;  

  24.     ADC_WriteBytes(Cmd,1);  

  25.     ADC_SPI_CS_SET  

  26. }  

  27.   

  28.   

  29. /*--------------------------------------------------------- 

  30.  写寄存器 

  31. ---------------------------------------------------------*/  

  32. void ADS1246_WriteReg(uint8 RegAddr,uint8 *Buffer,uint8 Length)  

  33. {  

  34.     uint8 Cmd[2];  

  35.     ADC_SPI_CS_CLR  

  36.         Cmd[0]=ADC_CMD_WREG|RegAddr;  

  37.     Cmd[1]=Length-1;  

  38.     ADC_WriteBytes(Cmd,2);  

  39.     ADC_WriteBytes(Buffer,Length);  

  40.     ADC_SPI_CS_SET  

  41. }  

    在写读存器时,一定要注意,根据其DS文档第32页说明,其后发一个NOP命令可以强制DOUT引脚输出高电平,这样可以随后判断DOUT是否为低进而知道是否处于忙状态,否则会得到一个脉冲。其实在任何的读操作完成后,发一个字节的NOP命令即可将DOUT强制输出高电平。当DRDY绑定到DOUT的时候,这个是非常重要的。

    在弄清楚以上命令读写方法之后,需要实现其忙状态判别,这个在很多芯片驱动时都会遇到,它直接提示了其内部的工作状态,只有在不忙时才能继续执行下一条指令。

   

  1. /*--------------------------------------------------------- 

  2.   忙状态判断,最长等待时间,200 X 10 ms=2S 

  3. ---------------------------------------------------------*/  

  4. uint8 ADS1246_WaitBusy()  

  5. {  

  6.     uint16 i;  

  7.     ADC_SPI_CS_CLR  

  8.     i=0;  

  9.     while(ADC_RDY_DAT>0){  

  10.         Wrtos_TaskDelay(10);  

  11.         i++; if(i>200)return 1;  

  12.     }  

  13.     ADC_SPI_CS_SET  

  14.     return 0;  

  15. }  

 

    ADS1246的校准。在ADS1246内部,其前端是一个独立的多路复用器,其每路输入跟据功能的不同分别接到了相应的电平上,之后是一个能配置为1/2/4/8/16/32/64/128倍的可变增益放大器,之后是ADC转换核心,最后是数字滤波器和数据接口部分。对于本器件,它通过MUX复用器的配置能进行PGA增益和系统偏移的校正。

 


       >. 对于系统偏移校正,指当AIN0-AIN1=0时,在指定的PGA倍率下,ADC的量化输出,此时理论上应该输出为0,但往往达不到0。
       >.对于PGA增益校正,指当AIN0-AIN1=VREFP-VREFN时,在PGA=1时,ADC的量化输出,此时理论上应该输出为满量程,但有些设计也达不到。
       以上两点,是ADS1246的定义,在DS的35页下方有一个表格,类似以上表述,但这可能和一般性描述有所出入,特别是PGA校正,可能在这里面它自己还进行了一些未表述出来的工作。以下是其校正实现:   


  1. /*--------------------------------------------------------- 

  2.  执行校准---系统校准->偏移校准->增益校准 

  3. ---------------------------------------------------------*/  

  4. uint8 ADS1246_Calibrate(uint8 Gain)  

  5. {  

  6.     uint8 R=0,Cmd;  

  7.     ADS1246_WriteReg(ADC_REG_SYS0,&Gain,1);     //设置校准增益  

  8.   

  9.     Cmd=0x00;  

  10.     ADS1246_WriteReg(ADC_REG_MUX,&Cmd,1);       //恢复正常模式  

  11.     ADS1246_WriteCmd(ADC_CMD_SELFOCAL);     //系统偏移自校准  

  12.     R|=ADS1246_WaitBusy();              //等待校准完成  

  13.   

  14.     Cmd=0x01;  

  15.     ADS1246_WriteReg(ADC_REG_MUX,&Cmd,1);       //设置AINP+AINN=(AVDD+AVSS)/2   

  16.     ADS1246_WriteCmd(ADC_CMD_SYSOCAL);      //系统偏移自校准  

  17.     R|=ADS1246_WaitBusy();              //等待校准完成  

  18.   

  19.     Cmd=0x02;  

  20.     ADS1246_WriteReg(ADC_REG_MUX,&Cmd,1);       //设置AINP=VREF+,AINN=VREF-; for gain calibration  

  21.     ADS1246_WriteCmd(ADC_CMD_SYSGCAL);      //系统增益校准  

  22.     R|=ADS1246_WaitBusy();                        

  23.   

  24.     return R;  

  25. }  

    在校准之前,需要先设置MUX复用器到相应的模式,DS文档中对于此有相应的描述,之后进行相应校准,注意,每一步校准都需要一定的时间去完成,所以一定要等待DRDY信号。以上校准过程,我在反复读过其DS文档后写出,不能保证其完全正确,文档中并未有校准过程的详细过程。

ADS1246的上电过程 :

    1. RESET低电平复位,拉低,至少保证50us,拉高,等待至少600us,ADS1246硬件复位完成。
    2. SPI软件复位,我知道不一定要做这一步,但是建议做这一步。
    3. 配置寄存器值,可以一性写完所有寄存器,也可以写自己感兴趣的。
    4. 读寄存器值,判断有没有执行成功。这一步建议实现,可有于判断有没有器件存在或是器件是否损坏。
    5. 进行芯片自动校准过程,包括偏移校准和增益校准。
    6. 初始化完成。

    从以上可以看出,其初始化过程还是比较复杂的,那个校准过程还比较耗时,在5sps速率设置下,需要用到至少3S时间。以下为软件实现:


  1. /*--------------------------------------------------------- 

  2.  初始化 

  3. ---------------------------------------------------------*/  

  4. uint8 ADS1246_Init(uint8 Gain)  

  5. {  

  6.     uint8 i,Cmd;  

  7.     ADC_RESET_CLR  

  8.     for(i=0;i<200;i++);  

  9.     ADC_RESET_SET  

  10.     for(i=0;i<200;i++);  

  11.     ADS1246_WriteCmd(ADC_CMD_RESET);  

  12.     Wrtos_TaskDelay(1);   

  13.     ADS1246_WriteReg(ADC_REG_SYS0,&Gain,1);             //初始化所有寄存器    

  14.     Cmd=0x08;  

  15.     ADS1246_WriteReg(ADC_REG_ID,&Cmd,1);                //DOUT兼容DRDY引脚        

  16.     if((Cmd&0x08)>0)return 1;  

  17.     Cmd=ADC_CMD_NOP;  

  18.     ADS1246_ReadReg(ADC_REG_ID,&Cmd,1);                 //读取器件ID      

  19.     Cmd=ADS1246_Calibrate(Gain);                    //通道校准  

  20.     return Cmd;  

  21. }  

    在初始化过程中,基本按以上几步完成,以上代码中,向ADC_REG_ID第3位写1,用于将DRDY绑定到DOUT引脚上,在读完ADC_REG_ID之后,判断其值是否第3位为高,这样可以大致判断出芯片是否存在是否通讯正常以及寄存器读写是否正常。在确定无误之后,随后发送了ADC_CMD_NOP命令, 这样可将DOUT强制到高电平,为之后判断DRDY为低电平做准备。这一步很重要,否则忙判断函数可能工作不正常。

    ADS1246的转换控制过程。ADS1246通过START引脚上的高电平进行启动控制,当START脚变成高电平之后,芯片开始转换,这个高电平的持续时间至少应为5us(其实更短,DS上有明确说明)。在转换完成后,若START仍为高电平,则进行再一次转换,若START为低电平,则进入低功耗模式。所以这个START脚成为单次转换或连续转换方式的控制信号。


  1. /*--------------------------------------------------------- 

  2.  配置转换参数 

  3. ---------------------------------------------------------*/  

  4. void ADS1246_Config(uint8 CovGain,uint8 CovRate)  

  5. {  

  6.     uint8 Cmd;    

  7.     Cmd=CovGain|CovRate;  

  8.     ADS1246_WriteReg(ADC_REG_SYS0,&Cmd,1);              //设置采样增益和速率   

  9. }  

  10.   

  11. /*--------------------------------------------------------- 

  12.  启动转换 

  13. ---------------------------------------------------------*/  

  14. void ADS1246_Start(uint8 CovMode)  

  15. {  

  16.     ADC_START_SET                           //启动ADC采样  

  17.     if(CovMode==ADC_MODE_SINGLECOV)ADC_START_CLR            //产生启动脉冲  

  18. }                                  

  19.   

  20. /*--------------------------------------------------------- 

  21.  停止转换,进入低功耗模式 

  22. ---------------------------------------------------------*/  

  23. void ADS1246_Stop()  

  24. {  

  25.     ADC_START_CLR                           //停止转换  

  26. }  

    以上在ADS1246_Start方法中,通过在START线上产生高电平脉冲或是维持高电平的方法来实现单次或是连续模式转换。

    以下是数据的读取方法,根所DS文档的描述,首先判断其是否已转换完成,确定处于DRDY闲状态,然后发送读数据指令,随后发送24个CLK,即读取3个字节24位数据,关键的是,在最后再发送1字节的ADC_CMD_NOP指令,用于恢复DOUT为高电平。
   

  1. /*--------------------------------------------------------- 

  2.  数据读取 

  3. ---------------------------------------------------------*/  

  4. int32 ADS1246_Read()  

  5. {  

  6.     uint8  Cmd[5];  

  7.     int32 D;  

  8.     Cmd[0]=ADC_CMD_RDATA;  

  9.     Cmd[1]=ADC_CMD_NOP;  

  10.     Cmd[2]=ADC_CMD_NOP;  

  11.     Cmd[3]=ADC_CMD_NOP;  

  12.     Cmd[4]=ADC_CMD_NOP;  

  13.     ADC_SPI_CS_CLR        

  14.     ADC_ReadBytes(Cmd,5);  

  15.     ADC_SPI_CS_SET  

  16.     Cmd[0]= (Cmd[1]&0x80)!=0 ? 0xFF:0x00;  

  17.     D=TTS_D32FromArray(Cmd,1);    

  18.     return D;  

  19. }  


    以上方法中,采用了数据单次读取指令ADC_CMD_RDATA,在3字节数据后,空读了一个字节,同时发送了ADC_CMD_NOP。注意24位有符号数扩展成为32位有符号数的方法,最简单的方法即把24位中最高位复制到32位的高8位上。

    在实现ADS1246的所有驱动方法之后,引入一组定义如下:

  1. //ADS1246寄存器列表  

  2. #define ADC_REG_BCS         0x00  

  3. #define ADC_REG_VBIAS       0x01  

  4. #define ADC_REG_MUX         0x02  

  5. #define ADC_REG_SYS0        0x03  

  6. #define ADC_REG_OFC0        0x04  

  7. #define ADC_REG_OFC1        0x05  

  8. #define ADC_REG_OFC2        0x06  

  9. #define ADC_REG_FSC0        0x07  

  10. #define ADC_REG_FSC1        0x08  

  11. #define ADC_REG_FSC2        0x09  

  12. #define ADC_REG_ID          0x0A  

  13.   

  14. //ADS1246支持的增益列表  

  15. #define ADC_GAIN_1          0x00  

  16. #define ADC_GAIN_2          0x10  

  17. #define ADC_GAIN_4          0x20  

  18. #define ADC_GAIN_8          0x30  

  19. #define ADC_GAIN_16         0x40  

  20. #define ADC_GAIN_32         0x50  

  21. #define ADC_GAIN_64         0x60  

  22. #define ADC_GAIN_128        0x70  

  23.   

  24. //ADS1246支持的转换速率列表  

  25. #define ADC_SPS_5           0x00  

  26. #define ADC_SPS_10          0x01  

  27. #define ADC_SPS_20          0x02  

  28. #define ADC_SPS_40          0x03  

  29. #define ADC_SPS_80          0x04  

  30. #define ADC_SPS_160         0x05  

  31. #define ADC_SPS_320         0x06  

  32. #define ADC_SPS_640         0x07  

  33. #define ADC_SPS_1000        0x08  

  34. #define ADC_SPS_2000        0x09  

  35.   

  36. //ADS1246转换模式设置  

  37. #define ADC_MODE_SINGLECOV      0x00        //单次转换模式  

  38. #define ADC_MODE_CONTINUOUS     0x01        //连续转换模式  



 

以下是具体调用以及转换实现:


  1. //ADS1246应用示例  

  2. void Task0(void *Tags)  

  3. {  

  4.     uint8 R,Rxlength,Buffer[30];  

  5.     int32 D,V,V0=0;  

  6.     USART1_Init();  

  7.     USART1_SetParams(9600,8,'N',1);  

  8.     ADS1246_Init(ADC_GAIN_1);               //初始化  

  9.     ADS1246_Config(ADC_GAIN_1,ADC_SPS_5);           //增益1,5sps速率  

  10.     ADS1246_Start(ADC_MODE_CONTINUOUS);         //启动连续转换  

  11.     while(1){                              

  12.         D=ADS1246_Read();               //读转换数据  

  13.         D>>=6;                        //数据转换到18位,丢去末8位  

  14.   

  15.         V=ADS1246_GetVoltage(D,ADC_GAIN_1);     //计算前端输入电压  

  16.   

  17.         Rxlength=TTS_StringFromNumber(Buffer,D,'D',0);  //打印18位转换值  

  18.         Rxlength=TTS_StringAppend(Buffer,"    ");  

  19.         USART1_WriteDatas(Buffer,Rxlength,0);  

  20.   

  21.         Rxlength=TTS_StringFromNumber(Buffer,(f32)V/1000,'D',3);    //打印电压  

  22.         Rxlength=TTS_StringAppend(Buffer,"mV    ");  

  23.         USART1_WriteDatas(Buffer,Rxlength,0);  

  24.   

  25.         V0=V-V0;  

  26.         Rxlength=TTS_StringFromNumber(Buffer,(f32)V0,'D',0);        //打印本次跳动  

  27.         Rxlength=TTS_StringAppend(Buffer,"uV\r\n");  

  28.         USART1_WriteDatas(Buffer,Rxlength,0);  

  29.   

  30.         V0=V;     

  31.     }  

  32. }  

以上使用中,将24位值的末8位去掉,只使用其18位,以下是从串口助手看到的数据:


    从实际结果看,在只采用其前18位值的情况下仍有4LSB的跳动,测试结果显然说明其无噪声位只能达到16位,这与AD7799之类的芯片相比还是有一定差距。不知道是否我买到山寨货的原因还是芯片本身的原因,其与手册上指出的20位精度还是有较大出入。排除电路设计上的干扰,则芯片本身误差太大,另外不知道什么原因,其PGA增益误差大的吓人,基本用不了,在PGA=1时最多能获得16位有效位,在PGA>0时极度不准确。
    24位ADC,看来TI也并非做到极致,还是主要考虑模拟器件公司比较靠谱。


关键字:STM32  24位  AD芯片  ADS1246 引用地址:STM32操作24位AD芯片ADS1246

上一篇:STM32F系列单片机内部FLASH编程
下一篇:STM32操作24位AD转换器AD7799芯片

推荐阅读最新更新时间:2024-03-16 15:34

ST新开发环境极大降低STM32微控制器的使用门槛
意法半导体(纽约证券交易所代码:STM)发布一套价格极低的开发环境,让更多的开发人员有机会使用意法半导体针对嵌入式应用专门研制、采用ARM Cortex-M3处理器内核的STM32系列微控制器。 新的开发环境整合Atollic TrueSTUDIO®/STM32开发工具和意法半导体的ST-LINK调试器,前者可以从网站免费下载,无使用代码量或使用时间限制;后者通过USB端口可连接到目标微控制器。对于初期投资很小的项目,花费很少即可拥有ST-LINK,因此尝试性和小批量的产品概念的各种初始设计,均能受益于STM32系列微控制器的高性能、低功耗和丰富功能,方便选择STM32系列70多款软件、引脚和外设相互兼容的产品
[单片机]
ST新开发环境极大降低<font color='red'>STM32</font>微控制器的使用门槛
外部中断简述
介绍 STM32F103的中断控制器支持19个外部中断/事件请求。 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出线。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 外部IO口的输入中断 总结步骤 第一步:开启AFIO时钟 第二步:设置IO口与中断线的映射关系。 第三步:初始化线上中断,设置触发条件等。 第四步:配置中断分组(NVIC),并使能中断。 第五步:编写中断服务函数。 第六步:清除中断标志位 映射关系。 每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止 16个, GPIO
[单片机]
STM32实战 2.矩阵键盘通过串口3输出
#include KEY44.h #include sys.h #include delay.h #include usart.h u8 key_num = 0; int main(void) { uart_init(115200); delay_init(); KEY44_Init(); while(1) { key_num = key44_Scan(); if(key_num != 0) { printf( KEY is %drn ,key_num); } } } #include KEY44.h #include sys.h #include delay.h vo
[单片机]
正点原子STM32学习笔记——MPU6050介绍
一、MPU6050简介 1.什么是MPU6050? MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。 有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度 。 2.MUP6050特点。 MPU6050 的特点包括: ① 以数字形式输出
[单片机]
正点原子<font color='red'>STM32</font>学习笔记——MPU6050介绍
STM32中串口通信的基本操作
STM32中串口通信的基本操作 USART_SR状态寄存器 比较常用的位 操纵该寄存器的函数 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); USART_DR数据寄存器 DR寄存器的操作流程 操作DR寄存器的函数 USART_BRR波特率寄存器 操作BRR寄存器的函数 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 注:除此之外,这个函数还用来配置串口通信的其他参数,具体参数如下: 波特率与USARTDI
[单片机]
<font color='red'>STM32</font>中串口通信的基本操作
【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置
1,因为自己目前只有一块板子有CAN模块,所以先做CAN的回环测试。 主要参考http://www.stm32cube.com/question/33 下面的代码测试可以使用 1-1,在CAN的编程中,主要是注意四大结构体,这几个都是自动生成的, 1、CAN_HandleTypeDef hcan1;// CAN handle Structure definition首先定义CAN的处理结构体,hcan1内部包括了 3、CanTxMsgTypeDef; 4、CanRxMsgTypeDef;的头地址 2、CAN_FilterConfTypeDef sFilterConfig;// CAN filter conf
[单片机]
【STM32CubeMX】11,<font color='red'>STM32</font>之CAN回环测试,过滤器的匹配设置
STM32串口通信中使用printf发送数据配置方法
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 标签: STM32 串口通信 printf方法 2011-06-29 23:29 在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义函数 如下: // 发送数据 in
[单片机]
stm32中printf要做哪些配置
在调试代码时,我们经常用printf函数来输出一些打印信息,那么你的UART串口不够用,还要用printf要怎么办? 其实很简单,就是:使用SWO/SWV。 SWO:Serial Wire Output,串行线输出 SWD:Serial Wire Viewer,串行线查看器 使用printf要做哪些配置? 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义《fputc》函数 3、在工程属性的 “Target“ -》 ”Code Generation“ 选项中勾选 ”Use MicroLIB“” MicroLIB 是缺省C的备份库,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved