目录
一.EPIT

增强型定时器,其中,
ipg_clk为上篇配置的66MHZ时钟,ipg_clk_32k为RTC提供时钟,用不上;ipg_clk_highfred为高精度的ipg时钟。右侧为12位分频器,通过左侧选中的频率在1-4096之间选择分频因子。
中间为计数器,装入初值,每减一次与比较寄存器比较,若比较成功,ITIF置1(中断标记位),(最后记得清零),此时若ITIE为1(中断使能位),则通过与门为真,发出中断,同时,Load加载寄存器,给初值寄存器重新赋值。
OM为底板的一个引脚,可以选择性的让一个引脚电平翻转,由正点原子做的板子没有该功能,忽略即可。

表示向下计数,32位计数器,0x0000 0000--0xFFFF FFFF,适用进程调度,时间片轮转
SR寄存器

OCIF,中断标记位,写1清零
CR寄存器



RLD为配置EPIT工作模式:
Free-Running Mode:自由运行模式 从0到 0xFFFF FFFF
Set and Forget Mode:设置-遗忘模式 从加载寄存器读
LR寄存器

CMPR寄存器

void epit1_interrupt_handler(void)
{
if ((EPIT1->SR & (1 << 0)) != 0) //bit0位为中断标记位
{
led_nor();
}
EPIT1->SR |= (1 << 0);
}
void epit1_init(void)
{
EPIT1->CR = 0;
EPIT1->CR |= (1 << 24) | (1 << 17) | (65 << 4) | (1 << 3) | (1 << 2) | (1 << 1);
EPIT1->LR = 1000000;
EPIT1->CMPR = 0;
// 注册epit1中断函数
system_interrupt_register(EPIT1_IRQn, epit1_interrupt_handler);
// 设置epit1中断优先级
GIC_SetPriority(EPIT1_IRQn, 1);
// GIC使能epit1中断
GIC_EnableIRQ(EPIT1_IRQn);
// 开启EPIT1定时器
EPIT1->CR |= (1 << 0);
}
EPIT接在SOC内部,逻辑分析仪测不了,接在底板可以
消除抖动

硬件:在按键左右两边并联电容,连续变化的电平信号会被电容屏蔽。
软件:
二.GPT

输入捕获:第一次产生电平变化时保存到Timer1中,第二次保存到Timer2中,相减乘以每次计数增加的时间即为电平跳变之间的间隔时间

CR寄存器



由于该板子没有设计输入捕获和输出捕获,所以OM3和IM2设为默认值0
PR寄存器

void gpt1_init(void)
{
GPT1->CR = 0;
GPT1->CR |= (1 << 15); // 复位GPT
while ((GPT1->CR & (1 << 15)) != 0); // 等待GPT复位完成
GPT1->CR |= (1 << 9); // GPT工作模式:Free-Run模式
GPT1->CR |= (1 << 6); // 时钟源:ipg_clk
GPT1->PR = 65; // 66分频
GPT1->CR |= (1 << 0); // 使能GPT
}
实现精准延迟
分为两种情况,newcount大于或小于oldcount
void delay_us(unsigned int n)
{
unsigned int counter = 0;
unsigned int old_counter = 0;
unsigned int new_counter = 0;
old_counter = GPT1->CNT;
while (1)
{
new_counter = GPT1->CNT;
if (new_counter != old_counter)
{
if (new_counter > old_counter)
{
counter += new_counter - old_counter;
}
else
{
counter += 0xFFFFFFFF - old_counter + new_counter;
}
if (counter >= n)
{
return;
}
old_counter = new_counter;
}
}
}
void delay_ms(unsigned int n)
{
while (n--)
{
delay_us(1000);
}
}
3174



被折叠的 条评论
为什么被折叠?



