打印
[Atmel]

用SAM-BA或JLINK跑ATSAM4E16的程序(12)寄存器SYSTICK

[复制链接]
743|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2015-11-16 21:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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引角一闪一闪地。不停闪动。


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6945

帖子

66

粉丝