123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- /* Copyright Statement:
- *
- * This software/firmware and related documentation ("AutoChips Software") are
- * protected under relevant copyright laws. The information contained herein is
- * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
- * the prior written permission of AutoChips inc. and/or its licensors, any
- * reproduction, modification, use or disclosure of AutoChips Software, and
- * information contained herein, in whole or in part, shall be strictly
- * prohibited.
- *
- * AutoChips Inc. (C) 2016. All rights reserved.
- *
- * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
- * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
- * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
- * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
- * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
- * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
- * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
- * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
- * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
- * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
- * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
- * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
- * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
- * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
- * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
- * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
- * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
- * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
- */
- #include <string.h>
- #include "ac780x_uart.h"
- #include "ac780x_gpio.h"
- #include "ac780x_timer.h"
- /*
- * 本例程通过使用DMA以及UART空闲中断,实现UART DMA收发,并在UART空闲中断中处理接收的数据
- */
- #define PERH_BUS_CLK (24000000U)
- #define TIM_CHN2_PRD_1ms (PERH_BUS_CLK / 1000 - 1)
- #define UARTx UART0
- #define UARTx_IRQn UART0_IRQn
- #define RS485CTRL_PORT (GPIOB)
- #define RS485CTRL_PIN (GPIO_PIN3)
- #define RS485_TX_EN do{GPIO_SetPinLevel(RS485CTRL_PORT, RS485CTRL_PIN, GPIO_LEVEL_HIGH);}while(0)
- #define RS485_RX_EN do{GPIO_SetPinLevel(RS485CTRL_PORT, RS485CTRL_PIN, GPIO_LEVEL_LOW);}while(0)
- #define RUNLED_PORT (GPIOA)
- #define RUNLED_PIN (GPIO_PIN2)
- /*RUNLED动作定义.*/
- #define RUNLED_ON do{GPIO_SetPinLevel(RUNLED_PORT, RUNLED_PIN, GPIO_LEVEL_HIGH);}while(0)
- #define RUNLED_OFF do{GPIO_SetPinLevel(RUNLED_PORT, RUNLED_PIN, GPIO_LEVEL_LOW);}while(0)
- #define RUNLED_TOGGLE do{if(GPIO_GetPinLevel(RUNLED_PORT, RUNLED_PIN)){RUNLED_OFF;}else{RUNLED_ON;}}while(0)
- #define BaudRate 9600
- #define UART_TRANSMIT_DATA_POOL_COUNT 64
- #define UART_RECV_DATA_POOL_COUNT 64
- ///这里DMA mem设置为32bit模式,所以DMA传输的buffer必须4字节对齐
- uint32_t dmaRxBuf[UART_RECV_DATA_POOL_COUNT>>2];
- uint32_t dmaTxBuf[UART_TRANSMIT_DATA_POOL_COUNT>>2];
- uint8_t *rxBuf = (uint8_t *)dmaRxBuf;
- uint8_t *txBuf = (uint8_t *)dmaTxBuf;
- uint8_t trans_finished = 1;
- uint16_t g_scanKeyTime; /*扫描按键间隔时间*/
- uint16_t g_blinkLedTime; /*LED闪烁频率控制时间*/
- uint16_t g_blinkLedTgtTime; /*LED目标闪烁频率*/
- /**
- * UARTTX_DMA_EventCallback
- *
- * @param[in] device: DMA_Type pointer
- * @param[in] wpara: DMA Channel Status
- * @param[in] lpara: reserve for user's code
- * @return none
- *
- * @brief uart transmit event callback
- */
- void UartTxDMAEventCallback(void *device, uint32_t wpara, uint32_t lpara)
- {
- if (wpara & DMA_CHANNEL_STATUS_FINISH_Msk) //!<DMA finish
- {
- //RS485_RX_EN;
- trans_finished = 100;
- }
- else if (wpara & DMA_CHANNEL_STATUS_HALF_FINISH_Msk) //!<DMA half finish
- {
-
- }
- else if (wpara & DMA_CHANNEL_STATUS_TRANS_ERROR_Msk) //!<DMA error
- {
-
- }
- else
- {
- //!<never be here
- }
- }
- /**
- * UARTRX_DMA_EventCallback
- *
- * @param[in] device: DMA_Type pointer
- * @param[in] wpara: DMA Channel Status
- * @param[in] lpara: reserve for user's code
- * @return none
- *
- * @brief uart dma receive handle
- */
- static void UartRxDMAEventCallback(void *device, uint32_t wpara, uint32_t lpara)
- {
- /* Check if DMA Channel Receive Complete */
- if (wpara & DMA_CHANNEL_STATUS_FINISH_Msk) //!<DMA finish
- {
- }
- else if (wpara & DMA_CHANNEL_STATUS_HALF_FINISH_Msk) //!<DMA half finish
- {
-
- }
- else if (wpara & DMA_CHANNEL_STATUS_TRANS_ERROR_Msk) //!<DMA error
- {
-
- }
- else
- {
- //!<never be here
- }
- }
- /**
- * UARTRX_DMA_EventCallback
- *
- * @param[in] device: UART_Type pointer
- * @param[in] wpara: UART lsr0 register
- * @param[in] lpara: UART lsr1 register
- * @return none
- *
- * @brief uart dma receive handle
- */
- static void UartRxIdleCallBack(void *device, uint32_t wpara, uint32_t lpara)
- {
- /* Check if IDLE interrupt happened */
- if (lpara & UART_LSR1_IDLE_Msk)
- {
- uint16_t recLen;
- uint16_t index;
- ///接收不足4字节会在DMA fifo中缓存
- recLen = DMA0_CHANNEL1->DATA_TRANS_NUM + DMA0_CHANNEL1->FIFO_LEFT_NUM;
- ///将DMA fifo数据flush出来,因为mem设置为32bit,所以fifo也是4字节对齐
- ///(即使fifo里只有1个字节也会刷出4字节,需要保证缓存冗余不会溢出)
- DMA_ChannelFlush(DMA0_CHANNEL1);
- for (index=0;index<recLen;index++)
- {
- txBuf[index] = rxBuf[index];
- }
-
- RS485_TX_EN;
- trans_finished = 1;
- UART_TransmitDMA(UARTx, DMA0_CHANNEL0, txBuf, recLen, UartTxDMAEventCallback);
- UART_ReceiveDMA(UARTx, DMA0_CHANNEL1, rxBuf, UART_RECV_DATA_POOL_COUNT, UartRxDMAEventCallback);
- }
- }
- /*************<prototype>**************/
- void TIM_CHN2_Callback(void *device, uint32_t wpara, uint32_t lpara);
- /**
- * @prototype TIMER_PrdInit(void)
- *
- * @param[in] void
- * @return void
- *
- * @brief 初始化定时器通道2.
- */
- void TIMER_PrdInit(void)
- {
- TIMER_ConfigType tmrConfig;
-
- /*清零变量.*/
- memset(&tmrConfig, 0x00, sizeof(tmrConfig));
-
- /*配置定时器.*/
- tmrConfig.linkModeEn = DISABLE;
- tmrConfig.interruptEn = ENABLE;
- tmrConfig.periodValue = TIM_CHN2_PRD_1ms;
- tmrConfig.timerEn = ENABLE;
- tmrConfig.callBack = TIM_CHN2_Callback;
- TIMER_Init(TIMER_CHANNEL2, &tmrConfig);
- }
- /**
- * @prototype TIM_CHN2_Callback(void *device, uint32_t wpara, uint32_t lpara)
- *
- * @param[in] ...
- * @return void
- *
- * @brief 定时器通道2中断回调函数.
- */
- void TIM_CHN2_Callback(void *device, uint32_t wpara, uint32_t lpara)
- {
- if (g_scanKeyTime < 0xFFFF)
- {
- g_scanKeyTime++;
- }
-
- if (g_blinkLedTime < 0xFFFF)
- {
- g_blinkLedTime++;
- }
-
- if(trans_finished > 0 ){
- trans_finished++;
- }
-
- }
- /**
- * Basic_uart
- *
- * @param[in] none
- * @return none
- *
- * @brief Basic_uart function
- */
- void Basic_uart(void)
- {
- uint8_t i = 0;
- UART_ConfigType uartConfig;
- memset((void *)&uartConfig, 0, sizeof(UART_ConfigType));
- //set pin mux
- GPIO_SetFunc(GPIOA, GPIO_PIN7, GPIO_FUN1);
- GPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN1);
-
- //GPIO_SetDir(GPIOA, GPIO_PIN7, GPIO_OUT);
- //GPIO_SetPullup(GPIOA, GPIO_PIN7, ENABLE);
- //GPIO_SetDir(GPIOA, GPIO_PIN8, GPIO_IN);
-
- GPIO_SetFunc(RS485CTRL_PORT, RS485CTRL_PIN, GPIO_FUN0);
- GPIO_SetDir(RS485CTRL_PORT, RS485CTRL_PIN, GPIO_OUT);
-
- GPIO_SetFunc(RUNLED_PORT, RUNLED_PIN, GPIO_FUN0);
- GPIO_SetDir(RUNLED_PORT, RUNLED_PIN, GPIO_OUT);
-
- uartConfig.baudrate = BaudRate;
- uartConfig.dataBits = UART_WORD_LEN_8BIT;
- uartConfig.stopBits = UART_STOP_1BIT;
- uartConfig.parity = UART_PARI_NO;
- uartConfig.fifoByteEn = ENABLE; ///<must enable fifoByte when use DMA
- uartConfig.dmaEn = UART_DMA_TXRX_EN;
-
-
- uartConfig.callBack = UartRxIdleCallBack; ///<uart2 interrupt callback
- UART_Init(UARTx, &uartConfig);
- UARTx->IDLE |= UART_IDLE_IDLEIE_Msk | UART_IDLE_ILEN_Msk; ///<enable uart idle interrupt
-
- ///Enable UARTx interrupt
- NVIC_SetPriority(UARTx_IRQn, 3);
- NVIC_ClearPendingIRQ(UARTx_IRQn);
- NVIC_EnableIRQ(UARTx_IRQn);
-
- TIMER_PrdInit();
-
- /* Initializing data in the txBuf */
-
- for (i = 0; i < 10; i++)
- {
- txBuf[i] = i + 1;
- }
-
- RS485_TX_EN;
- trans_finished = 1;
- UART_TransmitDMA(UARTx, DMA0_CHANNEL0, txBuf, 10, UartTxDMAEventCallback);
-
- UART_ReceiveDMA(UARTx, DMA0_CHANNEL1, rxBuf, UART_RECV_DATA_POOL_COUNT, UartRxDMAEventCallback);
-
- while(1){
-
- if (g_scanKeyTime >= 1000)/*定时周期到,扫描按键动作.*/
- {
- g_scanKeyTime = 0;
- RUNLED_TOGGLE;
- }
-
- if(trans_finished >= 120){
- trans_finished = 0;
- RS485_RX_EN;
- }
-
-
- /*
- do{
- if(GPIO_GetPinLevel(GPIOA, GPIO_PIN7)){
- GPIO_SetPinLevel(GPIOA, GPIO_PIN7, GPIO_LEVEL_LOW);
- }else{
- GPIO_SetPinLevel(GPIOA, GPIO_PIN7, GPIO_LEVEL_HIGH);
-
- }
- }while(0);
- */
-
- //RS485_TX_EN;
- //UART_TransmitDMA(UARTx, DMA0_CHANNEL0, txBuf, 10, UartTxDMAEventCallback);
- }
- }
|