void BSP_Ser_Init (CPU_INT32U baud_rate) { GPIO_InitTypeDef gpio_init; USART_InitTypeDef usart_init; USART_ClockInitTypeDef usart_clk_init; /* ------------------ INIT OS OBJECTS ----------------- */ BSP_OS_SemCreate(&BSP_SerTxWait, BSP_UART2_TX_BUFFER_SIZE, "Serial Tx Wait"); BSP_OS_SemCreate(&BSP_SerRxWait, 0, "Serial Rx Wait"); BSP_OS_SemCreate(&BSP_SerLock, 1, "Serial Lock"); /* ----------------- INIT USART STRUCT ---------------- */ usart_init.USART_BaudRate = baud_rate; usart_init.USART_WordLength = USART_WordLength_8b; usart_init.USART_StopBits = USART_StopBits_1; usart_init.USART_Parity = USART_Parity_No ; usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usart_clk_init.USART_Clock = USART_Clock_Disable; usart_clk_init.USART_CPOL = USART_CPOL_Low; usart_clk_init.USART_CPHA = USART_CPHA_2Edge; usart_clk_init.USART_LastBit = USART_LastBit_Disable; BSP_PeriphEn(BSP_PERIPH_ID_USART2); BSP_PeriphEn(BSP_PERIPH_ID_IOPD); BSP_PeriphEn(BSP_PERIPH_ID_AFIO); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); /* ----------------- SETUP USART2 GPIO ---------------- */ /* Configure GPIOD.5 as push-pull. */ gpio_init.GPIO_Pin = GPIO_Pin_5; gpio_init.GPIO_Speed = GPIO_Speed_50MHz; gpio_init.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &gpio_init); /* Configure GPIOD.6 as input floating. */ gpio_init.GPIO_Pin = GPIO_Pin_6; gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &gpio_init); /* ------------- CLEAN UP RX & TX BUFFERS ------------- */ Mem_Clr((void*)&BSP_SerialRxBuffer[0], BSP_UART2_RX_BUFFER_SIZE); Mem_Clr((void*)&BSP_SerialTxBuffer[0], BSP_UART2_TX_BUFFER_SIZE); BSP_TxBuffer_Head_ndx = 0; BSP_TxBuffer_Tail_ndx = 0; BSP_RxBuffer_Head_ndx = 0; BSP_RxBuffer_Tail_ndx = 0; /* ------------------ SETUP USART2 -------------------- */ USART_Init(USART2, &usart_init); USART_ClockInit(USART2, &usart_clk_init); USART_Cmd(USART2, ENABLE); BSP_IntVectSet(BSP_INT_ID_USART2, BSP_Ser_ISR_Handler); BSP_IntEn(BSP_INT_ID_USART2); BSP_SerialInitilizated = DEF_TRUE; }
/* ********************************************************************************************************* * AppObjCreate() * * Description : Create application kernel objects tasks. * * Argument(s) : none * * Return(s) : none * * Caller(s) : AppTaskStart() * * Note(s) : none. ********************************************************************************************************* */ static void AppObjCreate (void) { /* 创建互斥信号量 */ BSP_OS_SemCreate(&SEM_GPS_STO, 0, (CPU_CHAR *)"SEM_GPS_STO"); /* GPS存储信号灯 */ BSP_OS_SemCreate(&SEM_TEL_STO, 0, (CPU_CHAR *)"SEM_TEL_STO"); /* 遥测存储信号灯 */ BSP_OS_SemCreate(&SEM_PLOAD_STO, 0, (CPU_CHAR *)"SEM_PLOAD_STO"); /* 载荷存储信号灯 */ /********************姿控信号灯*********************/ BSP_OS_SemCreate(&SEM_CYC_INFO, 0, (CPU_CHAR *)"SEM_CYC_INFO"); /* 信号采集信号灯 */ BSP_OS_SemCreate(&SEM_MAG_DOT_DMP, 0, (CPU_CHAR *)"SEM_MAG_DOT_DMP"); /* 阻尼信号灯 */ BSP_OS_SemCreate(&SEM_PIT_FLT_COM, 0, (CPU_CHAR *)"SEM_PIT_FLT_COM"); /* 滤波状态更新信号灯 */ BSP_OS_SemCreate(&SEM_ATT_STA_CTL, 0, (CPU_CHAR *)"SEM_ATT_STA_CTL"); /* 三轴稳定信号灯 */ }
void BSP_Ser_Init (CPU_INT32U baud_rate) { CPU_INT08U baud_clk; CPU_INT16U brr; CPU_REG32 i; /* Initialize OS Objects. */ BSP_OS_SemCreate(&BSP_SerTxWait, 0, "Serial Tx Wait"); BSP_OS_SemCreate(&BSP_SerRxWait, 0, "Serial Rx Wait"); BSP_OS_SemCreate(&BSP_SerLock, 1, "Serial Lock"); SYSTEM.PRCR.WORD = 0xA50B; /* Protect off. */ MPC.PWPR.BIT.B0WI = 0; /* Unlock protection register. */ MPC.PWPR.BIT.PFSWE = 1; /* Unlock MPC registers. */ SYSTEM.MSTPCRA.BIT.ACSE = 0; /* clear ACSE Bit (All-Module Clock Stop Mode Enable). */ MSTP(SCI2) = 0; /* Cancel stop state of SCI2 Periph to en wr to it. */ SYSTEM.PRCR.WORD = 0xA500; /* Protect on. */ SCI2.SCR.BYTE = 0x00; /* Clear bits TIE, RIE, RE, and TEIE in SCR to 0 ... */ /* ... Set CKE to internal. */ /* Set up the UART I/O port and pins. */ MPC.P50PFS.BYTE = 0x4A; /* P50 is TxD2. */ MPC.P52PFS.BYTE = 0x4A; /* P52 is RxD2. */ PORT5.PDR.BIT.B0 = 1; /* TxD2 is output. */ PORT5.PDR.BIT.B2 = 0; /* RxD2 is input. */ PORT5.PMR.BIT.B0 = 1; /* TxD2 is peripheral. */ PORT5.PMR.BIT.B2 = 1; /* RxD2 is peripheral. */ IR(SCI2, RXI2) = 0; /* Clear any pending ISR. */ IR(SCI2, TXI2) = 0; IR(SCI2, TEI2) = 0; IPR(SCI2, RXI2) = BSP_CFG_SER_IPL; /* Set interrupt priority. */ IPR(SCI2, TXI2) = BSP_CFG_SER_IPL; IPR(SCI2, TEI2) = BSP_CFG_SER_IPL; IEN(SCI2, RXI2) = 1; /* Enable interrupt source. */ IEN(SCI2, TXI2) = 1; IEN(SCI2, TEI2) = 1; BSP_IntVectSet(VECT_SCI2_RXI2, (CPU_FNCT_VOID)BSP_Ser_ISR_Rx_Handler); BSP_IntVectSet(VECT_SCI2_TXI2, (CPU_FNCT_VOID)BSP_Ser_ISR_Tx_Handler); /* Set data transfer format in Serial Mode Register. */ /* -Asynchronous Mode. */ /* -8 bits. */ /* -no parity. */ /* -1 stop bit. */ /* -PCLK clock (n = 0). */ SCI2.SMR.BYTE = 0x00; SCI2.SCMR.BIT.SMIF = 0; /* Set to 0 for serial communications interface mode. */ baud_clk = 0; /* Algorithm for finding BRR value */ do { /* N = BRR (0-255), B = bit rate, n = baud clock */ brr = BSP_Ser_GetBRR(baud_clk, baud_rate); /* N = Pclk / (64 * 2^(2 * n - 1) * B) - 1 */ if (brr > 255) { baud_clk++; } } while (brr > 255); SCI2.SMR.BIT.CKS = baud_clk; SCI2.BRR = brr; for (i = 0; i < 10000; i++) { /* Wait for at least 1 bit time */ ; } /* Enable RXI and TXI interrupts in SCI peripheral. */ SCI2.SCR.BYTE |= 0x30; }
void BSP_Ser_Init (CPU_INT32U baud_rate) { FlagStatus tc_status; GPIO_InitTypeDef gpio_init; USART_InitTypeDef usart_init; USART_ClockInitTypeDef usart_clk_init; /* ------------------ INIT OS OBJECTS ----------------- */ BSP_OS_SemCreate(&BSP_SerTxWait, 0, "Serial Tx Wait"); BSP_OS_SemCreate(&BSP_SerRxWait, 0, "Serial Rx Wait"); BSP_OS_SemCreate(&BSP_SerLock, 1, "Serial Lock"); #if (BSP_CFG_SER_CMD_HISTORY_LEN > 0u) BSP_SerCmdHistory[0] = (CPU_CHAR)'\0'; #endif /* ----------------- INIT USART STRUCT ---------------- */ usart_init.USART_BaudRate = baud_rate; usart_init.USART_WordLength = USART_WordLength_8b; usart_init.USART_StopBits = USART_StopBits_1; usart_init.USART_Parity = USART_Parity_No ; usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None; usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usart_clk_init.USART_Clock = USART_Clock_Disable; usart_clk_init.USART_CPOL = USART_CPOL_Low; usart_clk_init.USART_CPHA = USART_CPHA_2Edge; usart_clk_init.USART_LastBit = USART_LastBit_Disable; BSP_PeriphEn(BSP_PERIPH_ID_USART2); BSP_PeriphEn(BSP_PERIPH_ID_IOPD); BSP_PeriphEn(BSP_PERIPH_ID_AFIO); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); /* ----------------- SETUP USART2 GPIO ---------------- */ /* Configure GPIOD.5 as push-pull. */ gpio_init.GPIO_Pin = GPIO_Pin_5; gpio_init.GPIO_Speed = GPIO_Speed_50MHz; gpio_init.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &gpio_init); /* Configure GPIOD.6 as input floating. */ gpio_init.GPIO_Pin = GPIO_Pin_6; gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &gpio_init); /* ------------------ SETUP USART2 -------------------- */ USART_Init(USART2, &usart_init); USART_ClockInit(USART2, &usart_clk_init); USART_Cmd(USART2, ENABLE); USART_ITConfig(USART2, USART_IT_TC, DISABLE); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); tc_status = USART_GetFlagStatus(USART2, USART_FLAG_TC); while (tc_status == SET) { USART_ClearITPendingBit(USART2, USART_IT_TC); USART_ClearFlag(USART2, USART_IT_TC); BSP_OS_TimeDlyMs(10); tc_status = USART_GetFlagStatus(USART2, USART_FLAG_TC); } BSP_IntVectSet(BSP_INT_ID_USART2, BSP_Ser_ISR_Handler); BSP_IntEn(BSP_INT_ID_USART2); }