| 
 
| 遇到麻烦,请大力帮帮忙。谢谢。 
 一个103RBT6,72M FCLK. 我需要先出1uS的高电平,然后出0.5uS的低电平。或反过来,误差不能超过100nS.
 (也就是0.5uS的电平,误差也不能超过100nS)。怎样才能最精确呢?我用普通单片机汇编可以很轻易出这样的波形,但是这里搞不定。其实100nS之内, FCLK 72M 的STM32应该都能执行很多条指令了吧?怎么延时不准的呢?
 
 我用下面的代码不行。我这里没有数字存储示波器,不能抓波形来看。只能用软件仿真的方式观察波形,而软件仿真看到的波形的读数去不到纳秒级。我观察0码的长度比例为(我用尺子量) 1:1.7    而1码的长度比例为  1.5:1.178  。偏差太大了吧? 问题出在哪里呢?该怎样改呢? (但不排除软件仿真的显示结果有问题)
 
 void send_dat(void)
 {
 u8 i,j,t;
 RCC->APB1ENR|=1<<1;   //TIM3时钟使能
 TIM3->PSC=0;
 TIM3->DIER|=1<<0;
 TIM3->CR1|=1<<3;      //单脉冲模式
 for (i=0;i<buff_size;i++)
 {
 t=buf[i];
 for (j=0;j<8;j++)
 {
 if (t&0x80)
 {
 DAT0=1;
 TIM3->ARR=72;         //1uS的定时器
 TIM3->CR1|=1<<0;
 while (!(TIM3->SR&1)) ;
 TIM3->SR&=~1;
 DAT0=0;
 TIM3->ARR=36;         //0.5uS的定时器
 TIM3->CR1|=1<<0;
 while (!(TIM3->SR&1)) ;
 TIM3->SR&=~1;
 }
 else
 {
 DAT0=1;
 TIM3->ARR=36;         //0.5uS的定时器
 TIM3->CR1|=1<<0;
 while (!(TIM3->SR&1)) ;
 TIM3->SR&=~1;
 DAT0=0;
 TIM3->ARR=72;         //1uS的定时器
 TIM3->CR1|=1<<0;
 while (!(TIM3->SR&1)) ;
 TIM3->SR&=~1;
 }
 t<<=1;
 }
 }
 }
 | 
 |