这段时间做电子相册调试的时候出现了一下几个问题望大家一起探讨:
第一个: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,所以外部中断时不可以打断的,可能是什么原因了?
以上出现的种种怪现象,望网友们热心解答
|