lpc1754串口0,按照demo,设置波特率57600及以下正确115200不正常
打出来是乱码,有这方面经验的网友提供一下解决方法好吗?LPC_PINCON->PINSEL0 &= ~0x000000F0;
LPC_PINCON->PINSEL0 |= 0x00000050;/* RxD0 is P0.3 and TxD0 is P0.2 */
/* By default, the PCLKSELx value is zero, thus, the PCLK for
all the peripherals is 1/4 of the SystemFrequency. */
/* Bit 6~7 is for UART0 */
pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
switch ( pclkdiv )
{
case 0x00:
default:
pclk = SystemFrequency/4;
break;
case 0x01:
pclk = SystemFrequency;
break;
case 0x02:
pclk = SystemFrequency/2;
break;
case 0x03:
pclk = SystemFrequency/8;
break;
}
LPC_UART0->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv = ( pclk / 16 ) / baudrate ; /*baud rate */
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->LCR = 0x03; /* DLAB = 0 */
LPC_UART0->FCR = 0x07; /* Enable and reset TX and RX FIFO. */
NVIC_EnableIRQ(UART0_IRQn);
LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ 估计是波特率算错了,之前的LPC1768都正常的。 是不是哪里的系统时钟没设置正确,在某个波特率以下是允许范围内,其它波特率超了呢? weiwei4 发表于 2019-9-22 20:24
是不是哪里的系统时钟没设置正确,在某个波特率以下是允许范围内,其它波特率超了呢? ...
换成外置晶振都是一样 SUPER_CRJ 发表于 2019-9-22 19:57
估计是波特率算错了,之前的LPC1768都正常的。
是不是这个原因?
小数部分设置没?
Excellence 发表于 2019-9-23 08:15
小数部分设置没?
正在研究中 外设时钟 默认25MHz 不能上到 115200 ,需要修改 外设时钟的。就这个问题。没别的问题。 本帖最后由 openmcu666 于 2019-9-23 09:51 编辑
试试这个 Fdiv = (25000000/16) / baudrate;// 设置波特率, 看串口外设时钟是多少 void Uart1Init(void)
{
LPC_SC->PCONP |= PCUART1;
//P2.0 TXD1,P2.1 RXD1
//LPC_PINCON->PINSEL4 =(LPC_PINCON->PINSEL4&(~(0x03 << (2 *UART_TXD1_NUM))))|(SECONDFUNC<<(2*UART_TXD1_NUM));
//LPC_PINCON->PINSEL4 =(LPC_PINCON->PINSEL4&(~(0x03 << (2 *UART_RXD1_NUM))))|(SECONDFUNC<<(2*UART_RXD1_NUM));
//P0.15TXD1,P0.16RXD1
LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~((unsigned int)0x03 << (2 *UART_TXD1_NUM)))) |(FIRSTFUNC<<(2*UART_TXD1_NUM));
LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_RXD1_NUM-16)))))|(FIRSTFUNC<<(2*(UART_RXD1_NUM-16)));
LPC_UART1->LCR = 0x83;
//24M:9600--125 115200--1357600--17//十进制
LPC_UART1->DLM = 0;///Fdiv / 256;
LPC_UART1->DLL = 125;///Fdiv % 256;
LPC_UART1->LCR = ((U1_DATA_BIT)|(U1_STOP_BIT<<2)|(U1_CHECK_BIT_EN<<3)|(U1_CHECK_BIT<<4));
LPC_UART1->IER = 0x03; // Enable RDA and THRE interrupts
LPC_UART1->FCR = 0xc7;
//24M:9600--0X41 115200--0X20 57600--0XF8
LPC_UART1->FDR = 0x41;
NVIC_SetPriority(UART1_IRQn,2);
NVIC_EnableIRQ(UART1_IRQn); /* 使能I2C中断 */
}// End of UART0 initialize function void Uart3Init(void)
{
//uint16Fdiv;
LPC_SC->PCONP |= PCUART3;
//P0.0 TXD3, P0.1 RXD3
//LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~(0x03 << (2 *UART_TXD3_NUM))))|(SECONDFUNC<<(2*UART_TXD3_NUM));
//LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~(0x03 << (2 *UART_RXD3_NUM))))|(SECONDFUNC<<(2*UART_RXD3_NUM));
//P0.25 TXD3, P0.26 RXD3
//LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_TXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_TXD3_NUM-16)));
//LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_RXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_RXD3_NUM-16)));
//P4.28 TXD3, P4.29 RXD3
LPC_PINCON->PINSEL9 =(LPC_PINCON->PINSEL9&(~(0x03 << (2 *(UART_TXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_TXD3_NUM-16)));
LPC_PINCON->PINSEL9 =(LPC_PINCON->PINSEL9&(~(0x03 << (2 *(UART_RXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_RXD3_NUM-16)));
LPC_UART3->LCR = 0x83;
//Fdiv = (25000000UL / 16) / UART0_BPS; // set baudrate
//12M:9600--71 115200--6 57600--13//十进制
//18M:9600--X 115200--x 57600--11//十进制
//24M:9600--125 115200--1357600--17//十进制
//25M:9600--92 115200--1057600--19//十进制
LPC_UART3->DLM = 0;///Fdiv / 256;
LPC_UART3->DLL = 17;///Fdiv % 256;
LPC_UART3->LCR = ((U3_DATA_BIT)|(U3_STOP_BIT<<2)|(U3_CHECK_BIT_EN<<3)|(U3_CHECK_BIT<<4));
LPC_UART3->IER = 0x03; // Enable RDA and THRE interrupts
LPC_UART3->FCR = 0xc7;
//12M:9600--0XA1 115200--0XC1 57600--0X20 D=0,M=2
//18M:9600--X 115200--X 57600--0X97 D=7,M=9
//24M:9600--0X41 115200--0X20 57600--0XF8 D=8,M=F
//25M:9600--0XDA 115200--0XE5 57600--0X73 D=3,M=7
LPC_UART3->FDR = 0xF8;
NVIC_SetPriority(UART3_IRQn, 4);
NVIC_EnableIRQ(UART3_IRQn); /* 使能I2C中断 */
}// End of UART0 initialize function LPC1768,,,,,,,,,,主频是96MHz.,不是100MHz. dengxiaofeng 发表于 2019-9-23 08:58
外设时钟 默认25MHz 不能上到 115200 ,需要修改 外设时钟的。就这个问题。没别的问题。 ...
我的板是用12M晶振。 openmcu666 发表于 2019-9-23 09:49
试试这个 Fdiv = (25000000/16) / baudrate;// 设置波特率, 看串口外设时钟是多少
用12M晶振要小数才行的。9600倒是可以 Edesigner. 发表于 2019-9-23 11:03
我的板是用12M晶振。
和你板子晶体 啥关系 内部PLL到 100M的 系统时钟100M.,看串口外设时钟是多少?应该是你时钟设置问题 问题解决了,增加小数寄存器设置就可以了
页:
[1]