本帖最后由 lisingch 于 2022-3-20 17:12 编辑
本次实验为利用定时器产生100ms计时中断控制板载LED4产生亮、灭变化。同时利用逻辑分析仪对这一中断电平变化进行捕捉验证。
一、知识准备
本次实验使用了TMR3,这是一个通用型的16位精度定时器。所谓定时器无非就是对脉冲进行计数操作,关键的参数就是脉冲的频率。
从上面描述中可以看出TMR3的计数时钟可使用内部CK_INT时钟,但在手册中没有查到关于“CK_INT”的更多说明。
在上图中可以看到“TMR_CLK”,这个有来路
另外,通过分析“system_clock_config()”可以得知系统时钟来自外部晶振被12倍“PLL”了,即fTMR_CLK = 8MHz * 12 = 96MHz。后面的实验中按此数据计算TMR3的配置数据。在TMR3配置中有个“void tmr_base_init(tmr_type* tmr_x, uint32_t tmr_pr, uint32_t tmr_div)”函数,其中参数“tmr_pr”、“tmr_div”的内容对应“TMRx_PR”与“TMRx_DIV”两个寄存器。
“tmr_div”决定TMR3计数脉冲频率:CK_INT = TMR_CLK / tmr_div;
“tmr_pr”决定TMR3计数个数(中断溢出时间):中断溢出时间 = CK_INT * tmr_pr
二、程序实现
TMR3配置:
void TMR_Config(void)
{
crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
/*
系统时钟=96MHz
CK_INT = 系统时钟/TMR_DIV = 96MHz/9600 = 10000 = 1MHz = 0.0001s
溢出中断时间 = CK_INT*TMR_PR = 0.0001s * TMR_PR = 0.0001s * 1000 = 0.1s =100ms
*/
tmr_base_init(TMR3, TMR_PR-1, TMR_DIV-1);
tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);//向上计数
tmr_interrupt_enable(TMR3, TMR_OVF_INT, TRUE);//使能TMR3溢出中断
nvic_priority_group_config(NVIC_PRIORITY_GROUP_0);
nvic_irq_enable(TMR3_GLOBAL_IRQn, 0, 0);
tmr_counter_enable(TMR3, TRUE);
}
TMR3中断溢出100ms处理:
void TMR3_GLOBAL_IRQHandler(void)
{
if(tmr_flag_get(TMR3, TMR_OVF_FLAG) != RESET)
{
at32_led_toggle(LED4);
tmr_flag_clear(TMR3, TMR_OVF_FLAG);
}
}
三、实验结果
TMR.rar
(286.4 KB)
|
@mxkw0514 :就是某宝上最便宜的那种。
这种逻辑分析仪是以上位机显示波形的吗?