|
【新驱动力科技MM32F031C6开发板评测】ADC&定时器中断&独立看门狗
[复制链接]
在ARM的单片机中,都会带有ADC接口、定时器和独立看门狗三大常用外设,这三种外设在实际的产品项目中非常常用,ADC接口主要连接各种电压反馈信号的传感器,独立看门狗主要用于防止设备跑飞和假死,因为独立看门狗是用ARM内部独立的看门狗时钟的,独立看门狗的时钟一旦被寄存器开启了,除了复位以外没有别的办法可以让它停下来,所以CPU是否跑飞、死机、死循环都不会影响到独立看门狗工作。而定时器中断则主要是执行一些对时间间隔要求非常严格的工作,比如给看门狗喂狗,喂狗间隔一旦超出看门狗计数器溢出的时间系统就会马上复位,所以需要定时器中断来保证每次喂狗的时间间隔都在严格控制的范围内,如果CPU跑飞,定时器中断无法及时响应,则看门狗计数器溢出,系统复位。
这个帖子我用MM32FC103的ADC接口连接常用的光照传感器,电压值与光照强度呈正相关线性关系,光照强度越强,传感器返回的电压值越高。由于之前我用MM32板子连接了一个液晶屏,所以可以将光照强度以百分比形式显示出来。
然后是关于定时器中断和独立看门狗的,这里我使用的定时器为官方例程里面用的TIM2, 不过做了一些改动。官方的配置如下:
TIM2_Init(48000000/100000-1,99);
void TIM2_Init(int Prescaler,int Period)
{
TIM_TimeBaseInitTypeDef TIM_StructInit;
NVIC_InitTypeDef NVIC_StructInit;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_StructInit.TIM_Period=Period;
TIM_StructInit.TIM_Prescaler=Prescaler;
TIM_StructInit.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_StructInit.TIM_CounterMode=TIM_CounterMode_Up;
TIM_StructInit.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2, &TIM_StructInit);
NVIC_StructInit.NVIC_IRQChannel=TIM2_IRQn;
NVIC_StructInit.NVIC_IRQChannelPriority=1;
NVIC_StructInit.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_StructInit);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
/*必须手动清除中断标志位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/*全局标志*/
ucTim2Flag++;
}
设置的分频值较大,计数值很小,只有99,也就是说,官方的定时器中断是非常频繁触发的,基本上一秒触发几百次中断,这样对CPU的负担很大,于是我就改成
TIM2_Init(48000000/1000-1,499);
这样的话,就是500毫秒即0.5秒进一次中断服务函数,再在中断里面喂狗:
void TIM2_IRQHandler()
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
IWDG->KR = 0xAAAA;
SPI_LCD_Show_String(192,32,"已喂狗",0,0x07ff,ZF32_NORMAL);
}
看门狗的配置为
IWDG_Init(IWDG_Prescaler_32,0xff);
32分频,255计数值,也就是大概1秒溢出一次,而我设置0.5秒喂一次狗,就不会导致溢出。
看看效果:
上传代码:
MM32F031C6T6.zip
(140.99 KB, 下载次数: 6)
在之前的工程中没有上传开发环境截图和下载代码成功的截图,现在补上:
那么现在完成的任务就有4.5个了,还差一个PWM的任务,会在下一帖中完成
此内容由EEWORLD论坛网友donatello1996原创,如需转载或用于商业用途需征得作者同意并注明出处
,手册勘误任务和建议任务我已经在新驱动力和MM32的官方群中跟他们的技术人员讨论过了,也在下一帖中贴出来:
|
|