基于CCS工程MSP430串口升级(二)

一、前文

第一次接触MSP430的芯片,第一次使用CCS开发环境,花了将近一个星期的时间,才把MSP430串口升级做出来。

同样分成BOOT(引导程序)、APP(主程序)、上位机(PC端工具),三个部分来讲解。

本博文是APP(主程序)相关讲解。

基于CCS工程MSP430串口升级(一)

基于CCS工程MSP430串口升级(三)

二、APP程序起始地址

  • 在lnk_msp430fg479.cmd中修改APP Flash地址。
    • FLASH改成0x1200(为啥不是0x1100呢,为了保证是512的整数,方便Flash写入)
    • 中断向量往前挪
    • 增加一个参数块,用来存放软件版本号(10字节)
    • INFOA中存放系统配置信息
MEMORY
{
    SFR                     : origin = 0x0000, length = 0x0010
    PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0
    PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100
    RAM                     : origin = 0x0200, length = 0x0800
    INFOA                   : origin = 0x10C0, length = 0x0040
    INFOB                   : origin = 0x1080, length = 0x0040
    INFOC                   : origin = 0x1040, length = 0x0040
    INFOD                   : origin = 0x1000, length = 0x0040
    //FLASH                   : origin = 0x1100, length = 0xEEE0
    FLASH                   : origin = 0x1200, length = 0xDDD0
    PARAM					: origin = 0xEFD0, length = 0x0010
    INT00                   : origin = 0xEFE0, length = 0x0002
    INT01                   : origin = 0xEFE2, length = 0x0002
    INT02                   : origin = 0xEFE4, length = 0x0002
    INT03                   : origin = 0xEFE6, length = 0x0002
    INT04                   : origin = 0xEFE8, length = 0x0002
    INT05                   : origin = 0xEFEA, length = 0x0002
    INT06                   : origin = 0xEFEC, length = 0x0002
    INT07                   : origin = 0xEFEE, length = 0x0002
    INT08                   : origin = 0xEFF0, length = 0x0002
    INT09                   : origin = 0xEFF2, length = 0x0002
    INT10                   : origin = 0xEFF4, length = 0x0002
    INT11                   : origin = 0xEFF6, length = 0x0002
    INT12                   : origin = 0xEFF8, length = 0x0002
    INT13                   : origin = 0xEFFA, length = 0x0002
    INT14                   : origin = 0xEFFC, length = 0x0002
    RESET                   : origin = 0xEFFE, length = 0x0002
/*    INT00                   : origin = 0xFFE0, length = 0x0002
    INT01                   : origin = 0xFFE2, length = 0x0002
    INT02                   : origin = 0xFFE4, length = 0x0002
    INT03                   : origin = 0xFFE6, length = 0x0002
    INT04                   : origin = 0xFFE8, length = 0x0002
    INT05                   : origin = 0xFFEA, length = 0x0002
    INT06                   : origin = 0xFFEC, length = 0x0002
    INT07                   : origin = 0xFFEE, length = 0x0002
    INT08                   : origin = 0xFFF0, length = 0x0002
    INT09                   : origin = 0xFFF2, length = 0x0002
    INT10                   : origin = 0xFFF4, length = 0x0002
    INT11                   : origin = 0xFFF6, length = 0x0002
    INT12                   : origin = 0xFFF8, length = 0x0002
    INT13                   : origin = 0xFFFA, length = 0x0002
    INT14                   : origin = 0xFFFC, length = 0x0002
    RESET                   : origin = 0xFFFE, length = 0x0002*/
}


SECTIONS
{
    .bss        : {} > RAM                  /* Global & static vars              */
    .data       : {} > RAM                  /* Global & static vars              */
    .TI.noinit  : {} > RAM                  /* For #pragma noinit                */
    .sysmem     : {} > RAM                  /* Dynamic memory allocation area    */
    .stack      : {} > RAM (HIGH)           /* Software system stack             */

    .text       : {} > FLASH                /* Code                              */
    .cinit      : {} > FLASH                /* Initialization tables             */
    .const      : {} > FLASH                /* Constant data                     */
    .cio        : {} > RAM                  /* C I/O Buffer                      */

    .pinit      : {} > FLASH                /* C++ Constructor tables            */
    .binit      : {} > FLASH                /* Boot-time Initialization tables   */
    .init_array : {} > FLASH                /* C++ Constructor tables            */
    .mspabi.exidx : {} > FLASH              /* C++ Constructor tables            */
    .mspabi.extab : {} > FLASH              /* C++ Constructor tables            */
#ifdef __TI_COMPILER_VERSION__
  #if __TI_COMPILER_VERSION__ >= 15009000
    #ifndef __LARGE_DATA_MODEL__
    .TI.ramfunc : {} load=FLASH, run=RAM, table(BINIT)
    #else
    .TI.ramfunc : {} load=FLASH | FLASH2, run=RAM, table(BINIT)
    #endif
  #endif
#endif

    .infoA     : {} > INFOA              /* MSP430 INFO FLASH Memory segments */
    .infoB     : {} > INFOB
    .infoC     : {} > INFOC
    .infoD     : {} > INFOD
    .param     : {} > PARAM

    /* MSP430 Interrupt vectors          */
    BASICTIMER   : { * ( .int00 ) } > INT00 type = VECT_INIT
    PORT2        : { * ( .int01 ) } > INT01 type = VECT_INIT
    .int02       : {}               > INT02
    DAC12_DMA    : { * ( .int03 ) } > INT03 type = VECT_INIT
    PORT1        : { * ( .int04 ) } > INT04 type = VECT_INIT
    TIMERA1      : { * ( .int05 ) } > INT05 type = VECT_INIT
    TIMERA0      : { * ( .int06 ) } > INT06 type = VECT_INIT
    SD16A        : { * ( .int07 ) } > INT07 type = VECT_INIT
    USCIAB0TX    : { * ( .int08 ) } > INT08 type = VECT_INIT
    USCIAB0RX    : { * ( .int09 ) } > INT09 type = VECT_INIT
    WDT          : { * ( .int10 ) } > INT10 type = VECT_INIT
    COMPARATORA   : { * ( .int11 ) } > INT11 type = VECT_INIT
    TIMERB1      : { * ( .int12 ) } > INT12 type = VECT_INIT
    TIMERB0      : { * ( .int13 ) } > INT13 type = VECT_INIT
    NMI          : { * ( .int14 ) } > INT14 type = VECT_INIT
    .reset       : {}               > RESET  /* MSP430 Reset vector         */
}
#pragma DATA_SECTION (projectVersion,".param")
const char projectVersion[0x10] = "AquaDO V2.0";

三、Flash读写

  • 读写系统配置信息,存放在INFOA 0x1000地址中,该地址64字节,整块擦除和写入

sys.h

/*
 * sys.h
 *
 *  Created on: 2018年11月30日
 *      Author: weijian
 */

#ifndef SYS_H_
#define SYS_H_

#include "util.h"


typedef struct
{
	u16   isApp;
	u16   modbusAddr;
	char  devSN[0x10];
	float a, b, c, t_k, t_b, t_0;
}SYS_SETTING;

extern SYS_SETTING sys_setting; 

void sys_clk_init(void);
void sys_setting_load(void);
void sys_setting_save(void);

void FLASH_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);
void FLASH_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead);
 

#endif /* SYS_H_ */

sys.c

/*
 * sys.c
 *
 *  Created on: 2018年11月30日
 *      Author: weijian
 */
#include <msp430.h>
#include <math.h>
#include "sys.h"
#include "cmd.h"

SYS_SETTING sys_setting;

void sys_clk_init(void)
{
	volatile unsigned int i;

	WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

	SCFI0 |= FN_8;                            // x2 DCO freq, 8MHz nominal DCO
	SCFQCTL = SCFQ_4M;                        // (127+1) x 32768 x 2 = 7.99 Mhz
	FLL_CTL0 |= DCOPLUS + XCAP18PF;           // DCO+ set so freq= xtal x D x N+1

	do
	{
		IFG1 &= ~OFIFG;                         // Clear OSCFault flag
		for (i = 0x47FF; i > 0; i--);           // Time for flag to set
	}
	while ((IFG1 & OFIFG));                   // OSCFault flag still set?

	sys_setting_load();
}

void sys_setting_load(void)
{
	u8 is_save = 0;

	FLASH_Read(0x1000,(u8 *)(&sys_setting),sizeof(sys_setting));

	if(isnan(sys_setting.a))
	{
		sys_setting.a = 1;
		is_save = 1;
	}

	if(isnan(sys_setting.b))
	{
		sys_setting.b =  1;
		is_save = 1;
	}

	if(isnan(sys_setting.c))
	{
		sys_setting.c = 0;
		is_save = 1;
	}

	if(isnan(sys_setting.t_k))
	{
		sys_setting.t_k = 1;
		is_save = 1;
	}

	if(isnan(sys_setting.t_b))
	{
		sys_setting.t_b = 0;
		is_save = 1;
	}

	if(isnan(sys_setting.t_0))
	{
		sys_setting.t_0 = 25;
		is_save = 1;
	}

	if(sys_setting.modbusAddr==0xffff)
	{
		sys_setting.modbusAddr = 2;
		is_save = 1;
	}

	if(is_save)
		sys_setting_save();
}

void sys_setting_save(void)
{
	FLASH_Write(0x1000,(u8 *)(&sys_setting),sizeof(sys_setting));
}

void FLASH_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
	char *Flash_ptr;                          // Flash pointer
	unsigned int i;

	Flash_ptr = (char *)WriteAddr;            // Initialize Flash pointer
	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 < NumToWrite; i++)
	{
	  *Flash_ptr++ = pBuffer[i];                   // Write value to flash
	}

	FCTL1 = FWKEY;                            // Clear WRT bit
	FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

void FLASH_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
	char *Flash_ptr;
	u32 i;
	Flash_ptr = (char *)ReadAddr;            // Initialize Flash pointer

	for(i=0; i<NumToRead; i++)
		pBuffer[i] = *Flash_ptr++;
}


四、输出Hex文件

  • 输出hex文件
    在这里插入图片描述

在这里插入图片描述

五、Hex转Bin文件

  • hex转bin文件

hex2bin工具

下载hex2bin.exe,将hex拖动到exe上,就会在hex2bin.exe的文件夹上生成一个bin文件,文件名与hex文件名相同

六、其他

基于CCS工程MSP430串口升级(一)

基于CCS工程MSP430串口升级(二)

基于CCS工程MSP430串口升级(三)

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个MSP430串口通信UART的代码示例,包括CCS (Code Composer Studio)工程设置和配置。 首先,确保你已经安装了CCS设置好了MSP430开发环境。 在CCS中创建一个新工程,选择MSP430微控制器系列和型号。然后选择合适的文件夹和工程名。 在工程资源视图中,右键点击"Source Files"文件夹,选择"New" -> "Source File",输入文件名并点击"Finish"。 在新创建的源文件中,输入以下代码: ```c #include <msp430.h> void uart_init() { // 设置串口波特率 UCA0BR0 = 6; UCA0BR1 = 0; UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // 使能串口接收和发送 UCA0CTL1 &= ~UCSWRST; UCA0IE |= UCRXIE; } void uart_send_byte(uint8_t data) { // 等待上一次发送完成 while (!(UCA0IFG & UCTXIFG)); // 发送数据 UCA0TXBUF = data; } int main(void) { // 停用看门狗定时器 WDTCTL = WDTPW + WDTHOLD; // 配置P1.1和P1.2为UART模式 P1SEL |= BIT1 + BIT2; P1SEL2 |= BIT1 + BIT2; // 初始化串口 uart_init(); while(1) { // 通过串口发送数据 uart_send_byte(0x55); // 延时一段时间 __delay_cycles(1000000); } } ``` 这段代码首先定义了使用的函数:`uart_init()`用于初始化串口,`uart_send_byte()`用于发送一个字节的数据。 在`main()`函数中,首先停用看门狗定时器,然后将P1.1和P1.2配置为UART模式。接下来初始化串口,并在一个无限循环中通过串口发送数据0x55,并延时1秒。 确保你的MSP430开发板正确连接,在CCS中点击菜单中的"Build"编译代码。 然后点击"Debug"按钮或按F11进行调试。调试成功后,你可以通过串口助手或者其他串口工具,连接到MSP430开发板的串口端口,就可以接收到发送的数据了。 希望这个代码示例能够帮助你进行MSP430串口通信的开发!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值