学习的过程不怕慢,就怕停,时间一长,自己也就疲了,乘着对开发环境还比较熟悉,抓紧学习。
继续学习GPIO,系统主频192M,4分频后,最快是48M,GPIO连续反转,最快频率应该是24M,编写测试程序,8个方波后,延迟一段时间,继续工作,测试波形如下,41ns左右一个周期,频率24M,GPIO已经很快了。
在加上多线程并行工作,可以做很多事情了。
手头有一个20M,12-bit的ADC,在不考虑时钟抖动的情况下,将GPIO的反转作为ADC的时钟信号,反转 过程中读取ADC数据,程序如下。
while(1){
for(i=0;i<10;i++)
{
GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=1
GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=0
ad_data1[0]=GPIO_GET_INPUT_VALUE_SAFE(GPIOA_BASE_ADDR);
……
GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=1
GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=0
ad_data1[6]=GPIO_GET_INPUT_VALUE_SAFE(GPIOA_BASE_ADDR);
GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=1
GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR, GPIO_PIN15);//LED=0
ad_data1[7]=GPIO_GET_INPUT_VALUE_SAFE(GPIOA_BASE_ADDR);
NOP();
ad_sum_cache =ad_data1[0]+ad_data1[1]+ad_data1[2]+ad_data1[3]+ad_data1[4]+ad_data1[5]+ad_data1[6]+ad_data1[7];
delay_us(100);
}
}
测试波形如下。
从上图可以看出,频率达到了18.5M(54ns),当然,占空比不等,如果要将占空比调整为1:1,频率将降低到12.5M了,一般的控制场合应该是足够了。
从程序中可以看出,最后一个波形铲产生后,增加了NOP()语句,因为采集后的数据加和后传递给了全局变量,全局变量需要一个载入地址的操作,中间必须增加NOP()语句,否则会导致最后一个波形被拓展。如下图所示。
从上图可以看出,最后一个波形的周期变为100ns。
增加NOP()后,波形正常。此处,标记一下,花费了1h,最后请教了厂家的技术支持,说实话,厂家的技术支持很给力,做到了有问必答。