收藏0 举报
/**********NV32F100x--串口接收中断例程**********/ #include "common.h" #include "ics.h" #include "etm.h" #include "uart.h" #include "sysinit.h" void UART_Rec(void); int main (void) { UART_ConfigType sConfig; sysinit();//系统初始化 sConfig.u32SysClkHz = BUS_CLK_HZ;//时钟配置 sConfig.u32Baudrate = UART_PRINT_BITRATE;//波特率配置 UART_SetCallback(UART_Rec);//设置串口中断回调入口 UART_Init(UART1,&sConfig);//初始化串口1 NVIC_EnableIRQ(UART1_IRQn); printf("\nRunning the UART_Recint_demo project.\n"); UART_EnableRxBuffFullInt(UART1);//开启UART1接收中断 while(1) { } } /********ISR*********/ void UART_Rec(void) { uint8_t fip; if(UART1->S1 & UART_S1_RDRF_MASK)//判别接收是否已满 { fip = UART1->D; UART_PutChar(UART1,fip+1);//打印输入的字符+1后到UART1 } }
/****************************************************************************** * * [url=home.php?mod=space&uid=247401]@brief[/url] providing common UART API. * ******************************************************************************/ #include "UART_app.h" static uint8_t *pUART_TxBuff[MAX_UART_NO] = {NULL}; /* pointer to RxBuf */ static uint8_t *pUART_RxBuff[MAX_UART_NO] = {NULL}; /* pointer to TxBuf */ static uint16_t gu16UART_TxBuffPos[MAX_UART_NO] = {0}; /* write position to RxBuf */ static uint16_t gu16UART_RxBuffPos[MAX_UART_NO] = {0}; /* read position to TxBuf */ static uint32_t gu32UART_BuffSize[MAX_UART_NO] = {0}; /* buffer size*/ UART_TxDoneCallbackType UART_TxDoneCallback[MAX_UART_NO] = {NULL}; UART_RxDoneCallbackType UART_RxDoneCallback[MAX_UART_NO] = {NULL}; /*****************************************************************************//*! * * @brief send a series of charecters using interrupt mode. * * @param[in] pUART base of UART port * @param[in] pSendBuff pointer of charecters to send * @param[in] u32Length number of charecters * * [url=home.php?mod=space&uid=266161]@return[/url] none * * [url=home.php?mod=space&uid=72445]@[/url] Pass/ Fail criteria: *****************************************************************************/ void UART_SendInt(UART_Type *pUART, uint8_t *pSendBuff, uint32_t u32Length) { uint8_t u8Port = ((uint32_t)pUART-(uint32_t)UART0)>>12; /* save user defined send buffer pointers and size */ pUART_TxBuff[u8Port] = pSendBuff; gu32UART_BuffSize[u8Port] = u32Length; gu16UART_TxBuffPos[u8Port] = 0; UART_EnableTxBuffEmptyInt(pUART); /* enable tx interrupt */ } /*****************************************************************************//*! * * @brief receive a series of charecters using interrupt mode. * * @param[in] pUART base of UART port * @param[in] pSendBuff pointer of charecters to send * @param[in] u32Length number of charecters * * @return none * * @ Pass/ Fail criteria: *****************************************************************************/ void UART_ReceiveInt(UART_Type *pUART, uint8_t *pReceiveBuff, uint32_t u32Length) { uint8_t u8Port = ((uint32_t)pUART-(uint32_t)UART0)>>12; /* save user defined read buffer pointers and size */ pUART_RxBuff[u8Port] = pReceiveBuff; gu32UART_BuffSize[u8Port] = u32Length; gu16UART_RxBuffPos[u8Port] = 0; UART_EnableRxBuffFullInt(pUART); /* enable rx interrupt */ } void UART_HandleInt(UART_Type *pUART) { uint8_t u8Port; uint8_t *pRdBuff; uint8_t *pWrBuff; volatile uint8_t read_temp = 0; u8Port = ((uint32_t)pUART-(uint32_t)UART0)>>12; /* check overrun flag */ if(UART_CheckFlag(pUART,UART_FlagOR)) { read_temp = UART_ReadDataReg(pUART); } /* check receiver */ else if(UART_IsRxBuffFull(pUART)) { /* there's data received in rx buffer */ pRdBuff = pUART_RxBuff[u8Port]; /* get user read buffer */ read_temp = UART_ReadDataReg(pUART); pRdBuff[gu16UART_RxBuffPos[u8Port]++]= read_temp; /* save received data */ //pRdBuff[gu16UART_RxBuffPos[u8Port]++] = UART_ReadDataReg(pUART); if(gu16UART_RxBuffPos[u8Port] == gu32UART_BuffSize[u8Port]) { /* User read buffer is full, end receive */ UART_DisableRxBuffFullInt(pUART); if (UART_RxDoneCallback[u8Port]) { /* call back function to tell user that rx is done */ UART_RxDoneCallback[u8Port](); } } } /* check transmitter */ else if(UART_IsTxBuffEmpty(pUART)) { if(gu16UART_TxBuffPos[u8Port] != gu32UART_BuffSize[u8Port]) { /* user tx buffer not empty */ pWrBuff = pUART_TxBuff[u8Port]; UART_WriteDataReg(pUART, pWrBuff[gu16UART_TxBuffPos[u8Port]++]); } else { UART_DisableTxBuffEmptyInt(pUART); if (UART_TxDoneCallback[u8Port]) { /* call back function to tell user that tx is done */ UART_TxDoneCallback[u8Port](); } } } else { /* default interrupt */ } } void UART_SetTxDoneCallback(UART_Type *pUART, UART_TxDoneCallbackType pfnCallback) { uint8_t u8Port = ((uint32_t)pUART-(uint32_t)UART0)>>12; UART_TxDoneCallback[u8Port] = pfnCallback; } void UART_SetRxDoneCallback(UART_Type *pUART, UART_RxDoneCallbackType pfnCallback) { uint8_t u8Port = ((uint32_t)pUART-(uint32_t)UART0)>>12; UART_RxDoneCallback[u8Port] = pfnCallback; }
/****************************************************************************** * File: isr.h * Purpose: Define interrupt service routines referenced by the vector table. * Note: Only "vectors.c" should include this header file. ******************************************************************************/ #ifndef __ISR_H #define __ISR_H /* Example */ /* #undef VECTOR_036 #define VECTOR_036 RTC_Isr // ISR(s) are defined in your project directory. extern void RTC_Isr(void); */ #undef VECTOR_036 #define VECTOR_036 RTC_Isr #undef VECTOR_028 #undef VECTOR_029 #undef VECTOR_030 #define VECTOR_028 UART0_Isr #define VECTOR_029 UART1_Isr #define VECTOR_030 UART2_Isr extern void RTC_Isr(void); extern void UART0_Isr(void); extern void UART1_Isr(void); extern void UART2_Isr(void); #endif //__ISR_H /* End of "isr.h" */
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
24
215
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号