今天来测试一下定时器,如果顺利的话吧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); //频率大于24M需要配置FlashWait=2
RCC_SysClk_Switch( RCC_SYSCLKSRC_HSE );
/* 1. 设置HCLK和PCLK的分频系数 */
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
/* 2. 使能PLL,通过PLL倍频到64MHz */
RCC_PLL_Enable(RCC_PLLSOURCE_HSECLK, 8000000, 8); // 设置使用外部时钟-并且倍频到64MHz
__RCC_FLASH_CLK_ENABLE();
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE); //打开FLASH时钟
FLASH_SetLatency(FLASH_Latency_3);
/* 3. 时钟切换到PLL */
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; //LED
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_13; // LED4
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; //选择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; // 64分频,1MHZ
ATIM_InitStruct.ReloadValue = 999; // 重载周期 1ms TIMER
ATIM_InitStruct.RepetitionCounter = 0; // 重复周期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的移植吧。
更多回帖