// ============================================================================= // 功能: 设置串口串口的波特率,FreescaleKxx的UART0和UART1时钟源为CORE,其他的时钟源 // 为BUS时钟 // 参数: Reg,被操作的寄存器组指针 // baud,波特率 // 返回: 无 // ============================================================================= static void __UART_BaudSet(tagUartReg volatile *Reg,u32 baud) { u32 UartClk; u16 Sbr,Brfa; u8 temp; if(Reg == NULL) return; if(((u32)Reg == CN_UART0_BASE) || ((u32)Reg == CN_UART1_BASE)) UartClk = CN_CFG_MCLK; else UartClk = CN_CFG_MCLK/2; Sbr = (u16)(UartClk/(baud * 16)); Brfa = (((UartClk*32)/(baud * 16)) - (Sbr * 32)); //配置波特率 temp = Reg->BDH & ~(UART_BDH_SBR(0x1F)); Reg->BDH = temp | UART_BDH_SBR(((Sbr & 0x1F00) >> 8)); Reg->BDL = (u8)(Sbr & UART_BDL_SBR_MASK); //用于校正 temp = Reg->C4 & ~(UART_C4_BRFA(0x1F)); Reg->C4 = temp | UART_C4_BRFA(Brfa); if(tg_UART_Reg[TxDirectPort] == Reg) { TxByteTime = 11000000/baud; //1个字节传输时间,按10bit,+10%计算 } }
void UART_init(void) { // Habilito la llave general de las interrupciones NVICISER0 |= NVIC_ISER_SETENA(1<<31); //Habilito los cuatro modulos de UART SIM_SCGC4 |= SIM_SCGC4_UART0_MASK; SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK; // Habilito el pin PTC1 como salida del canal 0 PORTB_PCR16 = (PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x03)); //Tx PORTB_PCR17 = (PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x03)); //Rx //Habilito por interrupcion, un bit de stop y baudrate UART_C1_REG(UART0_BASE_PTR) = 0x00; UART_BDH_REG(UART0_BASE_PTR) = /*UART_BDH_RXEDGIE_MASK | */UART_BDH_SBR(BAUDRATEHIGH); UART_BDL_REG(UART0_BASE_PTR) = UART_BDL_SBR(BAUDRATELOW); UART_C2_REG(UART0_BASE_PTR) = UART_C2_TIE_MASK | UART_C2_TE_MASK | UART_C2_RE_MASK | UART_C2_RIE_MASK; UART_C3_REG(UART0_BASE_PTR) = UART_C3_TXDIR_MASK; UART_PFIFO_REG(UART0_BASE_PTR) = UART_PFIFO_TXFE_MASK | UART_PFIFO_TXFIFOSIZE(0x06) | UART_PFIFO_RXFE_MASK | UART_PFIFO_RXFIFOSIZE(0x01); UART_S2_REG(UART0_BASE_PTR) = 0x00; }
static void hw_uart_init(void) { register uint16_t sbr, brfa; uint8_t temp; /* Enable UART core clock */ SIM->SCGC1 |= SIM_SCGC1_UART5_MASK; /* Configure UART TX pin */ UART_TX_PORT->PCR[UART_TX_PIN] = PORT_PCR_MUX(UART_TX_MUX); /* Disable transmitter and receiver while we change settings. */ UART_PORT->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK ); /* Configure the UART for 8-bit mode, no parity */ UART_PORT->C1 = 0; /* Calculate baud settings */ sbr = (uint16_t)((BUS_CLK_KHZ * 1000)/(UART_BAUD * 16)); temp = UART_PORT->BDH & ~(UART_BDH_SBR(0x1F)); UART_PORT->BDH = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8)); UART_PORT->BDL = (uint8_t)(sbr & UART_BDL_SBR_MASK); /* Determine if a fractional divider is needed to get closer to the baud rate */ brfa = (((BUS_CLK_KHZ * 32000)/(UART_BAUD * 16)) - (sbr * 32)); temp = UART_PORT->C4 & ~(UART_C4_BRFA(0x1F)); UART_PORT->C4 = temp | UART_C4_BRFA(brfa); /* Enable receiver and transmitter */ UART_PORT->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK); }
static void hw_uart_init(void) { register uint16_t sbr, brfa; uint8_t temp; #ifdef FREESCALE_KSDK_BM PORT_SetPinMux(UART_TX_PORT, UART_TX_PIN, UART_TX_MUX); CLOCK_SetLpuartClock(1); /* MCGPLLCLK */ DbgConsole_Init((uint32_t)UART_PORT, UART_BAUD, DEBUG_CONSOLE_DEVICE_TYPE_LPUART, SYS_CLK_HZ); #else /* Enable UART core clock */ /* Note: Remember to update me if UART_PORT changes */ SIM->SCGC1 |= SIM_SCGC1_UART4_MASK; /* Configure UART TX pin */ UART_TX_PORT->PCR[UART_TX_PIN] = PORT_PCR_MUX(UART_TX_MUX); /* Disable transmitter and receiver while we change settings. */ UART_PORT->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK ); /* Configure the UART for 8-bit mode, no parity */ UART_PORT->C1 = 0; /* Calculate baud settings */ sbr = (uint16_t)((BUS_CLK_KHZ * 1000)/(UART_BAUD * 16)); temp = UART_PORT->BDH & ~(UART_BDH_SBR(0x1F)); UART_PORT->BDH = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8)); UART_PORT->BDL = (uint8_t)(sbr & UART_BDL_SBR_MASK); /* Determine if a fractional divider is needed to get closer to the baud rate */ brfa = (((BUS_CLK_KHZ * 32000)/(UART_BAUD * 16)) - (sbr * 32)); temp = UART_PORT->C4 & ~(UART_C4_BRFA(0x1F)); UART_PORT->C4 = temp | UART_C4_BRFA(brfa); /* Enable receiver and transmitter */ UART_PORT->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK); #endif }
void init_uart0 (void) { uint16_t ubd, bfra; uint8_t temp; //Settings pins SIM->SCGC5 |= SIM_SCGC5_PORTE_MASK; PORTE->PCR [RX] |= PORT_PCR_MUX(3); PORTE->PCR [TX] |= PORT_PCR_MUX(3); PTE->PDDR |= 1 << TX; //Settings uart SIM->SCGC4 |= SIM_SCGC4_UART1_MASK; UART1->C2 &= ~(UART_C2_TE_MASK|UART_C2_RE_MASK); UART1->C1 = 0; ubd = (uint16_t) ((F_CPU*1000)/(BAUD*16)); temp = UART1->BDH & ~(UART_BDH_SBR(0x1F)); UART1->BDH = temp | UART_BDH_SBR(((ubd & 0x1F00) >> 8)); UART1->BDL = (uint8_t) (ubd & UART_BDL_SBR_MASK); bfra = (((F_CPU*32000)/(BAUD*16)) - (ubd*32)); temp = UART1->C4 & ~(UART_C4_BRFA(0x1F)); UART1->C4 = temp | UART_C4_BRFA(bfra); UART1->C2 |= UART_C2_RE_MASK|UART_C2_TE_MASK; }
/* * LPLD_UART_Init * 初始化UART通道、波特率、发送接收引脚 * * 参数: * uart_init_structure--UART初始化结构体, * 具体定义见UART_InitTypeDef * * 输出: * 无 * */ void LPLD_UART_Init(UART_InitTypeDef uart_init_structure) { register uint16 sbr, brfa; uint32 sysclk; uint8 temp, x; UART_Type *uartx = uart_init_structure.UART_Uartx; uint32 baud = uart_init_structure.UART_BaudRate; PortPinsEnum_Type tx_pin = uart_init_structure.UART_TxPin; PortPinsEnum_Type rx_pin = uart_init_structure.UART_RxPin; UART_ISR_CALLBACK rx_isr = uart_init_structure.UART_RxIsr; UART_ISR_CALLBACK tx_isr = uart_init_structure.UART_TxIsr; if(baud == NULL) { baud = 9600; } //使能选中的UART串口通道时钟,相应GPIO的UART复用功能 if(uartx == UART0) { x = 0; sysclk = g_core_clock; SIM->SCGC4 |= SIM_SCGC4_UART0_MASK; if(tx_pin == PTA2) PORTA->PCR[2] = PORT_PCR_MUX(2); else if(tx_pin == PTA14) PORTA->PCR[14] = PORT_PCR_MUX(3); else PORTB->PCR[17] = PORT_PCR_MUX(3); if(rx_pin == PTA1) PORTA->PCR[1] = PORT_PCR_MUX(2); else if(rx_pin == PTA15) PORTA->PCR[15] = PORT_PCR_MUX(3); else PORTB->PCR[16] = PORT_PCR_MUX(3); } else { if (uartx == UART1) { x = 1; sysclk = g_core_clock; SIM->SCGC4 |= SIM_SCGC4_UART1_MASK; if(tx_pin == PTE0) PORTE->PCR[0] = PORT_PCR_MUX(3); else PORTC->PCR[4] = PORT_PCR_MUX(3); if(rx_pin == PTE1) PORTE->PCR[1] = PORT_PCR_MUX(3); else PORTC->PCR[3] = PORT_PCR_MUX(3); } else { sysclk = g_bus_clock; if (uartx == UART2) { x = 2; SIM->SCGC4 |= SIM_SCGC4_UART2_MASK; PORTD->PCR[3] = PORT_PCR_MUX(3); PORTD->PCR[2] = PORT_PCR_MUX(3); } else { if(uartx == UART3) { x = 3; SIM->SCGC4 |= SIM_SCGC4_UART3_MASK; if(tx_pin == PTE4) PORTE->PCR[4] = PORT_PCR_MUX(3); else if(tx_pin == PTB11) PORTB->PCR[11] = PORT_PCR_MUX(3); else PORTC->PCR[17] = PORT_PCR_MUX(3); if(rx_pin == PTE5) PORTE->PCR[5] = PORT_PCR_MUX(3); else if(rx_pin == PTB10) PORTB->PCR[10] = PORT_PCR_MUX(3); else PORTC->PCR[16] = PORT_PCR_MUX(3); } else { if(uartx == UART4) { x = 4; SIM->SCGC1 |= SIM_SCGC1_UART4_MASK; if(tx_pin == PTE24) PORTE->PCR[24] = PORT_PCR_MUX(3); else PORTC->PCR[15] = PORT_PCR_MUX(3); if(rx_pin == PTE25) PORTE->PCR[25] = PORT_PCR_MUX(3); else PORTC->PCR[14] = PORT_PCR_MUX(3); } else { x = 5; uartx = UART5; SIM->SCGC1 |= SIM_SCGC1_UART5_MASK; if(tx_pin == PTD9) PORTD->PCR[9] = PORT_PCR_MUX(3); else PORTE->PCR[8] = PORT_PCR_MUX(3); if(rx_pin == PTD8) PORTD->PCR[8] = PORT_PCR_MUX(3); else PORTE->PCR[9] = PORT_PCR_MUX(3); } } } } } //在配置好其他寄存器前,先关闭发送器和接收器 uartx->C2 &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK ); //配置UART为 8位, 无奇偶校验 */ uartx->C1 = 0; //计算波特率 sbr = (uint16)((sysclk)/(baud * 16)); //保存UARTx_BDH寄存器中除了SBR的值 temp = uartx->BDH & ~(UART_BDH_SBR(0x1F)); uartx->BDH = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8)); uartx->BDL = (uint8)(sbr & UART_BDL_SBR_MASK); //配置波特率的微调分数 brfa = (((sysclk*32)/(baud * 16)) - (sbr * 32)); //保存UARTx_C4寄存器中除了BRFA的值 temp = uartx->C4 & ~(UART_C4_BRFA(0x1F)); uartx->C4 = temp | UART_C4_BRFA(brfa); //配置发送接收中断 if(uart_init_structure.UART_RxIntEnable == TRUE && rx_isr != NULL) { uartx->C2 |= UART_C2_RIE_MASK; UART_R_ISR[x] = rx_isr; } else { uartx->C2 &= ~(UART_C2_RIE_MASK); } if(uart_init_structure.UART_TxIntEnable == TRUE && tx_isr != NULL) { uartx->C2 |= UART_C2_TIE_MASK; UART_T_ISR[x] = tx_isr; } else { uartx->C2 &= ~(UART_C2_TIE_MASK); } //使能发送器和接收器 uartx->C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK ); }