本帖最后由 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引角一闪一闪地。不停闪动。
|