芯源半导体CW32
直播中

申小林

12年用户 364经验值
擅长:可编程逻辑 EMC/EMI设计 处理器/DSP 控制/MCU EMC/MEI设计
私信 关注
[经验]

【CW32饭盒派开发板试用体验】-04-定时器

今天来测试一下定时器,如果顺利的话吧UART也一起搞了,后面就跑个CoreMark,到时候一起来玩啊。
看了一下定时器的例子,原来ATIM是高级定时器的意思,这里就有点意思了,看了数据手册才知道,不知道该不该说是别出心裁。或者会所只有一个名字的改变。
核心板上的LED是PC13,这里的话就用PC13的LED来做定时器的指示,也好验证定时器的好坏。
首先测试了一下官网的历程,ATIM的例子竟然跑步起来,也是有点恼火啊!!!!
进过一番折腾,自己设置了启用外部时钟,并且倍频到64M,不用受内部时钟偏差的影响。好了,先来上带代码
首先是工程结构图
image.png

我们按照这个结构来建立工程,后面调用方便一点。
然后就是时钟的初始化以及定时器的初始化了,这里直接上代码,大家看看就知道怎么回事了。

#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的移植吧。

TIME

更多回帖

发帖
×
20
完善资料,
赚取积分