本帖最后由 zhjb1 于 2024-12-25 15:19 编辑
十、PDU——可编程延时单元 顾名思义,这是一个可以设置延时时间的触发控制模块,看来类似于TMR,单独提出来可能与TMR不太一样,本次实验做这个。 打开这个工程,只有一个文件夹,只有一个实例:\G32A1465\PDU\PDU_PeriodicInterrupt 打开main可以说一头雾水,压根找不到您想要的诸如:定时模块、时间寄存器、那些函数是用与计算定时,那些负责脉冲产生和输出,从哪里输出,如何定义,等等一头雾水——这里不是吐槽,如果想让别人学会使用这款单片机,最佳的方法是让常玩的人或说干这个行当的人可以尽快找到变成所需的函数、寄存器、控制代码、对应的IO口等等。 此实例定义了全局变量和一些局部变量,整个就几个函数: Main——主函数,PDU_CalculateIntTimerValue——按照名称应该属于PDU计算中断时间值函数,PDU0_IRQHandler——PUD0中断句柄函数。 从原main函数中可以看出,main执行一次后就休息了,余下的事情由中断函数执行,从上位机串口得到的是每1000mS打印一串字符。 因为找不到想要的结果只好采取如下步骤: 1. 将LCD的引入一边直观的看结果 2. 自己设定了三个uint32_t的全局变量:uint32_t mcuF=0,tt1=400000,tttt=0; 3. 为了在main中可以循环执行看结果主函数的while及以下的end:改成: startt: while (1){ if(tt1<40000000)tt1+=100000;else tt1=400000; PDU_CalculateIntTimerValue(&g_pduTimerConfig, PDU_TIMEOUT_US, &pduIntTimerValue); if(js>999999)js++;else js=0; dispMes();OSIF_TimeDelay(200); } end: PDU_DeInit(PDU0_INSTANCE); LED_On(LED_RED); return 0; goto startt; } |
在PDU_CalculateIntTimerValue函数的中间位置插入测试变量结果代码: CLOCK_SYS_ReadFreq(CORE_CLK, &pduClkFreq); /* Measured in microseconds tt1=400000->40000000*/ pduClkFreq /= tt1; mcuF=pduClkFreq; if(i>1){LED_On(1);i=0;}else{LED_Off(1);i++;} |
说明一下,pduClkFreq系统默认值是48000000,原算式pduClkFreq/=1000000;结果不是480,而是17850或接近的数,代码改完后回不来了。 按照我给的tt1的范围pduClkFreq除完后大约是10xxx-11xx之间变化,用示波器看负脉冲周期也没有什么变化。 其中更改过PDU_CalculateIntTimerValue的自带变量PDU_TIMEOUT_US,直接将数值从100到50000000也没有变化。 图1是串口截取数据,图2照片是示波器看的波形PMD_15——绿色LED,图3是开发板与LCD显示数据照片。 顺便说一下,里边的实验做了至少一半或更多,许多没有应用结果。如果有需要哪项测试的可以说一下,尽力而为。
|