实验四 时钟中断和1路脉冲输出-多路输入检测
时间:10-02
整理:3721RD
点击:
【NUCLEO-F412ZG试用体验】实验四 时钟中断和1路脉冲输出-多路输入检测
实验内容如题。
首先完成时钟中断功能,將程序计数器js由时钟中断完成
打开Ticker.h文档,参考其中的案例代码,现在main.cpp前边定义一个时钟对象:
Ticker myTim0;
而后编写一段时钟初始化代码:
//Ticker Initial
void tipInit(){js++;}
其中只有程序计数器累加——每中断一次js累加1
接着在main中添加对象类的方法:
myTim0.attach(&tipInit,0.05f);
设定为0.05秒中断一次,js累加
将源程序的while循环的js++去掉,下载后程序运行正常。
接着设置输出脉冲,先找一个合适的GPIO口,查看用户手册,模拟Arduino的D13口——PA_5可用,可以作为脉冲输出,采用时钟中断方式输出:中断一次输出高,再中断输出低,这样如果需要输出100Hz的等宽脉冲,需要中断时钟为0.005S。
在程序前部定义GPIO的位置添加一个数字输出IO口:
DigitalOut plusF12(PF_12);//plusA5表示PA_5口输出
将前边定义的中断函数改为:
void tipInit(){plusA5=!plusA5;}
主程序循环中再加入js++;语句
在主函数中main{更改
myTim0.attach(&tipInit,0.05f);为:myTim0.attach(&tipInit,0.005f);
下载后程序运行正确,示波器可以看到D13口[PA_5口]输出的脉冲。见图41
下边设置脉冲输入检测IO口,本例希望由接收到脉冲后中断发生事件,以减少主函数的参与度,打开InteruptIn.h文档,参照案例创建对象,PD_14,15可以做实验,本实验定义此两个口为数字输入[更多口设置一样],在前边加入:
//Define Interupt
InterruptIn plusIn14(PD_14);
InterruptIn plusIn15(PD_15);
参照案例编函数:
//IniteruptIn Initial
void PlusIn14(void){wait(0.001f);if(PD_14) ps14++;}//注意延时要小于脉冲时间,否则丢数!
void PlusIn15(void){wait(0.001f);if(PD_15) ps15++;}
再在main中加入对象类的方法:
plusIn14.fall(&PlusIn14);
plusIn15.rise(&PlusIn15);
最后在LCD显示屏幕上加上PD_14,15计数的数值即可。如果想单位时间的计数,只需要在某个程序中将计数清零即可。照片见图42,43。至此,采用ARMmbed工具开发STM32F412ZG的基础测试都做完了。其中包括:GPIO、ADC采样、PWM脉宽调制输出、时钟中断、中断输入检测、LCD驱显,已经可以完成一个小车类的玩意的驱动控制了。
PA_5输出的脉冲世博截图
PD_14口检测输入的脉冲显示在LCD上
PD_15口检测输入的脉冲显示在LCD上
不错 学习了
不错,过来看看,学习学习。