首先你要确定进入中断卖历谨时单片机需要的时间,这个可以通过反汇编看到,其次是中断的优先级需要设置到最高,最好就定时器那么一个,如果你还要更高的精度那就用带有PWM外设的单片机,
最后就是外围的设计烂桐,你的单片机供电必须要高精度的稳压,否则你需要输出做PWM隔离,总的来说要做高精度的PWM需要软硬结合!
U0IER=0x02 //使能THRE中断这句没使能接收中断吧,接收中断正常吗?
首先要知道,串口0只有一个中断入口,中断发生后,需要对中断标识寄存器进行判断以确定中断类型再进行相应处理。
如:
__irq void uart0()
{
if((U0IIR&0x0F)==0x02)
发送数据 //发送中断
if((U0IIR&0x0F)==0x04)
接收数据 //接收中断
.
.
.
VICVectAddr=0//中断结束
}
另外,实时性要求不是特别高的情况下,一般发送用查询方式即可。
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
uint8 i
if ((U0IIR &0x0F) == 0x04)
rcv_new = 1 // 设置接收到新的数据标志
for (i=0i<8i++)
{
rcv_buf[i] = U0RBR // 读取FIFO的数据,并清除中断
}
VICVectAddr = 0x00 // 中断处理结束
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat 要渣指发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
U0THR = dat// 要发送的数据
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函晌冲数功能 :向串口发送8字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
uint8 i
for (i=0i<8i++)
UART0_SendByte(rcv_buf[i])
while ((U0LSR &0x20) == 0)// 等待宴梁歼数据发送完毕
}
在使用LPC2138做一个控制器,但是有些地方不是懂,我现在想知道关于PINSEL2 寄存器的一些使用瞎拍方法,比如:我磨基羡想把P1.21 P1.22设置成输出该如何设置(请尽量详细的解答)?并且头文件的部分锋信改如何定义P1.21 P1.22名称?在一些资料上看到PINSEL2 寄存器在设置和编程的方法上都有很多的不同,由于错误的对PINSEL2 寄存器进行 *** 作,导致用仿真器连接时无法找到芯片进行写程序 *** 作了,但是之前写入的程序还能正常运行,不知道是芯片坏掉了还是锁死了,要是锁死了请高手指点一下如何对LPC2138进行解锁欢迎分享,转载请注明来源:内存溢出
评论列表(0条)