基于STM32的MS5540c压强温度传感器的应用

发布者:DelightWish123最新更新时间:2018-10-15 来源: eefocus关键字:STM32  MS5540c  压强温度传感器 手机看文章 扫描二维码
随时随地手机看文章

3.5的库函数,stm32f10x系列的mcu,网上这个芯片的实例较少,而官方的代码an510这个文档找不到下载,datasheet写的也不甚明了。下面贴上我的基本程序给大家一个参考:


#include "main.h"
#include "Flash_LED.h"
#include "SPI_MS5540C.h"
#include "SysTick.h"

vu32 led_timer = 0; 
extern vu32 global_timer;
uint8_t detect_timer=0;
vu16 var_D1=0,var_D2=0;

int main()
{
 SystemInit();
 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //8 preemption priority
  Init_Flash_LED();
 Init_SPI_Device_Clk();
 Init_SPI_Device();
 Compute_Para();
 while(1)
 { 
  if(((global_timer > led_timer) && (global_timer - led_timer  >= 200))||((global_timer < led_timer) && (0xffffffff - led_timer + global_timer >= 200)))
        {
          toggle_led();
          led_timer=global_timer;
         detect_timer++;
        }

 
    SPI_Control_Byte(0);
  Delay_ms(20);
  SPI_Control_Byte(1);
  Delay_ms(100);
  var_D1=SPI_Read();
  Delay_ms(20);
  SPI_Control_Byte(2);
  Delay_ms(100);
  var_D2=SPI_Read();
  Compute_value(var_D1,var_D2);
    //while(1);
 // */
}

}

时间来不及仔细整理,spi_ms5540c.c  如下,头文件里面就是些声明就不写了 另外main函数里面用到的延时是随便写的,官方datasheet是33ms的转换时间
#include "SPI_MS5540C.h"

uint16_t Control_D1=0x0f40;//0x03d0 // pressure conversion control_words
uint16_t Control_D2=0x0f20;//0x03c8 // temperature conversion control_words
uint16_t Control_read_word1=0x1d50;//0x0ea8;//
uint16_t Control_read_word2=0x1d60;//0x0eb0;//
uint16_t Control_read_word3=0x1d90;//0x0ec8;//
uint16_t Control_read_word4=0x1da0;//0x0ed0;//
uint16_t Control_Reset1=0x0015;  //the funtion "SPI_I2S_SendData" only could supply 8bit or 16bit send,and the chip ms5540c could start up with three high bits
uint16_t Control_Reset2=0x5540;
uint16_t Blank=0x9249;//1001 0010 0100 1001 send it to read the coversion result and avoid the wrong operation
vu16 pressure_value=0,temp_value=0;
vu16 para_C1=0,para_C2=0,para_C3=0,para_C4=0,para_C5=0,para_C6=0;
vu16 data1=0,data2=0,data3=0,data4=0;

void Init_SPI_Device(void)
{
   SPI_InitTypeDef SPI_InitStructure;
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA,ENABLE);//??SP1I?GPIOA??
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//MOSI SCK??
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//??????
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   //GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//SPI_CS
   //GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//????
   //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   //GPIO_Init(GPIOA,&GPIO_InitStructure);
   SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //???????MSB???LSB???:?????MSB???
   //SPI_InitStructure.SPI_CRCPolynomial=7;//CRC???????
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
}

void SPI_Control_Byte(u8 xx)

   SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
  SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   //SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //?
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
 if(xx==0)
 {
 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_Reset1);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_Reset2);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
 
 }
if(xx==1) 

  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
    SPI_I2S_SendData(SPI1, Control_D1);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  
}    
if(xx==2)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_D2);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  
}
if(xx==11)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,Control_read_word1);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==12)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,Control_read_word2);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==13)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_read_word3);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==14)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_read_word4);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}

}
uint16_t SPI_Read(void)
{
  SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
     SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   //SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //? 
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
 
//    SPI_InitTypeDef SPI_InitStructure;
//  SPI_Cmd(SPI1,DISABLE);
 //  SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
  // SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
  // SPI_Cmd(SPI1,ENABLE);//??SPI??
// vu8 data1 = 0;
// vu8 data2 = 0;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 SPI_I2S_SendData(SPI1, Blank);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
  return SPI_I2S_ReceiveData(SPI1);
 
}

u16 Read_Factory_words(void)
{
   SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
// vu8 data1 = 0;
// vu8 data2 = 0;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 SPI_I2S_SendData(SPI1, Blank);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
  return SPI_I2S_ReceiveData(SPI1);

}

void TIM2_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);      //enable the TIM2 CLK
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);    // enable the GPIOa CLK
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 ;   //TIM2 CH4
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //GPIO_PinRemapConfig(GPIO_FullRemap_TIM4, ENABLE);  // if use the remap ,afio is need
 
  //GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  //GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM2_Mode_Config(u16 CCR4_Val)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 
  TIM_TimeBaseStructure.TIM_Period = 2197;      
  TIM_TimeBaseStructure.TIM_Prescaler = 0;     //the PWM period is 20Hz
  TIM_TimeBaseStructure.TIM_ClockDivision =0; 
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 // PWM1 Mode configuration: Channel4
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;     
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;   //????4??????,??????????PWM
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);   //????4
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM2, ENABLE);    // ??TIM4?????ARR

  // TIM4 enable counter
   TIM_Cmd(TIM2, ENABLE);                   //?????4 
}
void Init_SPI_Device_Clk(void)
{
  TIM2_GPIO_Config();
  TIM2_Mode_Config(1099);
}

void Compute_Para(void)
{
 u16 tmp=0;
 
    SPI_Control_Byte(0);
  
  
   //SPI_Control_Byte(0);
  //SPI_Control_Byte(0);
  // Delay_ms(100);
   //Temperature_Value=SPI_Read();
  SPI_Control_Byte(11);
  //Delay_ms(1000);
  data1=SPI_Read();
    
   SPI_Control_Byte(12);
   //Delay_ms(1000);
  data2=SPI_Read();
  
  SPI_Control_Byte(13);
  //Delay_ms(1000);
  data3=SPI_Read();
  
  SPI_Control_Byte(14);
  //Delay_ms(1000);
  data4=SPI_Read();
  
  Delay_ms(20);
  SPI_Control_Byte(2);

    tmp=data1&0xfffe;
    para_C1=tmp>>1;
    tmp=data3&0x003f;
    para_C2=tmp<<6;
    tmp=data4&0x003f;
    para_C2+=tmp;
    tmp=data4&0xffc0;
    para_C3=tmp>>6;
    tmp=data3&0xffc0;
    para_C4=tmp>>6;
    tmp=data1&0x0001;
    para_C5=tmp<<10;
    tmp=data2&0xffc0;
    para_C5+=tmp>>6;
    para_C6=data2&0x003f;
}
void Compute_value(u16 var_d1,u16 var_d2)
{
  double var_dt,var_x,var_off,var_sense,temp_value1,pressure_value1,var_t2,var_p2;
  var_dt=var_d2-20224-8*para_C5;
  var_off=para_C2*4+(para_C4-512)*var_dt/4096;
  var_sense=para_C1+para_C3*var_dt/1024+24576;
  var_x=var_sense*(var_d1-7168)/16384-var_off;
  temp_value1=(var_dt*(para_C6+50)/1024+200);
  pressure_value1=(var_x*10/32+2500);
 if(temp_value1<200)
 {
   var_t2=11*(para_C6+24)*(200-temp_value1)*(200-temp_value1)/1048576;
   var_p2=3*var_t2*(pressure_value1-3500)/16384;
 }
 else if(temp_value1>450)
 {
   var_t2=3*(para_C6+24)*(450-temp_value1)*(450-temp_value1)/1048576;
  var_p2=2*var_t2*(pressure_value1-10000)/16384;
  } 
 else
 {
   var_t2=0;
   var_p2=0;
  }
 temp_value=(int)(temp_value1-var_t2);
  pressure_value=(int)(pressure_value1-var_p2);
}


关键字:STM32  MS5540c  压强温度传感器 引用地址:基于STM32的MS5540c压强温度传感器的应用

上一篇:STM32的延时程序,us级延时
下一篇:基于STM32的NEC红外编码解码

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

基于 STM32和机智云物联网平台的农作物需水量统计系统
本文由机智云开发者利用农业物联网的相关优势,搭建了一个基于机智云物联网平台的农作物需水量计算系统,利用传感器采集农作物的现场环境信息后通过 ZigBee 协议发送到数据处理终端,根据设置的作物生长系数计算出对应的作物需水量;同时将相关的数据经过 4G 模块传输至机智云物联网平台,实现用户足不出户即可了解到农作物的相关信息,为制定合理的灌溉制度提供数据参考,达成适时灌溉和节约用水等目的。 1 系统总体设计 基于机智云物联网平台的农作物需水量计算系统,利用嵌入式微控制器采集作物的温湿度、风速环境信息,同时采用 ZigBee 技术进行数据的传输,将采集的作物环境信息传输至数据处理终端;当数据处理终端接收到相关的数据后,对作物需水量进
[单片机]
基于 <font color='red'>STM32</font>和机智云物联网平台的农作物需水量统计系统
STM32-仿真调试时的SystemInit陷阱
STM32-仿真调试时的SystemInit陷阱 我在开始STM32的仿真调试时,遇到一个问题,就是调试时程序一直停在SystemInit()中的等待晶振中,怎么也出不来。 SystemInit()前面部分的代码,都能走过,就是在执行到最后一个函数时出问题了。 最后一个函数是:SetSysClock(); 执行到下面这个循环之后,出不来了: /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC- CR & RCC_CR_HSERDY; StartUpCounter++; } while((HS
[单片机]
STM32-仿真调试时的SystemInit陷阱
STM32—TIMx输出PWM信号驱动MG996R舵机
一.前言 利用STM32的TIM3的通道1、通道2,输出俩路PWM信号,驱动MG996R舵机。 涉及到:TIM定时器基本原理,TIM定时中断、TIM输出PWM信号、MG996R舵机驱动原理 二.MG996R舵机简介 MG996R舵机单线驱动,是一款360°舵机,180°舵机与360°舵机的区别就是:180°舵机可以直接控制舵机旋转的角度,但舵机只能够旋转180°;360°舵机无法直接控制其旋转角度,只能控制其转动方向和速度。 舵机的驱动信号由周期为20ms的脉冲来控制: 当高电平持续时间为0.5~1.5ms时,舵机正转,时间越小转动越快 当高电平持续时间为1.5~2.5ms时,舵机反转,时间越大转动越快 当高电平持续时间为
[单片机]
<font color='red'>STM32</font>—TIMx输出PWM信号驱动MG996R舵机
STM32的时钟树与配置方法
时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。 STM32本身十分复杂,外设非常多,任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,如果都用高速时钟势必造成浪费。同一个电路,时钟越快功耗越大、抗电磁干扰能力越弱。复杂的MCU采用多时钟源的方法来解决这些问题。如下图,是STM32的时钟系统框图。 如上图左边的部分,看到STM32有4个独立时钟源,HSI、HSE、LSI、LSE。 HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。 HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 LSI是低速内部时钟,RC振荡器,频率为40k
[单片机]
<font color='red'>STM32</font>的时钟树与配置方法
基于stm32的 ucGUI 12864下的移植
ucGUI是纯C写的的,移植需要定义点阵数,颜色数,和画点函数 以下是ucGUI 12864下的移植 基于ST7920控制的12864液晶用于字符显示很方便的,但网友说用它显示图形并不合适,原因就是它绘图时先要关闭显示,绘完后又要打开,速度会较慢。我没有用过别的液晶,手中只有这一款,摆弄了几天,掌握了一点东西,写出来共享。 首先,我们知道,图形都是由像素点组成的,绘图的基础其实就是画点。只要我们能点亮液晶的任意一个像素点,那么绘图就不是什么难事了。万丈高楼平地起嘛,先要做的,当然是要打好基础。 ST7920提供了用于绘图的GDRAM(graph display RAM)。共 64×32,64是 个字节的空间(由扩充指令设定绘图
[单片机]
基于<font color='red'>stm32</font>的 ucGUI 12864下的移植
STM32之内存管理 学习笔记
一、内存管理 它是指软件运行时对MCU内存资源的分配和使用技术,它的特点是可以实现动态释放和回收内存。 使用它的最主要目的也是为了高效,快速的分配并且在适当的时候释放和回收内存资源。内存管理的实现方法有很多种,他们其实最终都是要实现两个函数:malloc(内存申请)和free(内存释放) 二、分块式内存管理 分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为n块,对应的内存管理表,大小也为n,内存管理表的每一个项对应内存池的一块内存。 内存管理表的项值代表的意义:当该项值为0的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项
[单片机]
<font color='red'>STM32</font>之内存管理 学习笔记
关于STM32串口通信使用printf发送数据的配置方法
开发环境: Keil RVMDK 在 STM32 串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含 stdio.h (标准输入输出头文件)。 2、在main文件中重定义 fputc 函数。如下: // 发送数据 int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char)
[单片机]
关于<font color='red'>STM32</font>串口通信使用printf发送数据的配置方法
STM32 FSMC操作SRAM的步骤简析
本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单元。其具有高性能、低功耗特点。为方便用户扩展SRAM的存储空间,为用户有提供了两个片选引脚;此外,含有两个字节控制信号UB和LB,可方便用户按字节访问SRAM或按字访问SRAM。IS62WV51216具有45ns/55ns访问速度,因为是全静态操作,因此无需外部时钟和刷新要求。 IS62WV51216功能框图 IS62WV51216有地址译码器、数据IO、控制逻辑和存储阵列四部分构成。地址译码器将1
[单片机]
<font color='red'>STM32</font> FSMC操作SRAM的步骤简析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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