|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-1-24 18:53:32
|
显示全部楼层
#include <msp430f5529.h>
#define PORT_MAP_EINT //映射完成,开中断
const unsigned char PortSequence[6] = {
PM_NONE,
PM_NONE ,
PM_UCA1TXD,
PM_UCA1RXD,
PM_NONE ,
PM_NONE
};
unsigned char Uart_receive[20];
unsigned char receive_finish=0;
unsigned char receive_count=0;
void Port_Mapping(void);
void Uart_initial(void);
void write_SegC();
void copy_C2D(void);
void main(void)
{
unsigned char m;
char *FLASH_ject;
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
Port_Mapping(); //UART端口映射到P4
P4DIR |= 0xFF; // P4.0 - P4.7 output
P4SEL |= 0xFF; // P4.0 - P4.6 Port Map functions
Uart_initial(); //初始化与启动串口
__enable_interrupt(); //使能全局中断
while(1)
{
if( receive_finish==1)
{
receive_finish=0; //操作完成
write_SegC(); //写进FLASH
FLASH_ject=(char *) 0x1880;
for(m=0;m<20;m++) //通过串口把FLASH里面的数据发出去,检验FLASH里面数据是否正确
{
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF=*FLASH_ject++;
}
}
}
}
//*********************************************************************************
//****函数名称:void Uart_initial()
//****函数功能:初始UART,设置BRCLK时钟为1MHz,波特率为115200,数据位8,停止1,无校验
//****返回值 :无
//**********************************************************************************
void Uart_initial(void)
{
UCA1CTL1 |= UCSWRST; // 复位状态机
UCA1CTL1 |= UCSSEL_2; // BRCLK时钟为SMCLK时钟,1MHz
UCA1BR0 = 9; // 1MHz 115200 (see User's Guide)
UCA1BR1 = 0; // 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0; // 调制 UCBRSx=1, UCBRFx=0
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}
//*********************************************************************************
//****函数名称:Port_Mapping(void)
//****函数功能:PUC上电时,映射一次,P4.3/P4,.2为Uart口,映射完成开中断
//****返回值 :无
//**********************************************************************************
void Port_Mapping(void)
{
unsigned char i;
volatile unsigned char *ptr;
__disable_interrupt(); // Disable Interrupts before altering Port Mapping registers
PMAPPWD = 0x02D52; // Enable Write-access to modify port mapping registers
#ifdef PORT_MAP_RECFG
PMAPCTL = PMAPRECFG; // Allow reconfiguration during runtime
#endif
ptr = &P4MAP0;
for(i=0;i<6;i++)
{
*ptr = PortSequence[i];
ptr++;
}
PMAPPWD = 0; // Disable Write-Access to modify port mapping registers
#ifdef PORT_MAP_EINT
__enable_interrupt(); // Re-enable all interrupts
#endif
}
//***********************************************************************************
//****函数名称:void write_SegC(char value)
//****函数功能:先擦除C扇区128字节,在把Value写入128字节
//****返回值 : 无
//************************************************************************************
void write_SegC()
{
unsigned char i;
char * Flash_ptr; // Initialize Flash pointer
Flash_ptr = (char *) 0x1880;
__disable_interrupt(); // 对FLASH操作禁止中断,防止出错
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY+ERASE; // Set Erase bit
*Flash_ptr = 0; // Dummy write to erase Flash seg
FCTL1 = FWKEY+WRT; // Set WRT bit for write operation
for (i = 0; i < 20; i++)
{
*Flash_ptr++ = Uart_receive[i]; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY+LOCK; // Set LOCK bit
__enable_interrupt();
}
//***********************************************************************************
//****函数名称:void copy_C2D(void)
//****函数功能:先擦除D扇区128字节,再把C扇区的值复制到D扇区
//****返回值 : 无
//************************************************************************************
void copy_C2D(void)
{
unsigned int i;
char *Flash_ptrC;
char *Flash_ptrD;
Flash_ptrC = (char *) 0x1880; // Initialize Flash segment C ptr
Flash_ptrD = (char *) 0x1800; // Initialize Flash segment D ptr
__disable_interrupt(); // 5xx Workaround: Disable global
// interrupt while erasing. Re-Enable
// GIE if needed
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY+ERASE; // Set Erase bit
*Flash_ptrD = 0; // Dummy write to erase Flash seg D
FCTL1 = FWKEY+WRT; // Set WRT bit for write operation
for (i = 0; i < 128; i++)
{
*Flash_ptrD++ = *Flash_ptrC++; // copy value segment C to seg D
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY+LOCK; // Set LOCK bit
__enable_interrupt();
}
//***********************************************************************************
//****函数名称: USCI_A1_ISR(void)
//****函数功能: Uart接收与发送中断
//****返回值 : 无
//************************************************************************************
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2:if(UCA1RXBUF=='{') // 接收数据帧,包头为“{”,包尾为“}”
{
receive_count=0;
Uart_receive[receive_count]=UCA1RXBUF;
receive_count++;
}
else if((UCA1RXBUF=='}')&&(receive_count<20))
{
Uart_receive[receive_count]=UCA1RXBUF;
receive_finish=1;
}
else
{
Uart_receive[receive_count]=UCA1RXBUF;
receive_count++;
}
break;
case 4: break; // Vector 4 - TXIFG
default: break;
}
}
|
|