金牌会员
- 积分
- 1343
- 金钱
- 1343
- 注册时间
- 2014-3-27
- 在线时间
- 354 小时
|
3金钱
MCU 是STM32F103CBT6 用了两个定时器3和4中断,
部分主函数:
TIM4_Int_Init(499,7199);//50MS
TIM3_Int_Init(4999,7199);//500MS
NVIC_Configuration();//定时器3优先级高于定时器4
Timersys.TIM4RespFlag=0;
while(1)
{
HEF4053_CTRL(); //固定的脉冲波形 周期为1S ,为器件驱动波形,不能更改。
//但HEF4053_CTRL()函数放在哪里都会受影响,放主函数中受代码执行时间影响,导致波形高低电平时间变化,或导致周期发生变化。
//放定时器中断内部,也会受影响,不知怎么解决。是不是有专门的系统定时器可以来做这项工作。
if(Timersys.TIM4RespFlag)//定时器4 标志位
{
//TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE );
USART3_Send_Str(PMdata, 61);//485发送 PMdata为传感器数据, 而传感器数据获取 均放置在 定时器中断3或4中了。不知是否可靠。
Timersys.TIM4RespFlag=0;
//TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
}
}
}
//定时器3中断
void TIM3_IRQHandler(void) //TIM3 溢出时间, 50MS
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
Timersys.TIM3systick++;
if(Timersys.TIM3systick>2)//
{
TransPMDatatoStr(PMdata); //传感器数据转为ASCII
Timersys.TIM3systick=0;
//return;
}
}
}
void TIM4_IRQHandler(void)
{
static float TempDOval;
uint8_t i;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //
Timersys.TIM4systick++;
if(Timersys.TIM4systick==10)
{
Timersys.TIM4systick=0;
ADS_DATA.TMdataVal=Get_DO_Average(2);//获取传感器数据
TemperatureData=DS18B20_Get_Temp();//获取传感器数据
Timersys.TIM4RespFlag=1;//标志置1
}
}
}
整个程序的流程是,主函数中HEF4053_CTRL()为器件驱动波形,
定时器4 中断内获取 传感器数据, 定时器3 把传感器数据转为ASCII, 再在主函数中发送出去。
但有时串口发送一段时间后,会中止发送。
发现程序停止在 启动文件 startup_stm32f10x_md.s的
B .//这个位置
ENDP
ALIGN
暂时没有解决,请各位大神分享经验。
|
|