OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4776|回复: 2

定时器计时,写入flash出现问题

[复制链接]

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-28 14:57:10 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true][/mw_shl_code]
这是子函数
[mw_shl_code=c,true] #include"time.h" #include "flash.h" u32 run_time_ms=0; u8 run_time_ms_save[4]; u32 ADDR_RUN_TIME=0x000004; //定时器3,中断 void tim4_Timing_init( u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); TIM_TimeBaseInitStruct.TIM_Prescaler=psc; TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period=arr; TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); NVIC_InitStruct.NVIC_IRQChannel=TIM4_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x00; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x03; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); TIM_Cmd(TIM4,ENABLE); } void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) { TIM_ClearITPendingBit(TIM4,TIM_IT_Update); run_time_ms++; run_time_ms_save[0]=(u8)((run_time_ms&0x000000FF)>>0); run_time_ms_save[1]=(u8)((run_time_ms&0x0000FF00)>>8); run_time_ms_save[2]=(u8)((run_time_ms&0x00FF0000)>>16); run_time_ms_save[3]=(u8)((run_time_ms&0xFF000000)>>24); SPI_Flash_Write(run_time_ms_save,ADDR_RUN_TIME,4); } } [/mw_shl_code]
这是调用函数
[mw_shl_code=c,true]u16 arr_tim4_tim=1000-1,psc_tim4_tim=72-1; //1us计数一次 [/mw_shl_code] [mw_shl_code=c,true]tim4_Timing_init(arr_tim4_tim,psc_tim4_tim);[/mw_shl_code]
调试发现程序卡在这个语句过不去了,pBuffer=SPI2_ReadWriteByte(0XFF);
求指教


本人新人,各位多包涵!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-6-28 19:12:59 | 显示全部楼层
过不去?是指debug的时候一直停留在这里吗?
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-28 23:09:28 | 显示全部楼层
 回复【2楼】 Admin :
---------------------------------
恩,是的,应该说是一直在这里执行,已经发现问题了,定时器采集频率较高,采集得出的时间来不及存入FLASH,所以会导致这种意外。
做了如下改动后,问题解决。
[mw_shl_code=c,true]void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) { TIM_ClearITPendingBit(TIM4,TIM_IT_Update); run_time_ms++; if(run_time_ms%100==0) { run_time_ms_save[0]=(u8)((run_time_ms&0x000000FF)>>0); run_time_ms_save[1]=(u8)((run_time_ms&0x0000FF00)>>8); run_time_ms_save[2]=(u8)((run_time_ms&0x00FF0000)>>16); run_time_ms_save[3]=(u8)((run_time_ms&0xFF000000)>>24); SPI_Flash_Write(run_time_ms_save,ADDR_RUN_TIME,4); } } }[/mw_shl_code]
但是在程序的运行的过程中,又出现了主函数利用FLASH存取数据时,数据出错的现象,通过步步调试,发现主函数运行过程中,会响应定时器产生的中断,执行FLASH存储数据的命令,从而导致主函数存取FLASH时错误
所以,得出的结论就是主函数和子函数不能同时出现存取FLASH的代码!        


本人新人,各位多包涵!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 22:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表