今天来测试一下定时器,如果顺利的话吧UART也一起搞了,后面就跑个CoreMark,到时候一起来玩啊。
看了一下定时器的例子,原来ATIM是高级定时器的意思,这里就有点意思了,看了数据手册才知道,不知道该不该说是别出心裁。或者会所只有一个名字的改变。
核心板上的LED是PC13,这里的话就用PC13的LED来做定时器的指示,也好验证定时器的好坏。
首先测试了一下官网的历程,ATIM的例子竟然跑步起来,也是有点恼火啊!!!!
进过一番折腾,自己设置了启用外部时钟,并且倍频到64M,不用受内部时钟偏差的影响。好了,先来上带代码
首先是工程结构图
我们按照这个结构来建立工程,后面调用方便一点。
然后就是时钟的初始化以及定时器的初始化了,这里直接上代码,大家看看就知道怎么回事了。
#include "DRV_Timer.h"
unsigned intTimeCount=0;
void RCC_Configuration(void)
{
RCC_HSE_Enable( RCC_HSE_MODE_OSC, 8000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE);
FLASH_SetLatency(FLASH_Latency_2);
RCC_SysClk_Switch( RCC_SYSCLKSRC_HSE );
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
RCC_PLL_Enable(RCC_PLLSOURCE_HSECLK, 8000000, 8);
__RCC_FLASH_CLK_ENABLE();
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE);
FLASH_SetLatency(FLASH_Latency_3);
RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
RCC_SystemCoreClockUpdate(64000000);
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_13;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_SET);
}
void LED_CTR(void)
{
PC13_TOG();
}
void ATIM_INIT(void)
{
ATIM_InitTypeDef ATIM_InitStruct;
__RCC_ATIM_CLK_ENABLE();
__disable_irq();
NVIC_EnableIRQ(ATIM_IRQn);
__enable_irq();
ATIM_InitStruct.BufferState = ENABLE;
ATIM_InitStruct.ClockSelect = ATIM_CLOCK_PCLK;
ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_MODE_EDGE_ALIGN;
ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;
ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;
ATIM_InitStruct.OverFlowMask = DISABLE;
ATIM_InitStruct.Prescaler = ATIM_Prescaler_DIV64;
ATIM_InitStruct.ReloadValue = 999;
ATIM_InitStruct.RepetitionCounter = 0;
ATIM_InitStruct.UnderFlowMask = DISABLE;
ATIM_Init(&ATIM_InitStruct);
ATIM_ITConfig(ATIM_CR_IT_OVE, ENABLE);
ATIM_Cmd(ENABLE);
}
void ATIM_IRQHandler(void)
{
if (ATIM_GetITStatus(ATIM_IT_OVF))
{
ATIM_ClearITPendingBit(ATIM_IT_OVF);
intTimeCount++;
if(intTimeCount==1000)
{
intTimeCount=0;
LED_CTR();
}
}
}
这里设置的系统时钟是PLL到64MHz的,然后ATIM是设置的64分频,到1MHz的,然后设置重载为999,既设置重载周期为1ms,在中断函数中使用PC13作为LED的输出做指示,1s做一次翻转,还算是对代码的一个响应。
好了,最后上一个视屏,闪灯嘛,必须要眼见为实。
有点晚了,空了更新UART的设置,后面再做CoreMark的移植吧。
TIME
|