| ÒªÓõ½µÄÊÇ´®¿Ú¿ÕÏÐÖÐ¶Ï ÌØ±ðÖ÷Òª£¬Èç¹û¿ªÆôÁËdmaÓ³É䣬һ¶¨¼ÇµÃÒª¿ªÆôsyscfgÀïÃæµÄʱÖÓ£¬ /* ************************************************************** **Ãû³Æ: void UART_DMA_Config() **¹¦ÄÜ: UART³õʼ»¯ **Èë¿Ú: ÎÞ **³ö¿Ú: ÎÞ ************************************************************** */ void UART_DMA_ConfigTx(DMA_Channel_TypeDef*DMA_CHx,ulong cpar,ulong cmar) { RCC->AHBENR |= RCC_AHBENR_DMA1EN; Afx_Delayus(100); DMA_CHx->CPAR = cpar; //Ô´ DMA_CHx->CMAR = cmar; DMA_CHx->CCR = 0X00000000; DMA_CHx->CCR = DMA_CCR_MINC|DMA_CCR_DIR;//memory inc ,read from memory } /* ************************************************************** **Ãû³Æ: void UART_DMA_ConfigRx() **¹¦ÄÜ: UART³õʼ»¯ **Èë¿Ú: ÎÞ **³ö¿Ú: ÎÞ ************************************************************** */ void UART_DMA_ConfigRx(DMA_Channel_TypeDef*DMA_CHx,ulong cpar,ulong cmar) { RCC->AHBENR |= RCC_AHBENR_DMA1EN; Afx_Delayus(100); DMA_CHx->CPAR = cpar; //Ô´ DMA_CHx->CMAR = cmar; DMA_CHx->CNDTR= 100; DMA_CHx->CCR = 0X00000000; DMA_CHx->CCR = DMA_CCR_MINC;//ÍâÉèºÍÄÚ´æ¶¼8×Ö½Ú£¬ÄÚ´æµÝÔö£¬ÍâÉè¹Ì¶¨£¬²»Æô¶¯Ñ»·Ä£Ê½£¬´ÓÍâÉè¶ÁÈ¡£¬Í¨µÀ²»Ê¹ÄÜÖÐ¶Ï } /* ************************************************************** **Ãû³Æ: void Afx_UARTInit() **¹¦ÄÜ: UART³õʼ»¯ **Èë¿Ú: ÎÞ **³ö¿Ú: ÎÞ ************************************************************** */ void Afx_UARTInit(void) { RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->APB2RSTR|=RCC_APB2RSTR_USART1RST; //¸´Î»´®¿Ú1 RCC->APB2RSTR&=~RCC_APB2RSTR_USART1RST; //Í£Ö¹¸´Î» // UARTA 485 USART1->BRR = 480000 / 96; USART1->CR1 = USART_CR1_TE|USART_CR1_RE|USART_CR1_UE|USART_CR1_IDLEIE; //USART_CR1_RXNEIE|½ÓÊÜÖжÏÔÊÐí£¬½ÓÊÕ·¢ËÍʹÄÜ£¬¿ª Æô´®¿Ú USART1->CR3 = USART_CR3_DMAT|USART_CR3_DMAR; //·¢ËÍdmaʹÄÜ UART_DMA_ConfigTx(DMA1_Channel2,(ulong)&USART1->TDR,(ulong)iSendBuf); UART_DMA_ConfigRx(DMA1_Channel3,(ulong)&USART1->RDR,(ulong)RX485_fifo.buff); while((USART1->ISR & USART_ISR_TC) != USART_ISR_TC); /* polling idle frame Transmission */ USART1->ICR |= USART_ICR_TCCF; /* Clear TC flag */ DMA1_Channel3->CCR |= DMA_CCR_EN; NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn); } void Afx_UartDmaEnable(DMA_Channel_TypeDef*DMA_CHx,uchar len) { DMA_CHx->CCR&=~(1<<0); //¹Ø±ÕÏÈ DMA_CHx->CNDTR=len; //ÅäÖó¤¶È£¬Ä¿±êºÍÔ´ÔÚ³õʼ»¯µÄʱºòÒѾÓÐÅäÖà DMA_CHx->CCR|=1<<0; //¿ªÆô´«Êä } /* ************************************************************** **Ãû³Æ: void USART1_IRQHandler() **¹¦ÄÜ: UART1Öжϴ¦Àí **Èë¿Ú: ÎÞ **³ö¿Ú: ÎÞ ************************************************************** */ void USART1_IRQHandler(void) { ulong rtem; uchar rGetUartLenth = 0; rtem = USART1->ISR; if((rtem & USART_ISR_IDLE) == USART_ISR_IDLE) { rGetUartLenth = USART1->RDR; //ÇåUSART_IT_IDLE±êÖ¾ DMA1_Channel3->CCR &= ~DMA_CCR_EN; rGetUartLenth = 100 - DMA1_Channel3->CNDTR; DMA1_Channel3->CNDTR = 100; RX485_fifo.ct = rGetUartLenth; DMA1_Channel3->CCR |= DMA_CCR_EN; gRs485Modbus.rNewFramDelay = 0; gRs485Modbus.rCTRL_BYTE.RecData = START; } USART1->RQR |= USART_RQR_RXFRQ; USART1->ICR |= USART_ICR_ORECF|USART_ICR_IDLECF; } ´®¿ÚModbusУÑé´¦ÀíÈçÏ //************************************************************************ // name : // Descrp: ½ÓÊպͽâÃܱ¨ÎÄ // input : // return: // author: // date : //************************************************************************ uchar Afx_Rs485ModbusCommSrtingRecv( uchar *comm_buf)//comm_buf-->ModbusRevBuf È«²¿Êý¾Ý { uchar sta_val = FAIL; uchar i = 0; if(gRs485Modbus.rCTRL_BYTE.rModbusNewFram == ModbusReady) //³¬Ê± ¡¢ Êý¾Ý֡β { gRs485Modbus.rCTRL_BYTE.rModbusNewFram = ModbusNotReady; if(RX485_fifo.ct >= 5)//gRs232Modbus.MinRecNum { INT_BITS CRCData; INT_BITS CRCDataHL; CRCData.Val = Afx_CRCCheckSumByte(comm_buf,RX485_fifo.ct-2); CRCDataHL.v[0] = comm_buf[RX485_fifo.ct-2]; CRCDataHL.v[1] = comm_buf[RX485_fifo.ct-1]; if (CRCData.Val == CRCDataHL.Val) { gRs485Modbus.RecValueCount = RX485_fifo.ct; sta_val = PASS; } for(i = 0;i<RX485_fifo.ct;i++) { *comm_buf = RX485_fifo.buff; comm_buf++; } } RX485_fifo.ct = 0; } return sta_val; } |
| »¶Ó¹âÁÙ Ñ¸Î¬Íø (https://www.chinafix.com/) | Powered by Discuz! X3.4 |