打印
[综合信息]

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

[复制链接]
14106|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caizhiwei|  楼主 | 2020-7-8 23:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

使用特权

评论回复
评论
123zax 2022-7-22 14:46 回复TA
谢谢楼主! 
沙发
caizhiwei|  楼主 | 2020-7-8 23:45 | 只看该作者
抢沙发! I2C_OLED_091.rar (657.2 KB)

使用特权

评论回复
板凳
林智桂| | 2020-7-15 17:07 | 只看该作者

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

使用特权

评论回复
地板
caizhiwei|  楼主 | 2020-7-15 19:38 | 只看该作者
林智桂 发表于 2020-7-15 17:07
楼主 这个怎么下载呀,咋下载不了呀。

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

使用特权

评论回复
5
林智桂| | 2020-7-16 10:40 | 只看该作者
caizhiwei 发表于 2020-7-15 19:38
可以的呀,抢沙发!   I2C_OLED_091.rar (657.2 KB, 下载次数: 5)

点下载就报下面这个

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

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

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

使用特权

评论回复
6
woai32lala| | 2021-7-30 13:17 | 只看该作者
大佬,能请教一下华大的DMA 串口发送软件触发的问题么,从内存到外设发送。

使用特权

评论回复
7
felly1231| | 2021-9-15 18:18 | 只看该作者
Int000_IRQn这些数字中断号怎么跟uart联系的,请问大佬

使用特权

评论回复
评论
123zax 2022-7-22 15:09 回复TA
这貌似可以自由设置吧 
8
cyclefly| | 2021-9-16 18:54 | 只看该作者
这个坑,确实藏的深

使用特权

评论回复
9
saddgfsf| | 2021-11-22 17:01 | 只看该作者

没法下载啊

使用特权

评论回复
10
koala889| | 2021-12-28 10:50 | 只看该作者
真棒啊,学习

使用特权

评论回复
11
目中无神| | 2022-4-5 11:52 | 只看该作者

挺好,谢谢!

使用特权

评论回复
12
i1mcu| | 2022-5-28 16:32 | 只看该作者
这个开发板有几个串口呢?

使用特权

评论回复
13
janewood| | 2022-5-29 08:32 | 只看该作者
发送与接收,可以使用dma吗?

使用特权

评论回复
14
uytyu| | 2022-5-29 09:11 | 只看该作者
串口1的代码有吗?

使用特权

评论回复
15
pixhw| | 2022-11-10 12:16 | 只看该作者
串口发送和接受的响应速度很快吗?

使用特权

评论回复
16
sanfuzi| | 2022-11-10 13:04 | 只看该作者
能不能设置USART3作为程序更新的接口?

使用特权

评论回复
17
lihuami| | 2022-11-10 14:26 | 只看该作者
这个怎么不能使用dma呢?              

使用特权

评论回复
18
ingramward| | 2022-11-10 14:54 | 只看该作者
这个串口3的fifo是多少位?              

使用特权

评论回复
19
12345fish| | 2022-11-21 16:50 | 只看该作者
good

使用特权

评论回复
20
guijial511| | 2022-11-22 08:45 | 只看该作者
串口现在都支持智能卡模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

846

帖子

11

粉丝