OpenEdv-开源电子网

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

Timer6和外部中断出现了几个问题望大家共同探讨

[复制链接]

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-5-27
在线时间
6 小时
发表于 2014-9-9 15:22:12 | 显示全部楼层 |阅读模式

这段时间做电子相册调试的时候出现了一下几个问题望大家一起探讨:

第一个:timer6定时器定时时间的计算

我的立意是定时1个10s的定时器,但是按照t=72MHZ/36000/2000=1s,所以我下面的程序不是定时的是1s吗?但是却定时了10s的定时器,不解啊不解

[mw_shl_code=c,true] void Timer6_Init(void) { RCC->APB1ENR|=1<<4;/*????Timer6???±??*/ TIM6->SC=36000-1; //?¤·??? TIM6->ARR=2000-1; //?¤×°?? TIM6->DIER=1<<0; TIM6->SR&=~(1<<0);/*????×???±ê???????÷*/ TIM6->CR1|=0x0081; } [/mw_shl_code]


第二个问题是外部中断的问题:

这个是我中断函数的配置:

[mw_shl_code=c,true]void GPIO_EXTI_Config(u8 GPIOx , u8 BITx , u8 TRIM) { u8 addr,offset; addr=BITx/4; offset=(BITx%4)*4; AFIO->EXTICR[addr]&=~(0x000F<<offset);/*?????­?????è??*/ AFIO->EXTICR[addr]|=GPIOx<<offset; EXTI->IMR|=1<<BITx;/*??·????????ó*/ //EXTI->EMR|=1<<BITx;/*??·????????ó,??±???·¨?????í??·???,??????????*/ if(TRIM&0x01)EXTI->FTSR|=1<<BITx;/*????????·?*/ if(TRIM&0x02)EXTI->RTSR|=1<<BITx;/*????????·?*/ }[/mw_shl_code]


[mw_shl_code=c,true]void NVIC_Config(void) { /* ?¨??NVIC???????á???? NVIC_InitStructure */ NVIC_InitTypeDef NVIC_InitStructure; /* #ifdef...#else...#endif?á????×÷?????ù???¤±à?????????¨?????ò??±í???????·*/ #ifdef VECT_TAB_RAM /* ?????ò??±í???????·?? 0x20000000 ???? */ NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0); #else /* VECT_TAB_FLASH */ /* ?????ò??±í???????·?? 0x80000000 ???? */ NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0); #endif /* ????NVIC??????·?×é2 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* ????EXIT 0?¨?? ??2???????????? ??0???????????? */ NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//????????×????ó,?????????? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* ????TIM6?????¨?? ??2???????????? ??0???????????? */ NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//????????×????ó,?????????? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }[/mw_shl_code]


[mw_shl_code=c,true]static void GPIO_EXIT_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC->APB2ENR |= 0x00000001;/*?????????±??*/ RCC->APB2ENR |= 0x00001000;/*????GPIOC???±??*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; GPIO_Init(GPIOC , &GPIO_InitStructure); } void Interrupt_Init(void) { GPIO_EXIT_Init(); /*?ò??GPIOC10--GPIO11??????*/ GPIO_EXTI_Config(2 , 10 , 2); GPIO_EXTI_Config(2 , 11 , 2); NVIC_Config(); }[/mw_shl_code]

最主要的是void Interrupt_Init(void)是对中断和GPIO的配置

下面是我的中断服务函数:

请看第一段代码:

[mw_shl_code=c,true]void EXTI15_10_IRQHandler(void) { if((EXTI->R)&(0x01<<10)) { if(GPIOC->IDR&GPIO_Pin_10) { printf("%d\r\n",__LINE__); Key_A++; } } else { printf("%d\r\n",__LINE__); Key_B++; } EXTI->R = EXTI_Line10; EXTI->R = EXTI_Line11; } [/mw_shl_code]

因为PC10没接电容,所以稀里糊涂用了这句代码消抖:if(GPIOC->IDR&GPIO_Pin_10),但是理论上是消不了抖的,却完成消抖了,原子哥我是不是发现新大陆了

第二是我刚开始用的习惯是的消抖方法:

[mw_shl_code=c,true]void EXTI15_10_IRQHandler(void) { if((EXTI->R)&(0x01<<10)) { Delay_Ms(100); if(GPIOC->IDR&GPIO_Pin_10) { Delay_Ms(100); printf("%d\r\n",__LINE__); Key_A++; } }[/mw_shl_code]

由于Delay_Ms()是通过Systick中断定时的,不知道为什么已进入中断就卡死在Delay_Ms()那儿,而我的NVIC_Config没有对systick的优先级进行配置,但是DATASHEET显示的是SYSTICK的优先级为-1,所以外部中断时不可以打断的,可能是什么原因了?


以上出现的种种怪现象,望网友们热心解答

原子哥在哪儿我就在哪儿
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
发表于 2014-9-9 16:09:27 | 显示全部楼层
我了个去.你这注释一个个都是X文 怎么看
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-9 22:17:03 | 显示全部楼层
1,没问题,是定时1秒才对。如果有问题,请检查时钟。
2,加多一个判断而已,可以消除很高频的抖动,这取决于你按键的波形了。
3,Delay_Ms如果是中断的方式实现的,那就一定不可以在中断里面调用,否则就是你这个效果了。
systick的中断优先级,默认是很低的,低于一切外部中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-5-27
在线时间
6 小时
 楼主| 发表于 2014-9-10 15:59:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,对于你说的第一个回答:
定时1s的程序要我检查时钟,我用的是V3.5的库,这个不是系统默认使用的是HSE吗?我用的外部晶振为12MHZ,所以我将这几处修改为了:  

1)在system32_stm32f10x.c文件中的void SetSysClockTo72(void)里这样改:
8M:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72
12M:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);//12*6=72

2)stm32f10x.h中修改:
8M:
#define HSE_Value ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ 
12M:
#define HSE_Value ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */NVIC_SetPriority(SysTick_IRQn, n); 
其他地方也没改动什么东西,

对于你的第二个回答:
我不知道这个判断的依据为何如你所说的消除高频抖动:这个端口输入数据寄存器(GPIOx_IDR) (x=A..E),到底在按键按下时是什么值了?按键松开又是什么值了?我的按键按下时上拉电阻对地的,所以感觉是稀里糊涂的消抖了

对于你说的第三个问题:我的systick配置如下:
static void Delay_Init(void)
{
/*
1000---1ms
1000000-1us
*/
if(SysTick_Config(SystemCoreClock / 1000))/*?????????±??*/
{
        while(1);
}
}

void Delay_Ms(u16 cnt)
{
    TimeDly=cnt;
    while(TimeDly);
}
你说systick中断默认是低于一切外部中断的,所以我修改为了:
static void Delay_Init(void)
{
/*
1000---1ms
1000000-1us
*/
if(SysTick_Config(SystemCoreClock / 1000))/*?????????±??*/
{
        while(1);
}
NVIC_SetPriority(SysTick_IRQn, n); 
}
原子哥在哪儿我就在哪儿
回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-5-27
在线时间
6 小时
 楼主| 发表于 2014-9-10 16:00:21 | 显示全部楼层
回复【4楼】笨鸟先飞吧:
---------------------------------
接上面的:NVIC_SetPriority(SysTick_IRQn, 0);
但是还是定时感觉差距好大
原子哥在哪儿我就在哪儿
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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