UART的原理我这里就不多讲了,网上很多,自行搜索学习。
不过华大也是蛮有特点的,居然支持智能卡!
再看系统框图:
很一般,居然还没有硬件fifo,配得上M4的旗舰高配的称号吗?嘿嘿。
比如,STM32的UART还支持IRDA和LIN总线,这两个部分吗,华大是只字未提的!
总之,各家的mcu,各有特色吧~!
================================================================================
下面再说一下实验的硬件连接:
1)通过USB数据线,连接PC和板子J1。
2)打开串口助手软件SecureCRT,配置端口如下参数。
波特率:115200
数据位:8
校验位:None
停止位:1
接口函数不是很难,一个初始化,一个发送接收。
如图:这里有一个巨大的坑,一般人还找不到,如果需要使用到中断,必须到这里把使能打开才行!
一个驱动.c和.h 搞定了中断接收!接收的字符串再吐出来.
#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.
马上把代码整理一下,附件形式送给大家,喜欢华大的产品,我是认真的,请各位同仁多多点评!
|
|
谢谢楼主!