caizhiwei 发表于 2020-7-8 23:11

【华大测评】04 + USART3中断发送与接收echo!


      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 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 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 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.
马上把代码整理一下,附件形式送给大家,喜欢华大的产品,我是认真的,请各位同仁多多点评!{:lol:}

caizhiwei 发表于 2020-7-8 23:45

抢沙发!{:lol:}

林智桂 发表于 2020-7-15 17:07

caizhiwei 发表于 2020-7-8 23:45
抢沙发!

楼主 这个怎么下载呀,咋下载不了呀。

caizhiwei 发表于 2020-7-15 19:38

林智桂 发表于 2020-7-15 17:07
楼主 这个怎么下载呀,咋下载不了呀。

可以的呀,抢沙发!   I2C_OLED_091.rar (657.2 KB, 下载次数: 5)

林智桂 发表于 2020-7-16 10:40

caizhiwei 发表于 2020-7-15 19:38
可以的呀,抢沙发!   I2C_OLED_091.rar (657.2 KB, 下载次数: 5)

点下载就报下面这个

抱歉,只有特定用户可以下载本站附件

[ 中国电子网技术论坛 首页 ]

如需帮助请加管理QQ:2069179856、3326242524

woai32lala 发表于 2021-7-30 13:17

大佬,能请教一下华大的DMA 串口发送软件触发的问题么,从内存到外设发送。

felly1231 发表于 2021-9-15 18:18

Int000_IRQn这些数字中断号怎么跟uart联系的,请问大佬

cyclefly 发表于 2021-9-16 18:54

这个坑,确实藏的深

saddgfsf 发表于 2021-11-22 17:01

caizhiwei 发表于 2020-7-8 23:45
抢沙发!

没法下载啊

koala889 发表于 2021-12-28 10:50

真棒啊,学习

目中无神 发表于 2022-4-5 11:52

caizhiwei 发表于 2020-7-8 23:45
抢沙发!

挺好,谢谢!

i1mcu 发表于 2022-5-28 16:32

这个开发板有几个串口呢?

janewood 发表于 2022-5-29 08:32

发送与接收,可以使用dma吗?

uytyu 发表于 2022-5-29 09:11

串口1的代码有吗?

pixhw 发表于 2022-11-10 12:16

串口发送和接受的响应速度很快吗?

sanfuzi 发表于 2022-11-10 13:04

能不能设置USART3作为程序更新的接口?

lihuami 发表于 2022-11-10 14:26

这个怎么不能使用dma呢?            

ingramward 发表于 2022-11-10 14:54

这个串口3的fifo是多少位?            

12345fish 发表于 2022-11-21 16:50

good

guijial511 发表于 2022-11-22 08:45

串口现在都支持智能卡模式
页: [1] 2
查看完整版本: 【华大测评】04 + USART3中断发送与接收echo!