430学习笔记之我见

发布者:DazzlingSpirit最新更新时间:2015-04-13 来源: eechina关键字:学习笔记 手机看文章 扫描二维码
随时随地手机看文章
这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。
 
讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。
 
1.首先你要知道msp430的存储器结构。典型微处理器的结构有两种:冯。诺依曼结构——程序存储器和数据存储器统一编码;哈佛结构——程序存储器和数据存储器;MSP430系列单片机属于前者,而常用的mcs51系列属于后者。
 
0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储
 
剩下的从0xffff开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x1100
 
2. 复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。但是,无论那种信号触发的复位,都会使MSP430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。复位后的状态不写了,详见参考书,嘿嘿。
 
3. 系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。430最多有三个振荡器,DCO内部振荡器;LFXT1外接低频振荡器,常见的 32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。
 
430有三种时钟信号:MCLK系统主时钟,可分频1 2 4 8,供cpu使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。
 
4.中断是430处理器的一大特色,因为几乎每个外围模块都能产生,430可以在没有任务时进入低功耗状态,有事件时中断唤醒cpu,处理完毕再次进入低功耗状态。
 
整个中断的响应过程是这样的,当有中断请求时,如果cpu处于活动状态,先完成当前命令;如果处于低功耗,先退出,将下一条指令的pc值压入堆栈;如果有多个中断请求,先响应优先级高的;执行完后,等待中断请求标志位复位,要注意,单中断源的中断请求标志位自动复位,而多中断的标志位需要软件复位;然后系统总中断允许位SR.GIE复位,相应的中断向量值装入pc,程序从这个地址继续执行。
 
这里要注意,中断允许位SR.GIE和中断嵌套问题。如果当你执行中断程序过程中,希望可以响应更高级别的中断请求时,必须在进入第一个中断时把SR.GIE置位。
 
其实,其他的外围模块时钟沿着时钟和中断这个核心来执行的。具体的结构我也不罗索了,可以参考430系列手册。
 
我想在写一下c语言对430编程的整体结构。基本上属于框架结构,即整体的模块化编程,其实这也是硬件编程的基本法则拉(可不是我规定的法则哦)。
 
首先是程序的头文件,包括#include ,这是14系列,因为常用149;其他型号可自己修改。还可以包括#include "data.h" 等数据库头文件,或函数变量声明头文件,都是你自己定义的哦。
 
接着就是函数和变量的声明 void Init_Sys(void);系统初始化
 
系统初始化是个整体的概念,广义上讲包括所有外围模块的初始化,你可以把外围模块初始化的子函数写到Init_Sys()中,也可以分别写各个模块的初始化。但结构的简洁,最好写完系统的时钟初始化后,其他所用到的模块也在这里初始化。
 
void Init_Sys()
{
unsigned int i;
 
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (i = 0xFF; i > 0; i--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
 
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
 
//以下对各种模块、中断、外围设备等进行初始化
 
........................................
 
_EINT(); //打开全局中断控制
}
 
这里涉及到时钟问题,通常我们选择XT2为8M晶振,也即系统主时钟MCLK为8M,cpu执行命令以此时钟为准;但其他外围模块可以在相应的控制寄存器中选择其他的时钟,ACLK;当你对速度要求很低,定时时间间隔大时,就可以选择ACLK,例如在定时器Timea初始化中设置。
 
主程序: void main( void )
{
 
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
 
InitSys(); //初始化
 
//自己任务中的其他功能函数
 
。。。。。。。。。。。。。。。。。。。。。
 
while(1);
 
}
 
主程序之后我要讲讲中断函数,中断是你做单片机任务中不可缺少的部分,也可以说是灵魂了(夸张吗)。
 
/*****************************************************************************
各中断函数,可按优先级依次书写
***********************************************************************/
 
举个定时中断的例子:
 
初始化 void Init_Timer_A(void)
{
TACTL = TASSEL0 + TACLR; // ACLK, clear TAR
CCTL0 = CCIE; // CCR0 中断使能
CCR0=32768; //定时1s
TACTL|=MC0; //增计数模式
}
 
中断服务 #pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
 
{
 
// 你自己要求中断执行的任务
 
}
 
当然,还有其他的定时,和多种中断,各系列芯片的中断向量个数也不同。
 
这就是简单的整体程序框架,写得简单啦,还忘谅解,明天详细了解一下各外围模块的初始化和功能,晚安。
 
 
整体的程序设计结构,包括了所有外围模块及内部时钟,中断,定时的初始化。具体情况大家可以根据自己的需要添加或者减少,记住,模块化设计时最有力的武器。
 
这可是个人总结的经典阿,谢谢支持。因为经常使用149,所以这是149的结构,其他的再更改,根据个人需要。
 
/*****************************************************************************
文件名:main.c
描述:MSP430框架程序。适用于MSP430F149,其他型号需要适当改变。
不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。
 
*****************************************************************************/
 
//头文件
#include
 
//函数声明
void InitSys();
 
 
int main( void )
{
 
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
 
InitSys(); //初始化
 
start:
//以下填充用户代码
 
 
LPM3; //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句
goto start;
 
}
[page]
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
unsigned int iq0;
 
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
 
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
 
//以下填充用户代码,对各种模块、中断、外围设备等进行初始化
 
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
 
/*****************************************************************************
端口2中断函数
******************************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
//以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
if((P2IFG&BIT0) == BIT0)
{
//处理P2IN.0中断
P2IFG &= ~BIT0; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT1) ==BIT1)
{
//处理P2IN.1中断
P2IFG &= ~BIT1; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT2) ==BIT2)
{
//处理P2IN.2中断
P2IFG &= ~BIT2; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT3) ==BIT3)
{
//处理P2IN.3中断
P2IFG &= ~BIT3; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT4) ==BIT4)
{
//处理P2IN.4中断
P2IFG &= ~BIT4; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT5) ==BIT5)
{
//处理P2IN.5中断
P2IFG &= ~BIT5; //清除中断标志
//以下填充用户代码
 
}
else if((P2IFG&BIT6) ==BIT6)
{
//处理P2IN.6中断
P2IFG &= ~BIT6; //清除中断标志
//以下填充用户代码
 
}
else
{
//处理P2IN.7中断
P2IFG &= ~BIT7; //清除中断标志
//以下填充用户代码
 
}
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
USART1发送中断函数
******************************************************************************/
#pragma vector=USART1TX_VECTOR
__interrupt void Usart1Tx()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
USART1接收中断函数
******************************************************************************/
#pragma vector=USART1RX_VECTOR
__interrupt void Ustra1Rx()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
端口1中断函数
多中断中断源:P1IFG.0~P1IFG7
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
//以下为参考处理程序,不使用的端口应当删除其对于中断源的判断。
if((P1IFG&BIT0) == BIT0)
{
//处理P1IN.0中断
P1IFG &= ~BIT0; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT1) ==BIT1)
{
//处理P1IN.1中断
P1IFG &= ~BIT1; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT2) ==BIT2)
{
//处理P1IN.2中断
P1IFG &= ~BIT2; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT3) ==BIT3)
{
//处理P1IN.3中断
P1IFG &= ~BIT3; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT4) ==BIT4)
{
//处理P1IN.4中断
P1IFG &= ~BIT4; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT5) ==BIT5)
{
//处理P1IN.5中断
P1IFG &= ~BIT5; //清除中断标志
//以下填充用户代码
 
}
else if((P1IFG&BIT6) ==BIT6)
{
//处理P1IN.6中断
P1IFG &= ~BIT6; //清除中断标志
//以下填充用户代码
 
}
else
{
//处理P1IN.7中断
P1IFG &= ~BIT7; //清除中断标志
//以下填充用户代码
 
}
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
[page]
/*****************************************************************************
定时器A中断函数
多中断中断源:CC1~2 TA
******************************************************************************/
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1()
{
//以下为参考处理程序,不使用的中断源应当删除
switch (__even_in_range(TAIV, 10))
{
case 2:
//捕获/比较1中断
//以下填充用户代码
 
break;
case 4:
//捕获/比较2中断
//以下填充用户代码
 
break;
case 10:
//TAIFG定时器溢出中断
//以下填充用户代码
 
break;
}
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
定时器A中断函数
中断源:CC0
******************************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
AD转换器中断函数
多中断源:摸拟0~7、VeREF+、VREF-/VeREF-、(AVcc-AVss)/2
没有处理ADC12TOV和ADC12OV中断标志
******************************************************************************/
#pragma vector=ADC_VECTOR
__interrupt void Adc()
{
//以下为参考处理程序,不使用的中断源应当删除
if((ADC12IFG&BIT0)==BIT0)
{
//通道0
//以下填充用户代码
 
}
else if((ADC12IFG&BIT1)==BIT1)
{
//通道1
//以下填充用户代码
 
}
else if((ADC12IFG&BIT2)==BIT2)
{
//通道2
//以下填充用户代码
 
}
else if((ADC12IFG&BIT3)==BIT3)
{
//通道3
//以下填充用户代码
 
}
else if((ADC12IFG&BIT4)==BIT4)
{
//通道4
//以下填充用户代码
 
}
else if((ADC12IFG&BIT5)==BIT5)
{
//通道5
//以下填充用户代码
 
}
else if((ADC12IFG&BIT6)==BIT6)
{
//通道6
//以下填充用户代码
 
}
else if((ADC12IFG&BIT7)==BIT7)
{
//通道7
//以下填充用户代码
 
}
else if((ADC12IFG&BIT8)==BIT8)
{
//VeREF+
//以下填充用户代码
 
}
else if((ADC12IFG&BIT9)==BIT9)
{
//VREF-/VeREF-
//以下填充用户代码
 
}
else if((ADC12IFG&BITA)==BITA)
{
//温度
//以下填充用户代码
 
}
else if((ADC12IFG&BITB)==BITB)
{
//(AVcc-AVss)/2
//以下填充用户代码
 
}
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
USART0发送中断函数
******************************************************************************/
#pragma vector=USART0TX_VECTOR
__interrupt void Usart0Tx()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
USART0接收中断函数
******************************************************************************/
#pragma vector=USART0RX_VECTOR
__interrupt void Usart0Rx()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
看门狗定时器中断函数
******************************************************************************/
#pragma vector=WDT_VECTOR
__interrupt void WatchDog()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
比较器A中断函数
******************************************************************************/
#pragma vector=COMPARATORA_VECTOR
__interrupt void ComparatorA()
{
//以下填充用户代码
 
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
[page]
/*****************************************************************************
定时器B中断函数
多中断源:CC1~6 TB
******************************************************************************/
#pragma vector=TIMERB1_VECTOR
__interrupt void TimerB1()
{
//以下为参考处理程序,不使用的中断源应当删除
switch (__even_in_range(TBIV, 14))
{
case 2:
//捕获/比较1中断
//以下填充用户代码
 
break;
case 4:
//捕获/比较2中断
//以下填充用户代码
 
break;
case 6:
//捕获/比较3中断
//以下填充用户代码
 
break;
case 8:
//捕获/比较4中断
//以下填充用户代码
 
break;
case 10:
//捕获/比较5中断
//以下填充用户代码
 
break;
case 12:
//捕获/比较6中断
//以下填充用户代码
 
break;
case 14:
//TBIFG定时器溢出中断
//以下填充用户代码
 
break;
}
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
定时器B中断函数
中断源:CC0
******************************************************************************/
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0()
{
//以下填充用户代码
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
不可屏蔽中断函数
******************************************************************************/
#pragma vector=NMI_VECTOR
__interrupt void Nmi()
{
//以下为参考处理程序,不使用的中断源应当删除
if((IFG1&OFIFG)==OFIFG)
{
//振荡器失效
IFG1 &= ~OFIFG;
//以下填充用户代码
 
}
else if((IFG1&NMIIFG)==NMIIFG)
{
//RST/NMI不可屏蔽中断
IFG1 &= ~NMIIFG;
//以下填充用户代码
 
}
else //if((FCTL3&ACCVIFG)==ACCVIFG)
{
//存储器非法访问
FCTL3 &= ~ACCVIFG;
//以下填充用户代码
 
}
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
 
/*****************************************************************************
基本定时器中断函数
******************************************************************************/
#pragma vector=BASICTIMER_VECTOR
__interrupt void BasTimer()
{
//以下填充用户代码
 
LPM3_EXIT; //退出中断后退出低功耗模式。若退出中断后要保留低功耗模式,将本句屏蔽
}
关键字:学习笔记 引用地址:430学习笔记之我见

上一篇:MSP430简介之我见
下一篇:MSP430中的SD16模块

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

msp430 程序升级
第一篇 在项目开发中,至关重要的是保证产品运行的可靠,如果遇到异常,能否恢复很重要,而不是像砖头一样,程序死在某个地方。固件升级的原理就是重写向量表,在引导区更新app区的flash,然后跳转app区。实际开发中就会有以下问题: 1.如果MCU复位,比如POR,PDR,WDT等复位,都会使sp指针指向复位地址。那么MCU从引导区执行,如果APP区程序有效,应该如何控制程序跳转到APP区。 2.如果APP区或者引导区接受新固件,在更新APP区flash时,如果此时MCU发生掉电,当再次上电后,MCU该如何执行。或许有人说,我们有外部的EEP或者外部的FLASH,会使用状态和标志去记录当时MCU操作flash的状态,当然这些状态和
[单片机]
以超低功耗微处理器MSP430为核心的热计量表设计
引言 我国地域广阔,人口众多。房屋建筑规模巨大,住宅建设量大而且面广,至今仍呈上升趋势,而且这个上升趋势还将持续20~30年。 在这种情况下,把 大锅饭 式的采暖包费制,改为按实际使用热量向用户收费,无疑是缓解煤电能源紧缺矛盾的有效手段。为此,本文介绍了一种新型热量表的设计方法。该热量表是一种分户热量计量装置,它由无磁热水流量计、温度传感器和微功耗单片机组成的积算仪等三部分组成。仪表安装在系统的供水管上,并将温度传感器分别装在供、回水管路上。一段时间内用户所消耗的热量为所供热水的流量和供回水的焓差乘积对时间的积分。热量表利用该原理并通过热水流量计测量逐时流量并用温度传感器测量逐时供回水温度,再将这些数据输入积算仪进行积分计
[单片机]
以超低功耗微处理器MSP<font color='red'>430</font>为核心的热计量表设计
msp430按键控制LED灯
#include io430.h /* 按键控制lLED灯的亮灭,有两种方法. 方法一:中断功能. 方法二:利用 if(P4IN&BIT2)判断即可. 写代码时,尽量按照步骤来,避免因疏忽而浪费大量时间找bug. */ int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P4DIR |= BIT5; P4REN |= BIT2; P4OUT |= BIT2; P4IES |= BIT2; P4IFG &= ~BIT2; P4IE |
[单片机]
高性价比铸造MCU MSP430FR2111的优点
MSP430FR2111的优点总结,看着写的挺好的,非原创 高性价比铸造MSP430 FR2111 MCU TI所推出MSP430 FR2111 MCU主要是基于8位单片机的应用,意在用8位单片机价格提供16位铁电单片机的功能,能够解决现在8位单片机用户面临的存储上的挑战或模拟外设上的挑战。 MSP430 FR2111 MCU的铁电提供了统一化的存储器,拥有铁电家族安全性能高、擦写次数多等特点,铁电存储器尺寸仅为2K FRAM,尤其适用于数据采集传感器类应用。同时,它还有1K SRAM,2K ROM用来做程序升级。片上还具有10位SA型的ADC,1个比较器等模拟外设,并带有6位的DSA作为阈值设定,可以通过6位DSA来设不同比较器
[单片机]
高性价比铸造MCU MSP<font color='red'>430</font>FR2111的优点
MSP430 串口通讯
MSP430 串口1 实现即时通讯 芯片:430F169 现在市面上大多数单片机都自带串口,本章介绍如何建立430串口通讯 单片机通过接收口(URXD)和发送口(UTXD)和外界进行通讯 430F169自带串口0和串口1两个通讯口 串口通讯是基于系统时钟上进行的,系统时钟的配置可以参考我之前的系统时钟进行配置。 1 串口控制各种寄存器 1 UxCTL,串口控制寄存器 2 UxTCTL,串口传输控制寄存器 3 UxRCTL,串口接收控制寄存器 4 UxBR0,波特率控制寄存器0 5 UxBR1,波特率控制寄存器1 6 UxMCTL,调制控制寄存器 7 UxRXBUF,接收缓存寄存器 8 UxTXBUF,传
[单片机]
MSP<font color='red'>430</font> 串口通讯
STM8+STVD+COSMIC 学习笔记 address is out of range and is ignored
在连续整了一个下午,一个晚上,又一个上午之后终于可以用STVD调试了!以此来纪念一下。 单片机时STM8AF5189,工程是人家编译好的,结果拿到手里编译后发现s19文件变大了不少,而且里面的地址出现了一些0x0000开始的地址,正常情况下应该是从0x8080开始才对,最开始的感觉就是编译器配置问题,在改了若干项配置,包括优化等等,还是不能仿真,debug时提示swim communication error,在排除了硬件问题之后,感觉是软件问题。经历了长时间折腾后打算用IAR,结果换用IAR问题又是一大堆。无奈又回头折腾STVD,偶然的发现,可能是c编译器的问题,也就是COSMIC的问题,当时用的是从网上下的一个,没注意有代
[单片机]
STM8+STVD+COSMIC <font color='red'>学习</font><font color='red'>笔记</font> address is out of range and is ignored
IAR 430 头文件中#define定义的部分解释
今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。 首先来看一下cc430x613x.h 中的3个#define的例子: #define DEFC(name, address) __no_init volatile unsigned char name @ address; #define DEFW(name, address) __no_init volatile unsigned short name @ address; #define DEFCW(name, address) __no_init union { struct { volatile unsig
[单片机]
基于MSP430的无线传感器网络设计
引言 传感测试技术正朝着多功能化、微型化、智能化、网络化、无线化的方向发展,自组织无线传感器网络(Self Organizing Wireless Sensor Network)作为新兴技术,是目前国外研究的热点,其在军事、环境、健康、家庭、商业、空间探索和灾难拯救等领域展现出广阔的应用前景,早在2003年美国自然科学基金委员会已经斥巨资来支持这方面的研究,并且出现了一些致力于无线传感器网络的公司。其中,Crossbow公司已推出了Mica系列传感器网络产品,国内很多大学现已经开展相关领域的研究,但大部分工作仍处在自组织无线网络协议性能仿真和硬件节点小规模实验设计阶段,本文就国防科技大学传感器教研室开展可应用于环境监测方面无线传
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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