예제 #1
0
// Write data
e_MQTTSN_RETURNS_t serWriteOD(subidx_t * pSubidx, uint8_t Len, uint8_t *pBuf)
{
    uint8_t port = pSubidx->Base/10;

    assert(extSerV[port] != NULL);

    if(Len > 0)
    {
        if((extSerV[port]->pTxBuf == NULL) && hal_uart_free(port))
        {
            MQ_t * pTxBuf = mqAlloc(sizeof(MQ_t));
            if(pTxBuf == NULL)
                return MQTTSN_RET_REJ_CONG;

            memcpy(pTxBuf->raw, pBuf, Len);
            hal_uart_send(port, Len, pTxBuf->raw);

            extSerV[port]->pTxBuf = pTxBuf;
        }
        else
            return MQTTSN_RET_REJ_CONG;
    }

    return MQTTSN_RET_ACCEPTED;
}
예제 #2
0
void * UART_Get(void)
{
    uart_tx_task();
    
    // Rx Task
    static uint8_t  rx_pos = 0;
    static uint8_t  rx_len = 0;
    static MQ_t   * pRx_buf;
    static uint16_t rx_wd = 0;

    while(hal_uart_datardy(UART_PHY_PORT))
    {
        uint8_t data = hal_uart_get(UART_PHY_PORT);

        rx_wd = (HAL_get_ms() & 0xFFFF);

        if(rx_len == 0)
        {
            if((data >= 2) && (data < sizeof(MQTTSN_MESSAGE_t)))
            {
                pRx_buf = mqAlloc(sizeof(MQ_t));
                rx_len = data;
                rx_pos = 0;
            }
        }
        else
        {
            if(rx_pos < sizeof(MQTTSN_MESSAGE_t))
                pRx_buf->m.raw[rx_pos++] = data;

            if(rx_pos == rx_len)
            {
                memcpy(pRx_buf->a.phy1addr, (const void *)&uart_addr, sizeof(UART_ADDR_t));
                pRx_buf->Length = rx_len;
                rx_len = 0;
#ifdef LED_On
                LED_On();
#endif  //  LED_On
                return pRx_buf;
            }
        }
    }

    if((rx_len != 0) && (((HAL_get_ms() & 0xFFFF) - rx_wd) > 100))
    {
        rx_len = 0;
        mqFree(pRx_buf);
    }

    return NULL;
}
예제 #3
0
void * UART_Get(void)
{
    uart_tx_task();

    // Rx Task
    static uint8_t  rx_pos = 0;
    static uint8_t  rx_len = 0;
    static MQ_t   * pRx_buf;
    static uint32_t  rx_wd = 0;

    while(hal_uart_datardy(UART_PHY_PORT))
    {
        uint8_t data = hal_uart_get(UART_PHY_PORT);

        rx_wd = hal_get_ms() + 50;

        if(rx_len == 0)
        {
            if(data >= 2)
            {
                pRx_buf = mqAlloc(sizeof(MQ_t));
                if(pRx_buf != NULL)
                    rx_len = data;

                rx_pos = 0;
            }
        }
        else
        {
            if(rx_pos < sizeof(MQTTSN_MESSAGE_t))
                pRx_buf->raw[rx_pos++] = data;

            if(rx_pos == rx_len)
            {
                memcpy(pRx_buf->phy1addr, (const void *)&uart_addr, sizeof(UART_ADDR_t));
                pRx_buf->Length = rx_len;
                rx_len = 0;
                Activity(UART_PHY);
                return pRx_buf;
            }
        }
    }

    if((rx_len != 0) && (rx_wd < hal_get_ms()))
        rx_len = 0;

    return NULL;
}
예제 #4
0
void hal_uart_init_hw(uint8_t port, uint8_t nBaud, uint8_t enable)
{
    volatile uint8_t * pPort;

    switch(port)
    {
#ifdef HAL_USE_USART0
        case HAL_USE_USART0:
            pPort = &UCSR0A;

            if(enable & 1)  // Rx
            {
                UART0_PORT |= (1<<UART0_RX_PIN);
                UART0_DDR &= ~(1<<UART0_RX_PIN);
            }
            
            if(enable & 2)  // Tx
            {
                UART0_PORT |= (1<<UART0_TX_PIN);
                UART0_DDR |= (1<<UART0_TX_PIN);
            }
            break;
#endif  //  HAL_USE_USART0
#if (defined HAL_USE_USART1)
        case HAL_USE_USART1:
            pPort = &UCSR1A;

            if(enable & 1)  // Rx
            {
                UART1_PORT |= (1<<UART1_RX_PIN);
                UART1_DDR &= ~(1<<UART1_RX_PIN);
            }
            
            if(enable & 2)  // Tx
            {
                UART1_PORT |= (1<<UART1_TX_PIN);
                UART1_DDR |= (1<<UART1_TX_PIN);
            }
            break;
#endif  //  HAL_USE_USART1
#if (defined HAL_USE_USART2)
        case HAL_USE_USART2:
            pPort = &UCSR2A;
    
            if(enable & 1)  // Rx
            {
                UART2_PORT |= (1<<UART2_RX_PIN);
                UART2_DDR &= ~(1<<UART2_RX_PIN);
            }

            if(enable & 2)  // Tx
            {
                UART2_PORT |= (1<<UART2_TX_PIN);
                UART2_DDR |= (1<<UART2_TX_PIN);
            }
            break;
#endif  //  HAL_USE_USART2
#if (defined HAL_USE_USART3)
        case HAL_USE_USART3:
            pPort = &UCSR3A;

            if(enable & 1)  // Rx
            {
                UART3_PORT |= (1<<UART3_RX_PIN);
                UART3_DDR &= ~(1<<UART3_RX_PIN);
            }
            
            if(enable & 2)  // Tx
            {
                UART3_PORT |= (1<<UART3_TX_PIN);
                UART3_DDR |= (1<<UART3_TX_PIN);
            }
            break;
#endif  //  HAL_USE_USART3

        // Port not exist
        default:
            while(1);
    }

    if(hal_UARTv[port] == NULL)
    {
        hal_UARTv[port] = mqAlloc(sizeof(HAL_UART_t));

        hal_UARTv[port]->rx_head = 0;
        hal_UARTv[port]->rx_tail = 0;
        hal_UARTv[port]->tx_len = 0;
        hal_UARTv[port]->tx_pos = 0;

        uint16_t baud = pgm_read_word(&hal_baud_list[nBaud]);

        *(pPort + 5) = (baud >> 8);                     // UBRRH
        *(pPort + 4) = (baud & 0xFF);                   // UBRRL
        *(pPort + 1) = 0;                               // UCSRB
        *(pPort + 2) = (3<<UCSZ00);                     // UCSRC
    }
예제 #5
0
// Register Object
e_MQTTSN_RETURNS_t serRegisterOD(indextable_t *pIdx)
{
    uint8_t port = pIdx->sidx.Base / 10;
    uint8_t nBaud = pIdx->sidx.Base % 10;
    eObjTyp_t type = pIdx->sidx.Type;

    uint8_t TxPin, RxPin;
    hal_uart_get_pins(port, &RxPin, &TxPin);

    if(type == ObjSerTx)
    {
        if(dioCheckBase(TxPin) != 0)
            return MQTTSN_RET_REJ_INV_ID;
    }
    else
    {
        if(dioCheckBase(RxPin) == 2)
            return MQTTSN_RET_REJ_INV_ID;
    }

    if(extSerV[port] != NULL)
    {
        if(extSerV[port]->nBaud != nBaud)
            return MQTTSN_RET_REJ_INV_ID;
        
        if(type == ObjSerTx)
        {
            if(extSerV[port]->flags & EXTSER_FLAG_TXEN)
                return MQTTSN_RET_REJ_INV_ID;
        }
        else
        {
            if(extSerV[port]->flags & EXTSER_FLAG_RXEN)
                return MQTTSN_RET_REJ_INV_ID;
        }
    }
    else
    {
        extSerV[port] = mqAlloc(sizeof(EXTSER_VAR_t));
        if(extSerV[port] == NULL)
            return MQTTSN_RET_REJ_CONG;

        extSerV[port]->nBaud = nBaud;
        extSerV[port]->flags = 0;

        extSerV[port]->pRxBuf = NULL;
        extSerV[port]->RxHead = 0;
        extSerV[port]->RxTail = 0;

        extSerV[port]->pTxBuf = NULL;
    }

    if(type == ObjSerTx)
    {
        extSerV[port]->flags |= EXTSER_FLAG_TXEN;

        pIdx->cbWrite = &serWriteOD;

        dioTake(TxPin);
        hal_uart_init_hw(port, nBaud, 2);
    }
    else // ObjSerRx
    {
        if(extSerV[port]->pRxBuf == NULL)
        {
            extSerV[port]->pRxBuf = mqAlloc(sizeof(MQ_t));
            if(extSerV[port]->pRxBuf == NULL)
                return MQTTSN_RET_REJ_CONG;
        }

        extSerV[port]->flags |= EXTSER_FLAG_RXEN;
        
        pIdx->cbRead = &serReadOD;
        pIdx->cbPoll = &serPollOD;
        
        dioTake(RxPin);
        hal_uart_init_hw(port, nBaud, 1);
    }

    return MQTTSN_RET_ACCEPTED;
}
예제 #6
0
// enable bit 0 - Rx, 1 - Tx
void hal_uart_init_hw(uint8_t port, uint8_t nBaud, uint8_t enable)
{
    assert(nBaud < 5)

    USART_TypeDef     * USARTx;
    IRQn_Type           UARTx_IRQn;
    RCC_ClocksTypeDef   RCC_ClocksStatus;
    
    uint32_t            uart_clock;
    uint16_t            baud = hal_baud_list[nBaud];

    RCC_GetClocksFreq(&RCC_ClocksStatus);

#if (defined HAL_USE_USART1)
    if(port == HAL_USE_USART1)
    {
#if (defined __STM32F0XX_H)
        uart_clock = RCC_ClocksStatus.USART1CLK_Frequency;
#else
        uart_clock = RCC_ClocksStatus.PCLK2_Frequency;
#endif
    }
    else                            // USART2/3 UART4/5
#endif  //  HAL_USE_USART1
    {
#if (defined __STM32F0XX_H)
        uart_clock = RCC_ClocksStatus.PCLK_Frequency;
#else
        uart_clock = RCC_ClocksStatus.PCLK1_Frequency;
#endif
    }

    switch(port)
    {
#if (defined HAL_USE_USART1)
        case HAL_USE_USART1:
            {
            USARTx = USART1;
            UARTx_IRQn = USART1_IRQn;
            RCC->APB2ENR   |= RCC_APB2ENR_USART1EN;                             // Enable UART1 Clock
#ifndef __STM32F10x_H
            if(enable & 1) // Enable Rx
#if (defined HAL_USE_ALT_USART1)
                hal_dio_gpio_cfg(GPIOB, GPIO_Pin_7, HAL_USART1_ALT_AF);         // PB7(Rx)
#else
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_10, HAL_USART1_AF);            // PA10(Rx)
#endif  //  HAL_USE_ALT_USART1
#endif  //  __STM32F10x_H
            if(enable & 2) // Enable Tx
#if (defined HAL_USE_ALT_USART1)
                hal_dio_gpio_cfg(GPIOB, GPIO_Pin_6, HAL_USART1_ALT_AF);         // PB6(Tx)
#else
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_9, HAL_USART1_AF);             // PA9(Tx)
#endif  //  HAL_USE_ALT_USART1
            }
            break;
#endif  //  USART1

#if (defined HAL_USE_USART2)
        case HAL_USE_USART2:
            {
            USARTx = USART2;
            UARTx_IRQn = USART2_IRQn;
            RCC->APB1ENR   |= RCC_APB1ENR_USART2EN;                             // Enable UART2 Clock
            
#ifndef __STM32F10x_H
            if(enable & 1) // Enable Rx
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_3, HAL_USART2_AF);             // PA3(Rx)
#endif  //  __STM32F10x_H
            if(enable & 2) // Enable Tx
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_2, HAL_USART2_AF);             // PA2(Tx) - AF1
            }
            break;
#endif  //  USART2

#if (defined HAL_USE_USART3)
        case HAL_USE_USART3:
            {
            USARTx = USART3;
            UARTx_IRQn = USART3_IRQn;
            RCC->APB1ENR   |= RCC_APB1ENR_USART3EN;                             // Enable UART3 Clock
            
#ifndef __STM32F10x_H
            if(enable & 1) // Enable Rx
                hal_dio_gpio_cfg(GPIOB, GPIO_Pin_11, HAL_USART3_AF);            // PB11(Rx)
#endif  //  __STM32F10x_H
            if(enable & 2) // Enable Tx
                hal_dio_gpio_cfg(GPIOB, GPIO_Pin_10, HAL_USART3_AF);            // PB10(Tx)
            }
            break;
#endif  //  USART3

#if (defined HAL_USE_UART4)
        case HAL_USE_UART4:
            {
            USARTx = UART4;
            UARTx_IRQn = UART4_IRQn;
            RCC->APB1ENR   |= RCC_APB1ENR_UART4EN;                              // Enable UART4 Clock

            if(enable & 1) // Enable Rx
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_1, HAL_UART4_AF);              // PA1(Rx)
            if(enable & 2) // Enable Tx
                hal_dio_gpio_cfg(GPIOA, GPIO_Pin_0, HAL_UART4_AF);              // PA0(Tx)
            }
            break;
#endif  //  UART4

        default:
            assert(0);
    }

    if(hal_UARTv[port] == NULL)
    {
        hal_UARTv[port] = mqAlloc(sizeof(HAL_UART_t));
        assert(hal_UARTv[port] != NULL);
    }

    if(USARTx->CR1 & USART_CR1_UE)
    {
        USARTx->CR1 &= ~USART_CR1_UE;
    }
    else
    {
        hal_UARTv[port]->rx_head = 0;
        hal_UARTv[port]->rx_tail = 0;
    
        hal_UARTv[port]->pTxBuf = NULL;
        hal_UARTv[port]->tx_len = 0;
        hal_UARTv[port]->tx_pos = 0;

        USARTx->CR1 = 0;                                // Disable USART1
        USARTx->CR2 = 0;                                // 8N1
        USARTx->CR3 = 0;                                // Without flow control
        USARTx->BRR  = ((uart_clock + baud/2)/baud);    // Speed
    }
    
    if(enable & 1) // Enable Rx
        USARTx->CR1 |= USART_CR1_RE |               // Enable RX
                       USART_CR1_RXNEIE;            // Enable RX Not Empty IRQ

    if(enable & 2) // Enable Tx
        USARTx->CR1 |= USART_CR1_TE;                // Enable TX
                   
    NVIC_EnableIRQ(UARTx_IRQn);                     // Enable UASRT IRQ
    USARTx->CR1 |= USART_CR1_UE;                    // Enable USART
}