MSP430 IIC 程序驱动代码
- 格式:doc
- 大小:47.00 KB
- 文档页数:6
MSP430学习(五)——IAR下JTAG下载和调试BSL要使用专门的烧录软件,除了MSPFET之外,好象还有LSD-BSL,还有能够在网络上找得到的一些自己编写的烧录软件。
TI提供了自己编写烧录软件的API和资料。
但这肯定不是业余爱好者愿意接触的。
IAR是MSP430超强的工具,它本身就能通过JTAG进行烧录和调试,而不需要再使用别的外在的工具。
似乎有介绍也可以两线SBW 烧录。
太复杂了,还是学会最通用的内容再拓展吧。
IAR下使用JTAG,一个是要设定好JTAG硬件,另一个是各种调试窗口和信息的理解。
这儿只说IAR里面怎么粗略使用JTAG。
1、先创建一个工程,写点代码。
Create newproject/Project templates:C,main;接下来保存,增减文件等。
2、开始设置。
Project/options...2.1、芯片型号设置。
General Options/Device,MSP430F5529;2.2、仿真器设置。
Debugger/Driver/FET Debugger;Run to/main;2.3、设置TI仿真器硬件。
FETDebugger/Setup/Connection/Texas Instrument USB-IF,Automatic;Target VCC/Overridedefault,3.3;FETDebugger/Download/Flash erase/Erase main memory。
万万不可选Erase main and Information memory,说是会破坏内部DCO,然后MSP430就完蛋了。
2.4、生成用于BSL烧录的txt或a43等文件类型。
Linker/Output/Outputfile/Override default;用于调试。
Format/Debug information forC-SPY/With.../With...用于烧录的txt。
步进电机2相驱动控制方向与速度程序代码以下是一个示例的步进电机2相驱动控制方向与速度的程序代码:```pythonimport RPi.GPIO as GPIOimport time# 定义步进电机引脚IN1 = 11 # 输入1IN2 = 12 # 输入2IN3 = 13 # 输入3IN4 = 15 # 输入4# 设置GPIO模式为BOARDGPIO.setmode(GPIO.BOARD)# 设置步进电机引脚为输出GPIO.setup(IN1, GPIO.OUT)GPIO.setup(IN2, GPIO.OUT)GPIO.setup(IN3, GPIO.OUT)GPIO.setup(IN4, GPIO.OUT)# 定义步进电机旋转函数def rotate(delay, steps, clockwise=True):# 声明步进电机转动模式coil_A = [1, 0, 0, 1]coil_B = [0, 1, 1, 0]steps_per_rev = 4if not clockwise:steps = -stepsfor _ in range(steps):for i in range(4):# 设置步进电机输出状态GPIO.output(IN1, coil_A[i])GPIO.output(IN2, coil_B[i])GPIO.output(IN3, coil_A[steps_per_rev - i - 1])GPIO.output(IN4, coil_B[steps_per_rev - i - 1])# 延迟一定时间time.sleep(delay)# 控制步进电机旋转try:while True:rotate(0.01, 200, True) # 按顺时针方向旋转200步 time.sleep(1) # 停顿1秒rotate(0.01, 200, False) # 按逆时针方向旋转200步 time.sleep(1) # 停顿1秒except KeyboardInterrupt:GPIO.cleanup()```。
本文为翻译的MSP430x1xx Family User's Guide家庭用户指南,且只有寄存器的翻译比较准确,其他地方阅读时请自行判断语句的准确性本文为翻译的MSP430x1xx Family User's Guide家庭用户指南,且只有寄存器的翻译比较准确,其他地方阅读时请自行判断语句的准确性本文为翻译的MSP430x1xx Family User's Guide家庭用户指南,且只有寄存器的翻译比较准确,其他地方阅读时请自行判断语句的准确性USART外围接口,I2C模式通用同步/异步接收/传输(USART)外设接口支持USART0 I2C通信。
本章介绍I2C模式。
在I2C模式在MSP430x15x和MSP430x16x器件上实现。
专题页面15.1 I2C模块简介..............................................15-215.2 I2C模块操作..............................................15-415.3 I2C模块寄存器............................................15-2015.3 I2C模块寄存器I2C模块寄存器如表15-4。
表15-4.I2C寄存器注册简称注册类型地址初始状态I2C中断使能 I2CIE 读/写 050hI2C中断标志 I2CIFG 读/写 051hI2C数据计数 I2CNDAT 读/写 052hUSART控制 U0CTL 读/写 070hI2C传输控制 I2CTCTL 读/写 071hI2C数据控制 I2CDCTL 只读 072hI2C预分频器 I2CPSC 读/写 073hI2C SCL高 I2CSCLH 读/写 074hI2C SCL低 I2CSCLL 读/写 075hI2C数据 I2CDRW/ I2CDRB 读/写 076hI2C自己的地址 I2COA 读/写 0118hI2C从地址 I2CSA 读/写 011AhI2C中断向量 I2CIV 只读 011ChU0CTL,UART0控制寄存器,I2C模式rw−0rw−0rw−0rw−0rw−0rw−0rw−0rw−1RXDMAEN 第7位接收DMA能。
void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节{uchar i,temp,temp1;temp1=wdata;for(i=0;i<8;i++){scl = 0;iic_delay();temp=temp1;temp=temp&0x80;if(temp==0x80)sda=1;elsesda=0;iic_delay();scl=1;iic_delay();scl=0;iic_delay();temp1=temp1<<1;}}char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节{uchar x;char data_data;for(x=0;x<8;x++){data_data=data_data<<1;sda=1;iic_delay();scl=0;iic_delay();scl=1;iic_delay();if(sda==1)data_data|=0x01;}return data_data;}void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据{uchar t;t=(IIC_WRITE<<1);iic_write_byte(t);iic_write_byte(byte_add);iic_write_byte(wdata);}char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据{uchar t;char x;t=(IIC_WRITE<<1);iic_write_byte(t);iic_write_byte(byte_add);t=((IIC_READ<<1)|0x01);iic_write_byte(t);x=iic_read_byte();return x;}#define IIC_READ 0x1D //定义读指令#define IIC_WRITE 0x1D //定义写指令void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节{uchar i,temp,temp1;temp1=wdata;for(i=0;i<8;i++){scl = 0;iic_delay();temp=temp1;temp=temp&0x80;if(temp==0x80)sda=1;elsesda=0;iic_delay();scl=1;iic_delay();scl=0;iic_delay();temp1=temp1<<1;}}char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节{uchar x;char data_data;for(x=0;x<8;x++){data_data=data_data<<1;sda=1;iic_delay();scl=0;iic_delay();scl=1;iic_delay();if(sda==1)data_data|=0x01;}return data_data;}void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据{uchar t;t=(IIC_WRITE<<1);iic_write_byte(t);iic_write_byte(byte_add);iic_write_byte(wdata);}char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据{uchar t;char x;t=(IIC_WRITE<<1);iic_write_byte(t);iic_write_byte(byte_add);t=((IIC_READ<<1)|0x01);iic_write_byte(t);x=iic_read_byte();return x;}。
MSP4301.时钟控制:430三个时钟源:LFXT1CLK低频时钟源,XT2CLK,高频时钟源,DCOCLK数控RC 振荡器。
2.三种时钟源可提供三种时钟信号:1.ACLK辅助时钟:ACLK是LFXT1CLK信号经过1、2、4、8分频得到的。
ACLK可由软件选作外围器件的时钟信号。
2.MCLK系统主时钟:可由软件来设置来源于低频时钟源,高频,数控。
之后可再经过1、2、4、8分频得到。
MCLK主要用于CPU和系统。
3.SMCLK:可有软件选这高频时钟来源,用于高速外围设备。
其中P1.4/SMCLK, P2.0/ACLK, P5.5/SMCLK, P5.6/ACLK。
时钟信号输出,可由PnSEL|=0xXX,l来设置特殊功能端口。
4.三个振荡器的控制位:1.低频LFXT1:OscOff;2.高频XT2CLK:XT2OFF;3.DCO:SCG0;5.一、时钟模块主要由三个寄存器来进行控制。
1.DCOCTL DCO控制器高三位:DCO.2、DCO.1 DCO.0定义8种频率之一,相邻两位相差10%,第五位详细调整频率。
其中DCO为7时表示选择最高频率。
2.BCSCTL1基本时钟控制器1位数7(最高)---XT2OFF:控制XT2的开启与关闭,0:开启;1:关闭。
6---------XTS:控制LFXT1工作模式:0:低频工作模式32768HZ;1:高频工作模式(前提接了相应的高频晶振)。
5,4--------DIV.1、DIV.0:控制ACLK分频(ACLK时钟来源于LFXT1)0:不分;1: 2分;2: 4分;3:8分;3-------XT5V:此位设置为0;2,1,0-----Rsel.0~Rsel.2 :0~7:最低标频~最高标频。
3.BCSCTL27,6-------SELM.1,SELM.0:选择MCLK时钟源(系统主时钟)0,1:DCOCLK为时钟源2:XT2CLK为时钟源3:时钟源为LFXT1CLK5,4-------DIVM.0,DIVM.1 选择MCLK分频。
/开发平台;MSP430IIC总线驱动代码本人试用过,可以成功的调通/////////////////////////////////////////////////////////////iic.c#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P1OUT |= BIT2#define SCL_L P1OUT &= ~BIT2#define SDA_H P1OUT |= BIT3#define SDA_L P1OUT &= ~BIT3#define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式#define SDA_out P1DIR |= BIT3 //SDA变回输出模式#define SDA_val P1IN&BIT3 //SDA的位值#define TRUE 1#define FALSE 0/*******************************************函数名称:delay功能:延时约15us的时间参数:无返回值:无********************************************/void delay(void){uchar i;for(i = 0;i < 15;i++)_NOP();}/*******************************************函数名称:start功能:完成IIC的起始条件操作参数:无返回值:无********************************************/void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功能:完成IIC的终止条件操作参数:无返回值:无********************************************/ void stop(void){SDA_L;delay();SCL_H;delay();SDA_H;delay();}/******************************************* 函数名称:mack功能:完成IIC的主机应答操作参数:无返回值:无********************************************/ void mack(void){SDA_L;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP();_NOP();SDA_H;delay();}/******************************************* 函数名称:mnack功能:完成IIC的主机无应答操作参数:无返回值:无********************************************/ void mnack(void){SDA_H;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP(); _NOP();SDA_L;delay();}/**********检查应答信号函数******************/ /*如果返回值为1则证明有应答信号,反之没有*/ /******************************************* 函数名称:check功能:检查从机的应答操作参数:无返回值:从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_H;_NOP(); _NOP();SCL_H;_NOP(); _NOP();SDA_in;_NOP(); _NOP();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功能:向IIC总线发送一个1参数:无返回值:无********************************************/void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功能:向IIC总线发送一个0参数:无返回值:无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write1byte功能:向IIC总线发送一个字节的数据参数:wdata--发送的数据返回值:无********************************************/ void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <<= 1;}SDA_H;_NOP();}/******************************************* 函数名称:writeNbyte功能:向IIC总线发送N个字节的数据参数:outbuffer--指向发送数据存放首地址的指针n--数据的个数返回值:发送是否成功的标志:1--成功,0--失败********************************************/ uchar writeNbyte(uchar * outbuffer,uchar n){uchar i;for(i = 0;i < n;i++){write1byte(* outbuffer);if(check()){outbuffer++;}else{stop();return FALSE;}}stop();return TRUE;}/******************************************* 函数名称:read1byte功能:从IIC总线读取一个字节参数:无返回值:读取的数据********************************************/ uchar read1byte(void){uchar rdata = 0x00,i;uchar flag;for(i = 0;i < 8;i++){SDA_H;delay();SCL_H;SDA_in;delay();flag = SDA_val;rdata <<= 1;if(flag) rdata |= 0x01;SDA_out;SCL_L;delay();}return rdata;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //iic.h#ifndef __IIC_h__#define __IIC_h__extern void delay(void);extern void start(void);extern void stop(void);extern void mack(void);extern void mnack(void);extern unsigned char check(void);extern void write1(void);extern void write0(void);extern void write1byte(unsigned char wdata);extern unsigned char writeNbyte(unsigned char * outbuffer,unsigned char n); extern unsigned char read1byte(void);extern void readNbyte(unsigned char * inbuffer,unsigned char n);#endif。
4)对应的SFR的中断位#define OFIFG 0x02#define OFIE 0x02九、SVSSVSCTL(0x0056) /* SVS Control */#define SVSFG (0x01) /* SVS Flag */#define SVSOP (0x02) /* SVS output (read only) */#define SVSON (0x04) /* Switches the SVS on/off */#define PORON (0x08) /* Enable POR Generation if Lo w Voltage */#define VLDON (0x10)#define VLDOFF (0x00)#define VLD_1_8V (0x10)十一、Timer A31)寄存器:TAIV (0x012E) 中断向量寄存器TACTL (0x0160) 控制寄存器CCTL0(0x0162) 捕获比较控制寄存器0CCTL1(0x0164) 捕获比较控制寄存器1CCTL2(0x0166) 捕获比较控制寄存器2TAR(0x0170) 寄存器CCR0(0x0172) 捕获比较寄存器0CCR1(0x0174) 捕获比较寄存器1CCR2(0x0176) 捕获比较寄存器22)TACTL中的各位SSEL1 SSEL0 输入信号TASSEL2 (0x0400) 未用0 0 TACLK(特定的外部信号)TASSEL1 (0x0200) 时钟选择0 1 ACLKTASSEL0 (0x0100) 时钟选择 1 0 MCLKID1 (0x0080) 输入信号分频:00 直通;01:2分频ID0 (0x0040) 与ID1一起:10 4分频11:8分频MC1 (0x0020) 两位一起:00 停止;01:增记数到CCR0;MC0 (0x0010) 模式控制:10 连续增记数,11 增记数到CCR0,减记数到0H;TACLR (0x0004) 定时器清除位TAIE (0x0002) 中断允许TAIFG (0x0001) 定时器溢出标志#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */#define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to C CR0 */#define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */#define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */ #define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */#define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */#define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */#define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */#define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - T ACLK */#define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */#define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */#define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */3)捕获比较控制寄存器CCTLX对应的位CM1 (0x8000) 00 禁止01 上升沿捕获CM0 (0x4000) 10 下降沿捕获11 上升沿与下降沿都捕获CCIS1 (0x2000) CCIS0和CCIS1输入选择00 选择CCIXA;CCIS0 (0x1000) 01 选择CCIXB,10 GND 11 VCC SCS (0x0800) 0异步捕获 1 同步捕获SCCI (0x0400) 捕获比较输入信号与比较输出EQUX同步CAP (0x0100) 0 比较模式 1 捕获模式OUTMOD2 (0x0080)OUTMOD1 (0x0040)OUTMOD0 (0x0020)CCIE (0x0010) 1 允许中断 0 禁止中断CCI (0x0008) 捕获/比较输入信号选择OUT (0x0004)COV (0x0002)CCIFG (0x0001) 中断标志(与CCRX有关)#define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */ #define OUTMOD_1 (1*0x20u) /* PWM output mode: 1 - set */#define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/re set */#define OUTMOD_3 (3*0x20u) /* PWM output mode: 3 - PWM set/reset */#define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */#define OUTMOD_5 (5*0x20u) /* PWM output mode: 5 - Reset */#define OUTMOD_6 (6*0x20u) /* PWM output mode: 6 - PWM toggle/ set */#define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/s et */#define CCIS_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */ #define CCIS_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */ #define CCIS_2 (2*0x1000u) /* Capture input select: 2 - GND */#define CCIS_3 (3*0x1000u) /* Capture input select: 3 - Vcc */#define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */#define FSSEL_2 (0x0080) /* Flash clock select: 2 - SMCLK */#define FSSEL_3 (0x00C0) /* Flash clock select: 3 - SMCLK */#define BUSY (0x0001) /* Flash busy: 1 */#define KEYV (0x0002) /* Flash Key violation flag */#define ACCVIFG (0x0004) /* Flash Access violation flag */#define WAIT (0x0008) /* Wait flag for segment write */#define LOCK (0x0010) /* Lock bit: 1 - Flash is locked (read onl y) */#define EMEX (0x0020) /* Flash Emergency Exit */十三、比较器#define CACTL1 (0x0059) /* Comparator A Control 1 */#define CACTL2 (0x005A) /* Comparator A Control 2 */#define CAPD (0x005B) /* Comparator A Port Disable */#define CAIFG (0x01) /* Comp. A Interrupt Flag */#define CAIE (0x02) /* Comp. A Interrupt Enable */#define CAIES (0x04) /* Comp. A Int. Edge Select: 0:rising / 1: falling */#define CAON (0x08) /* Comp. A enable */#define CAREF0 (0x10) /* Comp. A Internal Reference Select 0 */ #define CAREF1 (0x20) /* Comp. A Internal Reference Select 1 */ #define CARSEL (0x40) /* Comp. A Internal Reference Enable */ #define CAEX (0x80) /* Comp. A Exchange Inputs */#define CAREF_0 (0x00) /* Comp. A Int. Ref. Select 0 : Off */ #define CAREF_1 (0x10) /* Comp. A Int. Ref. Select 1 : 0.25*Vcc */ #define CAREF_2 (0x20) /* Comp. A Int. Ref. Select 2 : 0.5*Vcc */ #define CAREF_3 (0x30) /* Comp. A Int. Ref. Select 3 : Vt*/#define CAOUT (0x01) /* Comp. A Output */#define CAF (0x02) /* Comp. A Enable Output Filter */#define P2CA0 (0x04) /* Comp. A Connect External Signal to C A0 : 1 */#define P2CA1 (0x08) /* Comp. A Connect External Signal to C A1 : 1 */#define CACTL24 (0x10)#define CACTL25 (0x20)#define CACTL26 (0x40)#define CACTL27 (0x80)#define CAPD0 (0x01) /* Comp. A Disable Input Buffer of Port Register .0 */#define CAPD1 (0x02) /* Comp. A Disable Input Buffer of Port Register .1 */#define CAPD2 (0x04) /* Comp. A Disable Input Buffer of Port Register .2 */#define CAPD3 (0x08) /* Comp. A Disable Input Buffer of Port Register .3 */#define CAPD4 (0x10) /* Comp. A Disable Input Buffer of Port Register .4 */#define CAPD5 (0x20) /* Comp. A Disable Input Buffer of Port Register .5 */#define CAPD6 (0x40) /* Comp. A Disable Input Buffer of Port Register .6 */#define CAPD7 (0x80) /* Comp. A Disable Input Buffer of Port Register .7 */十四、中断向量#define BASICTIMER_VECTOR (0 * 2u) /* 0xFFE0 Basic Timer */#define PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */#define PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */#define TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */#define TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */ #define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priori ty] */。
MSP430汇编指令集1000字MSP430是单片机系列的一种,其指令集为精简指令集(RISC)风格。
下面列出了MSP430汇编指令集的大致分类和一些具体指令,主要参考了TI官方的MSP430 Architecture Guide。
一、数据传送指令:1. MOV:将源操作数复制到目的操作数中;2. LPM:从程序存储器读取指定地址中的内容;3. SWPB:交换操作数(低字节和高字节互换)。
二、算术指令:1. ADD:将两个操作数相加并将结果存储到目的操作数中;2. SUB:将两个操作数相减并将结果存储到目的操作数中;3. INC:将操作数加1并将结果存在目的操作数中;4. DEC:将操作数减1并将结果存在目的操作数中;5. DADD:带进位加法;6. CMP:比较两个操作数,并将结果存储到程序状态字寄存器中。
三、逻辑指令:1. AND:将两个操作数进行按位与操作,并将结果存储到目的操作数中;2. OR:将两个操作数进行按位或操作,并将结果存储到目的操作数中;3. XOR:将两个操作数进行按位异或操作,并将结果存储到目的操作数中;4. RRA:将操作数右移一位,并将最高位存储到溢出位(程序状态字寄存器)中。
四、移位指令:1. RLC:将操作数左移一位,并将最高位的值存储到溢出位中;2. RRC:将操作数右移一位,并将最低位的值存储到溢出位中;3. SWAP:低字节和高字节互换;4. SXT:将操作数的最高位扩展到目的操作数的所有高位。
五、跳转和分支指令:1. JMP:无条件跳转到指定地址;2. RET:从子程序中返回到调用程序;3. CLR:将操作数清零;4. TEST:测试操作数的值是否为0,是则跳转到指定地址;5. JZ:操作数为0则跳转到指定地址;6. JNZ:操作数不为0则跳转到指定地址;7. JAE:无符号数操作数小于或等于指定无符号数则跳转到指定地址;8. JBE:无符号数操作数大于或等于指定无符号数则跳转到指定地址。
MSP430无论是仿真还是烧写程序,一般可以通过:JTAG、SBW、BSL接口进行。
1、JTAG是利用边界扫描技术,在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到了430内部数据地址总线上,所以可以访问到430的所有资源,包括全地址FLASH、RAM及各种寄存器。
可以用于对430的仿真和编程,主要连接线有TMS、TCK、TDI、TDO,430还需要另两条线路RST、TEST来启动JTAG命令序列。
2、SBW是SPY-BI-WIRE,可以简称为两线制JTAG,主要有SBWTCK(连接到JTAG 接口的7脚TCK)与SBWTDIO(连接到JTAG接口的1脚TDO/TDI),该接口主要用于小于28脚的2系列单片机,因为28脚以内单片机的JTAG一般与IO口复用,为了给用于留有更多的IO资源,才推出SBW接口。
SBW同JTAG一样可以访问到430内部的所有资源。
注:目前MSP430F5XX系列中也有SBW接口,原理同2系列的SBW。
3、BSL是TI在430出厂时预先固化到MCU内部的一段代码,该代码用户不可读写,这有点类似与DSP的bootloader,但又与bootloader有明显的区别,BSL只能用于对MCU内部的FLASH访问,不能对其他的资源访问,所以只能用作编程器接口。
BSL通过UART协议与编程器连接通信。
编程器可以发送不同的通信命令来对MCU的存储器做不同的操作,可以把这种方式称为BSL接口。
BSL代码的启动有些特殊,一般430复位启动时PC指针指向FFFE复位向量,但可以通过特殊的启动方式可以使MCU在启动时让PC指向BSL内部固化的程序。
这种特殊的启动方式一般是由RST引脚与TEST(或TCK)引脚做一个稍复杂的启动逻辑后产生。
BSL启动后,就可以通过预先定义好的UART协议命令对MCU进行读写访问了。
4、一般的MCU都有代码加密功能,430是如何实现的呢?外部对430内部的代码读写只能通过上述的三种方式,只要把这三种方式都堵上,430的程序不就安全了吗?所以又引入了熔丝位,熔丝位只存在于JTAG、SBW接口逻辑内。
使用MSP430的DAC8552驱动程序,调试通过,不要感谢我!#include <msp430F5525.h>#include "DAC8552.h"void Clock_Init();int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR = 0XFF;P1OUT = 0X00;P2DIR = 0XFF;P2OUT = 0X00;P3DIR = 0XFF;P3OUT = 0X00;P4DIR = 0XFF;P4OUT = 0X00;P5DIR = 0XFF;P5OUT = 0X00;P6DIR = 0XFF;P6OUT = 0X00;P7SEL = 0X80; //P7.7 MCLK输出P7DIR = 0X80;P1SEL = 0X01; //P1.0 ACLK输出P1DIR = 0X01;P2SEL = 0X04; //P2.2 SMCLK输出P2DIR = 0X04;Clock_Init();InitDAC8552();while (1){DAC8552();Delay1(); //max建立时间10usSYNC_H;}}//时钟初始化void Clock_Init(){// Initialize LFXT1unsigned int iq0;// Select XT1P5SEL |= 0x3C;UCSCTL6 &= ~(XT1OFF); // XT1 OnUCSCTL6 |= XCAP_3; // Internal load cap// Loop until XT1 fault flag is cleareddo{UCSCTL7 &= ~XT1LFOFFG; // Clear XT1 fault flagsfor (iq0 = 0xFF; iq0 > 0; iq0--);}while (UCSCTL7&XT1LFOFFG); // Test XT1 fault flagUCSCTL6 &= ~(XT2OFF); //XT2 ONUCSCTL6 |= XT2DRIVE0; //do{UCSCTL7 &= ~XT2OFFG; // Clear XT2 fault flagsfor (iq0 = 0xFF; iq0 > 0; iq0--);}while (UCSCTL7&XT2OFFG); // Test XT2 fault flagdo{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG; // Clear fault flagsfor (iq0 = 0xFF; iq0 > 0; iq0--);}while (SFRIFG1&OFIFG); // Test oscillator fault flagUCSCTL4 = SELA_5 + SELM_5 + SELS_5;//UCSCTL5 = DIVA_3;}//头文件DAC8552.C#include <msp430F5525.h>#include "DAC8552.h"unsigned char shuju[3];/******************************Write_3_Byte************************************* ******/void Write_3_Byte(unsigned char xr[3]){int i;//P3OUT &=~0x08;SCLK_L;//P3OUT |= 0x10;SYNC_H;Delay1();//P3OUT &=~0x10;SYNC_L;Delay1();//P3OUT |= 0x08;SCLK_H;for (i = 0; i < 3 ; i++){Write_1_Byte(xr[i]);}Delay1();// SYNC_H;Delay1();}/******************************InitDAC8552************************************** *****/void InitDAC8552(void){//shuju[0] = 0x24; //OUTB//shuju[0] = 0x00;//shuju[0] = 0x34;//shuju[0] = 0x01;//shuju[0] = 0x36;//shuju[0] = 0x13;//shuju[0] = 0x27;shuju[0] = 0x10; //OUTA//shuju[0] = 0x24;shuju[1] = 0x80;shuju[2] = 0x00;}/******************************DAC8552***************************************** **/void DAC8552(void){Write_3_Byte(shuju);}/******************************Write_1_Byte************************************* ******/void Write_1_Byte(unsigned char date){int j;for( j = 0 ; j < 8 ; j++ ){Delay1();if( date & 0x80 ) //if((DataByte<<i)&0x80){//P3OUT |= 0x04;DIN_H;}else{//P3OUT &=~0x04;DIN_L;}Delay1();//P3OUT &=~0x08;SCLK_L;Delay1();//P3OUT |= 0x08;SCLK_H;Delay1();date <<= 1;}}/******************************Delay_10us*************************************** ****/void Delay_1us(unsigned int n){unsigned int i, j;for (j = 0; j < n; j++){for (i = 0 ; i < 8000; i++){_NOP();}}}/******************************Delay1 125ns 1/nMHZ S*******************************************/void Delay1(void){_NOP();}//头文件DAC8552.H#include <msp430F5525.h>#ifndef __DAC8552_H__#define __DAC8552_H__#define SYNC1 0x10#define SCLK 0x08#define DIN 0x04#define SYNC_SEL P3SEL &= ~SYNC1 // P3.4 IO#define SYNC_DDR_OUT P3DIR |= SYNC1 //P3.4输出#define SYNC_OUT P3OUT#define SYNC_H SYNC_OUT |= SYNC1 //SYNC置1#define SYNC_L SYNC_OUT &= ~SYNC1 //SYNC置0#define SCLK_SEL P3SEL &= ~SCLK // P3.3IO#define SCLK_DDR_OUT P3DIR |= SCLK //P3.3输出#define SCLK_OUT P3OUT#define SCLK_H SCLK_OUT |= SCLK //SCLK置1 #define SCLK_L SCLK_OUT &= ~SCLK //SCLK置0#define DIN_SEL P3SEL &= ~DIN //P3.2 #define DIN_DDR_OUT P3DIR |= DIN //DIN输出#define DIN_DDR_IN P3DIR &= ~DIN //DIN输入#define DIN_OUT P3OUT#define DIN_IN P3IN#define DIN_H DIN_OUT |= DIN#define DIN_L DIN_OUT &= ~DIN*///SYNC P3.4#define SYNC_H P3OUT |= 0x10; //1#define SYNC_L P3OUT &=~0x10; //0//SCLK P3.3#define SCLK_H P3OUT |= 0x08;#define SCLK_L P3OUT &=~0x08;//DIN P3.2#define DIN_H P3OUT |= 0x04;#define DIN_L P3OUT &=~0x04;extern unsigned char shuju[3];extern void Write_3_Byte(unsigned char xr[3]);extern void Write_1_Byte(unsigned char date);//extern void Delay_1ms(void);//extern void Delay(void);extern void Delay_10us(unsigned int q);extern void Delay1(void);extern void InitDAC8552(void);extern void DAC8552(void);#endif。
IARMSP430使用指引本指引是为配合推出的MSP430学习系统而写的,当然您也可以把它当成您使用IAR FOR MSP430(以下简写为EW430)的一个参考文档!本指引会按照建立一个项目的步骤来撰写,并且会插入附图以加快大家对IAR FOR MSP430的学习使用。
一、安装和运行EW430:EW430是IAR SYSTEMS SOFTWARE INC的产品,该公司的网站是,您可以到这个公司的网站下载到试用版的软件,它和正式版不同的是试用版可以免费使用一段时间而没有功能上的限制,超过这段试用期,如果您打算继续使用,那么您得购买此软件的授权。
下载了试用版后,点击安装包的SETUP.EXE,选择安装路径和安装方式或采用默认的安装,安装包会在目录下产生IAR的目录,并在”开始”菜单产生快捷方式,这一个工程对于经常使用软件的用户来说是非常简单的,因此不再AOSHU。
系统重启后,在系统栏会出现图1.1中的图标。
在这个图标上点击鼠标左键可以很方便的开启IAR FOR MSP和其它IAR系统软件(图1.2)。
图1.1图1.2运行后的界面如图1.3所示(以1.26A版为例)图1.3二、建立工程文件和添加文件我们习惯了在WINDOWS下的各种编程软件中以一个工程(PROJECT)来管理我们正在作的工作,EW430也不例外,因此第一步要作的就是新建一个工程或用其它方法来建立一个工程。
点击”File”菜单下的”New”菜单,出现图2.1中的框,选择”Project”后点击”确定”按键。
图2.1接下来会出现对话框,您得指定你的工程文件保存在哪个目录下图2.2我这此建立的是一个控制液晶模块1602A的工程,取名为lcm1602.prj。
然后点击”Create”按键生成这个项目。
图2.3图中的”Targets”一项中表示目前的这个工程的是用于调试的。
好了,工程文件已经建立完成了,现在可以把要用到的文件添加到工程中去。
要提醒您的是经常使用”File”菜单下的”Save all”保存您到目前完成的工作。
/开发平台;MSP430IIC总线驱动代码本人试用过,可以成功的调通/////////////////////////////////////////////////////////////iic.c#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P1OUT |= BIT2#define SCL_L P1OUT &= ~BIT2#define SDA_H P1OUT |= BIT3#define SDA_L P1OUT &= ~BIT3#define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式#define SDA_out P1DIR |= BIT3 //SDA变回输出模式#define SDA_val P1IN&BIT3 //SDA的位值#define TRUE 1#define FALSE 0/*******************************************函数名称:delay功能:延时约15us的时间参数:无返回值:无********************************************/void delay(void){uchar i;for(i = 0;i < 15;i++)_NOP();}/*******************************************函数名称:start功能:完成IIC的起始条件操作参数:无返回值:无********************************************/void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功能:完成IIC的终止条件操作参数:无返回值:无********************************************/ void stop(void){SDA_L;delay();SCL_H;delay();SDA_H;delay();}/******************************************* 函数名称:mack功能:完成IIC的主机应答操作参数:无返回值:无********************************************/ void mack(void){SDA_L;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP();_NOP();SDA_H;delay();}/******************************************* 函数名称:mnack功能:完成IIC的主机无应答操作参数:无返回值:无********************************************/ void mnack(void){SDA_H;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP(); _NOP();SDA_L;delay();}/**********检查应答信号函数******************/ /*如果返回值为1则证明有应答信号,反之没有*/ /******************************************* 函数名称:check功能:检查从机的应答操作参数:无返回值:从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_H;_NOP(); _NOP();SCL_H;_NOP(); _NOP();SDA_in;_NOP(); _NOP();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功能:向IIC总线发送一个1参数:无返回值:无********************************************/void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功能:向IIC总线发送一个0参数:无返回值:无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write1byte功能:向IIC总线发送一个字节的数据参数:wdata--发送的数据返回值:无********************************************/ void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <<= 1;}SDA_H;_NOP();}/******************************************* 函数名称:writeNbyte功能:向IIC总线发送N个字节的数据参数:outbuffer--指向发送数据存放首地址的指针n--数据的个数返回值:发送是否成功的标志:1--成功,0--失败********************************************/ uchar writeNbyte(uchar * outbuffer,uchar n){uchar i;for(i = 0;i < n;i++){write1byte(* outbuffer);if(check()){outbuffer++;}else{stop();return FALSE;}}stop();return TRUE;}/******************************************* 函数名称:read1byte功能:从IIC总线读取一个字节参数:无返回值:读取的数据********************************************/ uchar read1byte(void){uchar rdata = 0x00,i;uchar flag;for(i = 0;i < 8;i++){SDA_H;delay();SCL_H;SDA_in;delay();flag = SDA_val;rdata <<= 1;if(flag) rdata |= 0x01;SDA_out;SCL_L;delay();}return rdata;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //iic.h#ifndef __IIC_h__#define __IIC_h__extern void delay(void);extern void start(void);extern void stop(void);extern void mack(void);extern void mnack(void);extern unsigned char check(void);extern void write1(void);extern void write0(void);extern void write1byte(unsigned char wdata);extern unsigned char writeNbyte(unsigned char * outbuffer,unsigned char n); extern unsigned char read1byte(void);extern void readNbyte(unsigned char * inbuffer,unsigned char n);#endif。