OpenEdv-开源电子网

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

我遇到了定时器中断影响了串口接收的数据,失真了,该怎么办

[复制链接]

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
发表于 2014-8-22 00:02:26 | 显示全部楼层 |阅读模式
5金钱
我遇到了定时器中断影响了串口接收的数据,失真了,该怎么办

成功
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-22 00:47:24 | 显示全部楼层
不知道失真是指?
数据丢失?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-22 00:57:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
本来第七位是0x37 可是开了定时器2中断后,第七位有时是0x37 有时不是0x37
成功
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-22 10:56:01 | 显示全部楼层
这是正常的啊,原子哥的系统文件里面把串口接收的中断优先级设置为了最低级。要是你定时器的中断抢占优先级高于3的话,而中断时间又比较长就会打断接收中断,导致部分数据不能及时读取出来产生丢失。
要是接收数据很重要的话就把它的优先级设高点。
回复

使用道具 举报

9

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2014-8-14
在线时间
2 小时
发表于 2014-8-22 11:15:11 | 显示全部楼层
回复【4楼】STM32VBT6:
---------------------------------
正解~!优先级问题~!
No do no see...Why not try?
回复

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-22 11:17:01 | 显示全部楼层
回复【4楼】STM32VBT6:
---------------------------------
回复【4楼】STM32VBT6:
---------------------------------
MY_NVIC_Init(1,3,USART1_IRQChannel,2);//串口中断的优先级
MY_NVIC_Init(3,1,TIM2_IRQChannel,3);//定时器中断的优先级
我是设置成这样的但是还是有问题
成功
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-22 11:20:35 | 显示全部楼层
你的参数里面哪个是抢占优先级?前面的还是后面的?
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-22 11:21:10 | 显示全部楼层
把MY_NVIC_Init函数体贴出来
回复

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-22 11:30:22 | 显示全部楼层
回复【8楼】STM32VBT6:
---------------------------------
//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组 
//CHECK OK
//091209
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)  

u32 temp,temp1;   
temp1=(~NVIC_Group)&0x07;//取后三位
temp1<<=8;
temp=SCB->AIRCR;  //读取先前的设置
temp&=0X0000F8FF; //清空先前分组
temp|=0X05FA0000; //写入钥匙
temp|=temp1;    
SCB->AIRCR=temp;  //设置分组            
}
//设置NVIC 
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority    :响应优先级
//NVIC_Channel        :中断编号
//NVIC_Group          :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
//CHECK OK
//100329
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)  

u32 temp;
u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址 
u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group);   
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位

if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
else NVIC->ISER[1]|=1<<(NVIC_Channel-32);    
NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级               
}>
成功
回复

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
 楼主| 发表于 2014-8-22 11:31:23 | 显示全部楼层
---------------------------------
回复【8楼】STM32VBT6:
---------------------------------
就是原子的例程
成功
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-22 12:42:43 | 显示全部楼层
MY_NVIC_Init(1,3,USART1_IRQChannel,2);//串口中断的优先级 
MY_NVIC_Init(3,1,TIM2_IRQChannel,3);//定时器中断的优先级
优先级分组只能分一次,为嘛设置为2位后又设置成3位?
MY_NVIC_Init这个函数干嘛要搞个最后的分组参数呢》?优先级分组只要调用一次,单独做个函数。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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