本帖最后由 ddllxxrr 于 2015-11-17 12:00 编辑
SYSTICk是属于系统级的,做下了内核当中,同ARM公司提的的核一起走。
它的工作方式是,系统自动从寄存器中减数,然后可以产生中断。
以下是寄存器的程序:
/*[头文件]*/
#include <sam.h>
/* 毫秒计数器*/
static volatile uint32_t ms_tick = 0;
/*[中断处理程序]*/
void SysTick_Handler()
{
++ms_tick;
}
/*[子程序]*/
/*延迟*/
void Delay(int ms)
{
uint32_t end_count = ms_tick + ms;
while (ms_tick < end_count);
}
// 配置SysTick,使其每1ms产生一次中断
void ConfigSysTick()
{
// SysTick 的重载值和当前值在芯片重置时都是未定义的
// 设置重载值,使其每1ms产生一次中断
const uint32_t reload_v = CHIP_FREQ_MAINCK_RC_4MHZ / 1000;
SysTick->LOAD = reload_v & SysTick_LOAD_RELOAD_Msk - 1;
// 清空当前值
SysTick->VAL = 0;
// 配置
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk // 选择时钟源为处理器时钟
| SysTick_CTRL_TICKINT_Msk // 计数器递减至0时产生中断
| SysTick_CTRL_ENABLE_Msk; // 使能SysTick
// 在NVIC中使能中断
NVIC_ClearPendingIRQ(SysTick_IRQn);
NVIC_EnableIRQ(SysTick_IRQn);
}
/*[主程序]*/
int main (void)
{
/* 让PIO控制器直接控制PA0引脚 PIO 使能 */
PIOA->PIO_PER = (uint32_t)0x01;
/* PIO 输出使能 */
PIOA->PIO_OER = (uint32_t)0x01;
/* PIO 输出写使能 */
PIOA->PIO_OWER = (uint32_t)0x01;
ConfigSysTick();
while (1) {
//切换led灯对应的管脚电平
Delay(500);
/* 设置PA0引脚为高电平,灯灭 */
PIOA->PIO_SODR = (uint32_t)0x01;
Delay(500);
/* 设置PA0引脚为高电平,灯亮 */
PIOA->PIO_CODR = (uint32_t)0x01;
}
return 0;
}
运结果是PA0引角一闪一闪地。不停闪动。
|