完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在STC的单片机上,多路串口如果波特率相同的情况下可以采用同一个定时器来产生时钟,那么在N76E003上面是否也可以这么实现呢?调试了好久都行,问下有哪位大神实现了?还是说硬件上本身就不支持这么做?初始化部分如下: 是否有漏了什么?
/******************************************************************** * 名称: InitialUART0AndUART1_Timer3(UINT32 u32Baudrate) * 功能: 初始化串口 * 调用: * 输入: * 返回值: ***********************************************************************/ void InitialUART0AndUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator { /****串口0端口设置******************************************************/ P06_Quasi_Mode; //Setting UART pin as Quasi mode for transmit P07_Quasi_Mode; //Setting UART pin as Quasi mode for transmit /********************************************************************/ /****串口1端口设置******************************************************/ P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit /***串口0相关寄存器配置******************************************************/ SCON = 0x50; //UART0 Mode1,REN=1,TI=1 串口0控制寄存器 set_SMOD; //UART0 Double Rate Enable set_BRCK; //UART0 baud rate clock source = Timer3 /********************************************************************/ /***串口1相关寄存器配置******************************************************/ SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1 /********************************************************************/ T3CON &= 0xF8; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)定时器3预分频 1/1 #ifdef FOSC_160000 RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */ RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */ #endif #ifdef FOSC_166000 RH3 = HIBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */ RL3 = LOBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */ #endif set_TR3; //Trigger Timer3 set_TI; //For printf function must setting TI = 1 set_ES; //enable UART interrupt set_TI_1; //For printf function must setting TI_1 = 1 set_ES_1; //For interrupt enable set_EA; //enable global interrupt } |
|
相关推荐
1个回答
|
|
从N76E003的数据手册中可以看到,它只有一个定时器3,而且它的时钟源只有两个选择:系统时钟或外部时钟。因此,如果你想在N76E003上使用两个串口并且使用同一个定时器产生波特率,首先你需要确定你的两个串口是否需要相同的波特率。如果它们需要不同的波特率,那么你必须有两个不同的定时器产生对应的时钟。如果它们需要相同的波特率,那么你可以使用定时器3产生时钟,并将同一个波特率应用于两个串口。
下面是部分代码,用于使用定时器3产生波特率并初始化两个串口: void InitialUART0AndUART1_Timer3(UINT32 u32Baudrate) { CKCON |= CKCON_T3M_MASK; // Set T3M for timer3, system clock TMR3RL = 65536 - Fsys / 4 / u32Baudrate; // Set Timer3 to generate target baudrate TMR3 = TMR3RL; set_T3CON_TR3; // Start Timer3 P06_Quasi_Mode; // UART0_TXD (P06) Quasi mode P07_Quasi_Mode; // UART0_RXD (P07) Quasi mode P10_Quasi_Mode; // UART1_TXD (P10) Quasi mode P11_Quasi_Mode; // UART1_RXD (P11) Quasi mode P03_Input_Mode; // Enable UART0_RXD bidirectional input buffer P32_Input_Mode; // Enable UART1_RXD bidirectional input buffer SCON = SCON_DI__DISABLED | SCON_TI__SET; // Initial no transmit, no interrupt, disabled RX SCON1 = SCON1_DI__DISABLED | SCON1_TI__SET; // Initial no transmit, no interrupt, disabled RX set_IE_ES; // Enable UART0 interrupt set_IE1_ES1; // Enable UART1 interrupt } |
|
|
|
只有小组成员才能发言,加入小组>>
3204 浏览 9 评论
2894 浏览 16 评论
3401 浏览 1 评论
8839 浏览 16 评论
3993 浏览 18 评论
9625浏览 3评论
998浏览 3评论
518浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
521浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2244浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-28 06:32 , Processed in 0.794630 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号