主题中讨论的其他器件: MSP430FR5889
工具/软件:Code Composer Studio
我有一个为 msp430fr5889编写的工作设计、我要将其移植到 msp430fr5987、以努力为我们的所有项目实现一个 MSP430的标准化。 我对5987上的代码有问题。
我创建了自己的标志、以避开原始作者的一些复杂问题。
我已关闭优化、并且我的新标志设置为易失性。
我在计时器 A0 ISR 中设置一个标志(定时器_FLAG)。 我的代码的主循环会看到标志集一次、但再也不会看到?
extern int timer_flag;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//主循环使用定期计时器根据串行数据更新系统
//
// 调用主应用程序函数
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main (空)
{
unsigned int test;
init_System_bsp(); //初始化系统和控制器
while (1) //连续循环
{
COMM_PROCESS_Msg (comm_buff0、sys_data); //检查任何消息
TEST = SYS_TIMER[32];
// if (System_Timer_Check_Flag (TMR_0、SYS_TIMER)) //检查系统定时器0
if (timer_flag)
{
Timer_flag = 0;
Update_Sys_State_Machine (adc_rslt、comm_buff0、sys_data); //更新状态机
} //结束检查系统定期计时器
} //结束主 while (1)循环
} //结束主函数
TimerA0 ISR 设置标志(timer_flag)。 我有一个关于这一点的断点、可以看到它可以正常工作。
原始设计人员有一个用于保存计时器信息(sys_timer[])的数组、因此他可以通过一个 ISR 有效地控制16个计时器。
代码仅在其数组中设置一个条目、索引0并且工作正常。
我已经绕过它并设置我的全局 timer_flag。 一个断点确认该标志被重复设置为1。
看起来、MAN 例程没有看到 ISR 所做的任何更改?? 不是第一个????
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// System_Timer_Lib.c
//
// 创建日期:2016年4月13日
// 作者:jpogge
//
//系统计时器使用4到16个计时器的全局整数数组
//通过 System_Timers_Lib.h 中的#define TMR_NUM_TMRS 设置最后一个索引
//用作位标志
//
//索引0是计时器计数器0
//索引1是计时器计数器1
//索引2是计时器计数器2
//索引3是计时器计数器3
//|TMR_CNT_0|TMR_CNT_1||TMR_CNT_2|TMR_CNT_3|TMR_CNT_4|TMR_FGS
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include "System_Timer_Lib.h"
#include "Stream_Utility_Lib.h"
#include "bit_Lib.h"
#include "Timer_Lib.h"
volatile int timer_flag =0;
unsigned int sys_timers[TMR_REG_Sze]; //计时器数据 xxxx
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//系统定时器节拍中断
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma vector = TIMER0_A0_vector
中断空 System_Tick_IRQ (空)
{
//此处调用计时器循环
_disable_interrupt (); //禁用中断
System_Timer_Update (sys_timers);
__ENABLE_INTERRUPT (); //重新启用中断
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Timer_Update 使用 uint 16定时器结构
//
// 以节拍率递增、达到触发计数时确定的周期
//在寄存器1 TMR_FLAGS 0 - 15中设置相应的位
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
空 System_Timer_Update (unsigned int * sys_tmrs)
{
unsigned int i;
for (i = 0;i < TMR_NUM_TMRS;+i) //循环遍历每个激活的计时器
{
if (sys_tmrs[i]> 0x0000) //如果计时器大于零
{
--sys_tmrs[i]; //如果大于零则递减
}
if (sys_tmrs[i]= 0x0000) //如果零、则更新计时器过期或未使用
{
if (sys_tmrs[i + TMR_RST_IDX]) //如果有复位值计时器处于活动状态
{
System_Timer_Reset (i、sys_tmrs); //如果计数器达到零则重新加载 REST 值
// sys_tmrs[32]=1; //设置标志
// sys_timers[32]=1;
Timer_flag=1;
// System_Timer_Set_Flag (i、sys_tmrs); //设置标志
}
}
}
}