#include "Includes.h" #define PULSE_DET_PIN 4 //采样脚(对方通过pwm向此脚灌入百分之五十占空比的方波) #define CALIB_TIMES 2 //校准2次 #define CYCLE_TIMES 3 //循环次数 3次-- #define COLLECT_NUM ((CYCLE_TIMES*2)-1) //循环3次有六个采样点 可以得到五个采样值 #define TIMER_REFER 3 //选择的timer3作为计数参考 #define GEAR_HZ 71160.0 //总共128个档位 每个步长调节71160HZ的频率 #define RC16M_COEFFI 400 //rc16M 实际频率的计算系数:(1000ms/5ms)*2 #define RC16M_STD 16000000.0 //rc16M void timer_cnt(uint8_t ch)//8 cycle is 1us { __write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL,0x80008); //TIMER_PCLK 时钟使能 __write_hw_reg32(CPR_TIMER_CLK_CTL(ch),0x00); //TIMERx_CLK 时钟控制寄存器 mclk_in(rc16M)/(2*(0x00 + 0x1))=8M __write_hw_reg32(TIMERx_TCR(ch),0x0); //不屏蔽定时器中断,不使能定时器timer_num, __write_hw_reg32(TIMERx_TCR(ch),0x2); //设置定时器工作在用户定义计数模式 __write_hw_reg32(TIMERx_TLC(ch),0xffffffff); //载入计数器计数初值(32bits),该值应大于等于 0x4 __write_hw_reg32(TIMERx_TCR(ch),0x3); //使能定时器timer_num } void BubbleSort(uint32_t *arr,uint32_t length) { for(int i=0;iarr[j+1]){ //相邻两个元素作比较,如果前面元素大于后面,进行交换 uint32_t temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; } } } } uint32_t get_average(uint32_t *p,uint32_t len) { uint32_t sum=0; BubbleSort(p,len); for(int i=0;iRC16M_STD){ float tv=(freq_hz - RC16M_STD)/GEAR_HZ; uint32_t t1=(((uint32_t)(tv*100))%100)>50 ? 1:0 ; CPR_RF_REG0->rc16m_rtune -= (t1+((uint32_t)tv)); }else if(freq_hz50 ? 1:0 ; CPR_RF_REG0->rc16m_rtune += (t1+((uint32_t)tv)); } } void calib_rc16m(void) { //[00-OSC32M],[01-bbpll direct output],[10-bbpll div output],[11-rc16M] *((volatile unsigned *)(0x40000000+ 0x130)) |=0x06; //select clk source rc16M //config pin gpio_mux_ctl(PULSE_DET_PIN,0); gpio_fun_inter(PULSE_DET_PIN,0); gpio_fun_sel(PULSE_DET_PIN,0); gpio_direction_input(PULSE_DET_PIN,1);//50HZ(10ms) __write_hw_reg32((GPIO_DEBOUNCE0+(PULSE_DET_PIN>>4)),((0x10000)<<(PULSE_DET_PIN&0x0F))); //disable debounce //CPR_RF_REG0->rc16m_rtune=0x3f;//set rc16m rtune default 0x3f (0-0x7f) //calib start timer_cnt(TIMER_REFER);//timer cnt,8 cycle is 1us for(int i=0;irc16m_rtune=0x%X\n",CPR_RF_REG0->rc16m_rtune); } #if 0 uint32_t rc16m_buf[50]; void calib_rc16m(void) { #if 0 uint32_t t1,t2; *((volatile unsigned *)(0x40000000+ 0x130)) |=0x06; //[00-OSC32M],[01-bbpll direct output],[10-bbpll div output],[11-rc16M] //115200 CPR_RF_REG0->rc16m_rtune=0x7E;//set rc16m rtune gpio_mux_ctl(7,0);gpio_fun_inter(7,0);gpio_fun_sel(7,0); gpio_direction_input(7,1); __write_hw_reg32(GPIO_DEBOUNCE0,0xffff0000); xc_timer_init(0,4000000); uint8_t timers=50; while(gpio_input_val(7)==0); while(gpio_input_val(7)==1); while(timers--) { while(gpio_input_val(7)==0); t1=*TIMERx_TCV(0); while(gpio_input_val(7)==1); t2=*TIMERx_TCV(0); rc16m_buf[timers]=t1-t2; //printf("%d\n",t1-t2); while(gpio_input_val(7)==0); while(gpio_input_val(7)==1); } *((volatile unsigned *)(0x40000000+ 0x130)) &=~0x06; printf("****\n"); for(int i=0;i<50;i++) printf("%d\n",rc16m_buf[i]); while(1); #endif #if 0 uint32_t t1,t2; //*((volatile unsigned *)(0x40000000+ 0x130)) |=0x06; //[00-OSC32M],[01-bbpll direct output],[10-bbpll div output],[11-rc16M] //115200 SET_RC16M_BBPLL_32M(); CPR_RF_REG0->rc16m_rtune=0xf0;//set rc16m rtune gpio_mux_ctl(7,0);gpio_fun_inter(7,0);gpio_fun_sel(7,0); gpio_direction_input(7,1); __write_hw_reg32(GPIO_DEBOUNCE0,0xffff0000); xc_timer_init(0,4000000); uint8_t timers=50; while(gpio_input_val(7)==0); while(gpio_input_val(7)==1); while(timers--) { while(gpio_input_val(7)==0); t1=*TIMERx_TCV(0); while(gpio_input_val(7)==1); t2=*TIMERx_TCV(0); rc16m_buf[timers]=t1-t2; //printf("%d\n",t1-t2); while(gpio_input_val(7)==0); while(gpio_input_val(7)==1); } *((volatile unsigned *)(0x40000000+ 0x130)) &=~0x06; printf("****\n"); for(int i=0;i<50;i++) printf("%d\n",rc16m_buf[i]); while(1); #endif } void test_drift_rc16m(void) { } void test_linear_rc16m(void) { } void test_calib_rc16m(void) { calib_rc16m(); //gpio_output_high(26); //gpio_output_low(26); // //3.19ms // calib_init(); // rc32k_calib(3); //gpio_output_high(26); //gpio_output_low(26); #if 0 SET_RC16M_BBPLL_32M(); //CPR_RF_REG0->rc16m_rtune=0x00;//set rc16m rtune uart-89847-bps 415047 //CPR_RF_REG0->rc16m_rtune=0x20;//set rc16m rtune uart-100401-bps 464796 //CPR_RF_REG0->rc16m_rtune=0x40;//set rc16m rtune uart-107032-bps 530170 //CPR_RF_REG0->rc16m_rtune=0x60;//set rc16m rtune uart-134048-bps 619766 //CPR_RF_REG0->rc16m_rtune=0x80;//set rc16m rtune uart-107101-bps 534492 //CPR_RF_REG0->rc16m_rtune=0xa0;//set rc16m rtune uart-134124-bps 618613 // CPR_RF_REG0->rc16m_rtune=0xc0;//set rc16m rtune uart-161290-bps 744983 // CPR_RF_REG0->rc16m_rtune=0xE0;//set rc16m rtune uart-202839-bps 930793 // CPR_RF_REG0->rc16m_rtune=0xff;//set rc16m rtune uart-134048-bps 618332 CPR_RF_REG0->rc16m_rtune=0xf0;//set rc16m rtune uart-231481-bps 1069864 #endif #if 0 *((volatile unsigned *)(0x40000000+ 0x130)) |=0x06; //[00-OSC32M],[01-bbpll direct output],[10-bbpll div output],[11-rc16M] //115200 CPR_RF_REG0->rc16m_rtune=0x00;//set rc16m rtune uart-45004-bps 207574 // CPR_RF_REG0->rc16m_rtune=0x20;//set rc16m rtune uart-50479-bps 233145 // CPR_RF_REG0->rc16m_rtune=0x40;//set rc16m rtune uart-57570-bps 266167 // CPR_RF_REG0->rc16m_rtune=0x60;//set rc16m rtune uart-67114-bps 309918 // CPR_RF_REG0->rc16m_rtune=0x80;//set rc16m rtune uart-57670-bps 266128 // CPR_RF_REG0->rc16m_rtune=0xa0;//set rc16m rtune uart-66979-bps 309810 // CPR_RF_REG0->rc16m_rtune=0xc0;//set rc16m rtune uart-80645-bps 371919 // CPR_RF_REG0->rc16m_rtune=0xE0;//set rc16m rtune uart-100704-bps 465464 // CPR_RF_REG0->rc16m_rtune=0xff;//set rc16m rtune uart-134048-bps 618221 // *((volatile unsigned *)(0x40002400 + 0x20)) =0x44; // *((volatile unsigned *)(0x40002400 + 0x48)) =0x01; #endif xc_ao_timer_calib_test(); } #endif