📄 init.h
字号:
#define VERSION 340 //IAR version
#define FLASH_B 0x1000 //存放默认的涡街内径,仪表系数,介质密度等参数
#define FLASH_A 0X1080 //存放修改的涡街内径,仪表系数,介质密度等参数
static float Coefficient[3]={50,9.123,1}; //涡街内径,涡街的仪表系数,管道介质密度
//main variable
unsigned int i;
float Diameter=0,Meter_coeffient=0,Density=0;
//main function
void CLOCK_Init(void);
void FLASH_Init(void);
void Write_unchar_FLASH(unsigned char *Flash_ptr,unsigned char Flash_value);
void Write_float_FLASH (float *Flash_ptr,float Flash_value);
void RESET_FLASH (float *Flash_ptrA,float *Flash_ptrB);
void FLASH_CLR(float *FLASH_ptr );
//////////////////////////////////////////////////////////////////////////
void CLOCK_Init(void)
{
BCSCTL1=0x00;
BCSCTL2=0x88;
do //wait in loop until crystal is stable
{
IFG1&=~OFIFG;
for (i = 0xFF; i > 0; i--); // Time for flag to set
}while(OFIFG&IFG1);
}
void UART_Init(void)
{
//------------------------------通讯口初始化------------------------------//
P3SEL |= BIT6 + BIT7;
ME2 |= URXE1 + UTXE1; // Enable USART1 RXD + TXD
UCTL1 |= CHAR + SWRST;
UBR01 = 0x06; // set the baud rate=4800
UBR11 = 0; // UBR+(m7+...m0)/8=32768/4800=6.83
UMCTL1 = 0xFB; // UBR=0xFB 利用公式得出UMCTL1的值
UTCTL1|= SSEL0; //select ACLK
URCTL1 = URXEIE; //接受出错中断允许位???
UCTL1 &= ~SWRST;
IE2 |= URXIE1; // Enable USART1 RX interrupt
}
float *ptrFCoefficient = (float *)FLASH_A; // 指向存放涡街口径和仪表修正系数的地址
unsigned char *ptrChCoefficient = (unsigned char *)FLASH_A;// 指向存放涡街口径和仪表修正系数的地址
char COEFFICIENT;
void FLASH_Init(void)
{
COEFFICIENT = 1;
if((*((char *)(ptrFCoefficient+3)))==0xAA)
{
Diameter = *ptrFCoefficient;
Meter_coeffient = *(ptrFCoefficient+1);
Density = *(ptrFCoefficient+2);
}
else
{
for(i=0;i<3;i++)
{
Write_float_FLASH ((float *)FLASH_B+i,Coefficient[i]);
Write_float_FLASH ((float *)FLASH_A+i,Coefficient[i]);
}
Write_unchar_FLASH ((unsigned char *)FLASH_B+12,0xAA);
Write_unchar_FLASH ((unsigned char *)FLASH_A+12,0xAA);
Diameter = *ptrFCoefficient;
Meter_coeffient = *(ptrFCoefficient+1);
Density = *(ptrFCoefficient+2);
}
}
void Write_unchar_FLASH(unsigned char *Flash_ptr,unsigned char Flash_value)
{
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
*Flash_ptr = Flash_value; // Write value to flash
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void Write_float_FLASH (float *Flash_ptr,float Flash_value)
{
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
*Flash_ptr = Flash_value; // Write value to flash
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void RESET_FLASH (float *Flash_ptrA,float *Flash_ptrB)
{
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrA = 0; // Dummy write to erase Flash segment B
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<32; i++)
{
*Flash_ptrA++ = *Flash_ptrB++; // Copy value segment A to segment B
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void FLASH_CLR(float *Flash_ptr )
{
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment B
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -