- #include "usart.h"
- void USART3_Config(void)
- {
- en_result_t enRet = Ok;
- stc_irq_regi_conf_t stcIrqRegiCfg;
- uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART3;
- #if 0
- uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \
- PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4;
- #endif
- const stc_usart_uart_init_t stcInitCfg =
- {
- UsartIntClkCkNoOutput,
- UsartClkDiv_1,
- UsartDataBits8,
- UsartDataLsbFirst,
- UsartOneStopBit,
- UsartParityNone,
- UsartSamleBit8,
- UsartStartBitFallEdge,
- UsartRtsEnable,
- };
- /* Enable peripheral clock */
- PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);
- /* Initialize USART IO */
- PORT_SetFunc(USART3_RX_PORT, USART3_RX_PIN, USART3_RX_FUNC, Disable);
- PORT_SetFunc(USART3_TX_PORT, USART3_TX_PIN, USART3_TX_FUNC, Disable);
- /* Initialize UART */
- enRet = USART_UART_Init(M4_USART3, &stcInitCfg);
- if (enRet != Ok)
- {
- while (1);
- }
- /* Set baudrate */
- enRet = USART_SetBaudrate(M4_USART3, USART_BAUDRATE);
- if (enRet != Ok)
- {
- while (1);
- }
- /* Set USART RX IRQ */
- stcIrqRegiCfg.enIRQn = Int000_IRQn;
- stcIrqRegiCfg.pfnCallback = &UsartRxIrqCallback;
- stcIrqRegiCfg.enIntSrc = USART_RI_NUM;
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
- /* Set USART RX error IRQ */
- stcIrqRegiCfg.enIRQn = Int001_IRQn;
- stcIrqRegiCfg.pfnCallback = &UsartErrIrqCallback;
- stcIrqRegiCfg.enIntSrc = USART_EI_NUM;
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
- /* Set USART TX IRQ */
- stcIrqRegiCfg.enIRQn = Int002_IRQn;
- stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
- stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
- /* Set USART TX complete IRQ */
- stcIrqRegiCfg.enIRQn = Int003_IRQn;
- stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
- stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
- enIrqRegistration(&stcIrqRegiCfg);
- NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
- NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
- NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
-
- /*Enable TX RX && RX interupt function*/
- USART_FuncCmd(M4_USART3, UsartRx, Enable);
- USART_FuncCmd(M4_USART3, UsartRxInt, Enable);
- USART_FuncCmd(M4_USART3, UsartTx, Enable);
- //USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Enable);
- //USART_FuncCmd(M4_USART3, UsartTxAndTxEmptyInt, Enable);
-
- }
- void Usart_Rx_Tx(void)
- {
- uint16_t u16RxData;
- if (Set == USART_GetStatus(M4_USART3, UsartRxNoEmpty)) /* Warit Rx data register no empty */
- {
- u16RxData = USART_RecData(M4_USART3);
- while (Reset == USART_GetStatus(M4_USART3, UsartTxEmpty)); /* Warit Tx data register empty */
- USART_SendData(M4_USART3, u16RxData);
- }
-
- }
- // uart 错误处理
- void UsartErrIrqCallback(void)
- {
- if (Set == USART_GetStatus(M4_USART3, UsartFrameErr))//帧错误
- {
- USART_ClearStatus(M4_USART3, UsartFrameErr);
- }
- if (Set == USART_GetStatus(M4_USART3, UsartParityErr))//奇偶校验错误
- {
- USART_ClearStatus(M4_USART3, UsartParityErr);
- }
- if (Set == USART_GetStatus(M4_USART3, UsartOverrunErr))//溢出错误
- {
- USART_ClearStatus(M4_USART3, UsartOverrunErr);
- }
- }
- void USART3_SendByte(void)
- {
- // while(USART3_UNIT->SR_f.TC == 0);
- // USART_SendData(USART3_UNIT, 0x55);
- }
- /**
- *******************************************************************************
- ** \brief USART TX irq callback function.
- **
- ** \param [in] None
- **
- ** \retval None
- **
- ******************************************************************************/
- static void UsartTxIrqCallback(void)
- {
- USART_SendData(M4_USART3, 'C');
- USART_FuncCmd(M4_USART3, UsartTxEmptyInt, Disable);
- USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Enable);
- }
- /**
- *******************************************************************************
- ** \brief USART TX complete irq callback function.
- **
- ** \param [in] None
- **
- ** \retval None
- **
- ******************************************************************************/
- static void UsartTxCmpltIrqCallback(void)
- {
- USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Disable);
- USART_FuncCmd(M4_USART3, UsartTx, Disable);
- }
- /**
- *******************************************************************************
- ** \brief USART RX irq callback function.
- **
- ** \param [in] None
- **
- ** \retval None
- **
- ******************************************************************************/
- static void UsartRxIrqCallback(void)
- {
- uint16_t u16RxData = USART_RecData(M4_USART3);
- while (Reset == USART_GetStatus(M4_USART3, UsartTxEmpty)); /* Warit Tx data register empty */
- USART_SendData(M4_USART3, u16RxData);
- }
H文件:
- #ifndef __USART_H__
- #define __USART_H__
- #include "hc32_ddl.h"
- #include <stdio.h>
- /* USART baudrate definition */
- #define USART_BAUDRATE (115200ul)
- /* USART3 RX Port/Pin definition */
- #define USART3_RX_PORT (PortE)
- #define USART3_RX_PIN (Pin04)
- #define USART3_RX_FUNC (Func_Usart3_Rx)
- /* USART3 TX Port/Pin definition */
- #define USART3_TX_PORT (PortE)
- #define USART3_TX_PIN (Pin05)
- #define USART3_TX_FUNC (Func_Usart3_Tx)
- /* USART interrupt number */
- #define USART_RI_NUM (INT_USART3_RI)
- #define USART_EI_NUM (INT_USART3_EI)
- #define USART_TI_NUM (INT_USART3_TI)
- #define USART_TCI_NUM (INT_USART3_TCI)
- void USART3_Config(void);
- void Usart_Rx_Tx(void);
- void UsartRxIrqCallback(void);
- void UsartTxIrqCallback(void);
- void UsartTxCmpltIrqCallback(void);
- void UsartErrIrqCallback(void);
- #endif
效果如图:
期待next.
马上把代码整理一下,附件形式送给大家,喜欢华大的产品,我是认真的,请各位同仁多多点评!