遇到麻烦,请大力帮帮忙。谢谢。
一个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;
}
}
} |