我举个例子,设置定时器3的3个通道都输出PWM,即PE3、PE4、PE5,单片机频率嫌誉弯7.3728MHz,分频的工作频率虚谈是7.2KHz,PWM周期是7200/72=100Hz,输出的3路PWM都是47.2%:
PORTE=0x00DDRE=0x38
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: 7.200 kHz
// Mode: Fast PWM top=ICR3
// OC3A output: Non-Inv.
// OC3B output: Non-Inv.
// OC3C output: Non-Inv.
// Noise Canceler: Off
// Input Capture on 芹闷Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0xAA
TCCR3B=0x1D
TCNT3H=0x00
TCNT3L=0x00
ICR3H=0x00
ICR3L=0x47
OCR3AH=0x00
OCR3AL=0x22
OCR3BH=0x00
OCR3BL=0x22
OCR3CH=0x00
OCR3CL=0x22
从根本上来说,如果你使用UART1,就不要同时使用PD3和PD2做GPIO用,如果非要复用的话,也要确保它们不同时生嫌好效,但你上面的程序显然不是这样。像你上面这样连接的话,即便修正了你的程序串口能够收到数据,但PD3和PD2的方向和高低也是由UART1控制,而非你所控制;也就是说显示不正确!其次,要恢复PD3和PD2的GPIO功能是禁用UART1,而不是关闭全局中断!
再次,超级循环体中反复开关全局中断,而你的串口接收又是中断驱动的,当然接收不正常!
要纠正,这样:
1. 使谈激用PORTD以外的端口连接LED,或者使用UART1之外的串口收发含者袜数据
2. 串口接收中断中收到有效数据置位标志
3. 超级循环体判断上述标志,如置位则:发送到PORTx,清零标志
4. 无需反复开关全局中断
又看了一下,貌似LED在PORTE上面,这样的话和PORTD的IO功能就没什么关系了吧。
删除超级循环体上的全局中断开关代码应该可以运行,但还是建议按前述流程 *** 作,这样利用中断规范些!
一句谢谢没有,一分没有,最后还来个“缓滑庆即可”,高,实在是高!你的级别也是四级了,你在知道里,愿意帮助向自己这样的人吗?
我这个回答肯定降低我的采纳率了,让誉没关系,提扰握醒下你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)