了解开发板硬件和例程后,来学习和测试下板卡滴答定时器,使用滴答定时器来做延时程序,通过LED指示灯来看运行情况。
一、硬件电路
开发板上有3路LED指示灯,LED电路图如下
对应核心板的驱动端口是P0.6、P0.7和P0.3。
二、程序部分
在编写测试程序之前,先来了解下LKS32MC08x的时钟部分。
2.1、主时钟
主时钟是内部的4MHzRC电路经PLL后产生96MHz的主频,在经过n/8分频后,得到MCLK时钟,也就是外设需要的始终。下面是时钟框图。
程序中有关时钟配置的程序,配置主频输出96MHz。
2.2、systick定时器
手册上有关systick定时器介绍,它使用主时钟做信号输入源。
2.3、delay.c
使用systick定时器延时函数
#include "delay.h"
#include "lks32mc08x.h"
static u8 fac_us=0;
static u16 fac_ms=0;
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
void delay_init(void)
{
uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SystemCoreClock/8000000;
fac_ms=(u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us;
SysTick->VAL=0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
2.4、led.c #include "hardware_config.h"
void init_led(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
//ÅäÖÃLED1£ºP0.6
GPIO_StructInit(&GPIO_InitStruct); //³õʼ»¯½á¹¹Ìå
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIO0, &GPIO_InitStruct);
//ÅäÖÃLED2£ºP0.7
GPIO_StructInit(&GPIO_InitStruct); //³õʼ»¯½á¹¹Ìå
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIO0, &GPIO_InitStruct);
//ÅäÖÃLED3: P0.3
GPIO_StructInit(&GPIO_InitStruct); //³õʼ»¯½á¹¹Ìå
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIO0, &GPIO_InitStruct);
}
2.5、led.h
#ifndef __LED_H__
#define __LED_H__
#define led1_on() GPIO_SetBits(GPIO0, GPIO_Pin_6)
#define led1_off() GPIO_ResetBits(GPIO0, GPIO_Pin_6)
#define led2_on() GPIO_SetBits(GPIO0, GPIO_Pin_7)
#define led2_off() GPIO_ResetBits(GPIO0, GPIO_Pin_7)
#define led3_on() GPIO_ResetBits(GPIO0, GPIO_Pin_3)
#define led3_off() GPIO_SetBits(GPIO0, GPIO_Pin_3)
void init_led(void);
#endif
2.6、main.c
*******************************************************************************/
int main(void)
{
u8 key = 0;
Hardware_init(); /* Ó²¼þ³õʼ»¯*/
delay_init();
init_led();
while (1)
{
led1_on();
led2_off();
led3_on();
delay_ms(100);
led1_off();
led2_on();
led3_off();
delay_ms(100);
}
}
三、程序运行
LED灯交替闪烁
|