搜索

[综合信息] 【华大测评】04 + USART3中断发送与接收echo!

[复制链接]
2607|4
 楼主 | 2020-7-8 23:11 | 显示全部楼层 |阅读模式

      UART的原理我这里就不多讲了,网上很多,自行搜索学习。
不过华大也是蛮有特点的,居然支持智能卡!
493615f05df4e1b735.png
再看系统框图:
672155f05e01f1058d.png
很一般,居然还没有硬件fifo,配得上M4的旗舰高配的称号吗?嘿嘿。
比如,STM32的UART还支持IRDA和LIN总线,这两个部分吗,华大是只字未提的!
总之,各家的mcu,各有特色吧~!
================================================================================
下面再说一下实验的硬件连接:

1)通过USB数据线,连接PC和板子J1。
2)打开串口助手软件SecureCRT,配置端口如下参数。
     波特率:115200
     数据位:8
     校验位:None
     停止位:1


接口函数不是很难,一个初始化,一个发送接收。
如图:这里有一个巨大的坑,一般人还找不到,如果需要使用到中断,必须到这里把使能打开才行!
379405f05dae3468df.png

一个驱动.c和.h 搞定了中断接收!接收的字符串再吐出来.
  1. #include "usart.h"


  2. void USART3_Config(void)
  3. {
  4.         en_result_t enRet = Ok;
  5.     stc_irq_regi_conf_t stcIrqRegiCfg;
  6.         uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART3;
  7. #if 0       
  8.         uint32_t u32Fcg1Periph = PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | \
  9.                              PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4;
  10. #endif       
  11.         const stc_usart_uart_init_t stcInitCfg =
  12.         {
  13.                 UsartIntClkCkNoOutput,
  14.                 UsartClkDiv_1,
  15.                 UsartDataBits8,
  16.                 UsartDataLsbFirst,
  17.                 UsartOneStopBit,
  18.                 UsartParityNone,
  19.                 UsartSamleBit8,
  20.                 UsartStartBitFallEdge,
  21.                 UsartRtsEnable,
  22.         };

  23.         /* Enable peripheral clock */
  24.         PWC_Fcg1PeriphClockCmd(u32Fcg1Periph, Enable);

  25.         /* Initialize USART IO */
  26.         PORT_SetFunc(USART3_RX_PORT, USART3_RX_PIN, USART3_RX_FUNC, Disable);
  27.         PORT_SetFunc(USART3_TX_PORT, USART3_TX_PIN, USART3_TX_FUNC, Disable);

  28.         /* Initialize UART */
  29.         enRet = USART_UART_Init(M4_USART3, &stcInitCfg);
  30.         if (enRet != Ok)
  31.         {
  32.                 while (1);       
  33.         }

  34.         /* Set baudrate */
  35.         enRet = USART_SetBaudrate(M4_USART3, USART_BAUDRATE);
  36.         if (enRet != Ok)
  37.         {
  38.                 while (1);       
  39.         }

  40.          /* Set USART RX IRQ */
  41.     stcIrqRegiCfg.enIRQn = Int000_IRQn;
  42.     stcIrqRegiCfg.pfnCallback = &UsartRxIrqCallback;
  43.     stcIrqRegiCfg.enIntSrc = USART_RI_NUM;
  44.     enIrqRegistration(&stcIrqRegiCfg);
  45.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
  46.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
  47.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);

  48.     /* Set USART RX error IRQ */
  49.     stcIrqRegiCfg.enIRQn = Int001_IRQn;
  50.     stcIrqRegiCfg.pfnCallback = &UsartErrIrqCallback;
  51.     stcIrqRegiCfg.enIntSrc = USART_EI_NUM;
  52.     enIrqRegistration(&stcIrqRegiCfg);
  53.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
  54.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
  55.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);

  56.     /* Set USART TX IRQ */
  57.     stcIrqRegiCfg.enIRQn = Int002_IRQn;
  58.     stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback;
  59.     stcIrqRegiCfg.enIntSrc = USART_TI_NUM;
  60.     enIrqRegistration(&stcIrqRegiCfg);
  61.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
  62.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
  63.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);

  64.     /* Set USART TX complete IRQ */
  65.     stcIrqRegiCfg.enIRQn = Int003_IRQn;
  66.     stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback;
  67.     stcIrqRegiCfg.enIntSrc = USART_TCI_NUM;
  68.     enIrqRegistration(&stcIrqRegiCfg);
  69.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
  70.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
  71.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
  72.        
  73.         /*Enable TX RX && RX interupt function*/
  74.     USART_FuncCmd(M4_USART3, UsartRx, Enable);
  75.     USART_FuncCmd(M4_USART3, UsartRxInt, Enable);
  76.         USART_FuncCmd(M4_USART3, UsartTx, Enable);
  77.         //USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Enable);
  78.         //USART_FuncCmd(M4_USART3, UsartTxAndTxEmptyInt, Enable);
  79.                        
  80. }


  81. void Usart_Rx_Tx(void)
  82. {
  83.         uint16_t u16RxData;
  84.         if (Set == USART_GetStatus(M4_USART3, UsartRxNoEmpty))         /* Warit Rx data register no empty */
  85.     {
  86.         u16RxData = USART_RecData(M4_USART3);
  87.         while (Reset == USART_GetStatus(M4_USART3, UsartTxEmpty));  /* Warit Tx data register empty */
  88.         USART_SendData(M4_USART3, u16RxData);
  89.     }
  90.    
  91. }

  92. // uart 错误处理
  93. void UsartErrIrqCallback(void)
  94. {
  95.     if (Set == USART_GetStatus(M4_USART3, UsartFrameErr))//帧错误
  96.     {
  97.         USART_ClearStatus(M4_USART3, UsartFrameErr);
  98.     }

  99.     if (Set == USART_GetStatus(M4_USART3, UsartParityErr))//奇偶校验错误
  100.     {
  101.         USART_ClearStatus(M4_USART3, UsartParityErr);
  102.     }

  103.     if (Set == USART_GetStatus(M4_USART3, UsartOverrunErr))//溢出错误
  104.     {
  105.         USART_ClearStatus(M4_USART3, UsartOverrunErr);
  106.     }
  107. }


  108. void USART3_SendByte(void)
  109. {
  110. //   while(USART3_UNIT->SR_f.TC == 0);
  111.   //  USART_SendData(USART3_UNIT, 0x55);
  112. }

  113. /**
  114. *******************************************************************************
  115. ** \brief USART TX irq callback function.
  116. **
  117. ** \param [in] None
  118. **
  119. ** \retval None
  120. **
  121. ******************************************************************************/
  122. static void UsartTxIrqCallback(void)
  123. {
  124.     USART_SendData(M4_USART3, 'C');
  125.     USART_FuncCmd(M4_USART3, UsartTxEmptyInt, Disable);
  126.     USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Enable);
  127. }

  128. /**
  129. *******************************************************************************
  130. ** \brief USART TX complete irq callback function.
  131. **
  132. ** \param [in] None
  133. **
  134. ** \retval None
  135. **
  136. ******************************************************************************/
  137. static void UsartTxCmpltIrqCallback(void)
  138. {
  139.     USART_FuncCmd(M4_USART3, UsartTxCmpltInt, Disable);
  140.     USART_FuncCmd(M4_USART3, UsartTx, Disable);
  141. }


  142. /**
  143. *******************************************************************************
  144. ** \brief USART RX irq callback function.
  145. **
  146. ** \param [in] None
  147. **
  148. ** \retval None
  149. **
  150. ******************************************************************************/
  151. static void UsartRxIrqCallback(void)
  152. {  
  153.         uint16_t u16RxData = USART_RecData(M4_USART3);
  154.         while (Reset == USART_GetStatus(M4_USART3, UsartTxEmpty));  /* Warit Tx data register empty */
  155.         USART_SendData(M4_USART3, u16RxData);
  156. }

复制代码
H文件:
  1. #ifndef __USART_H__
  2. #define __USART_H__

  3. #include "hc32_ddl.h"
  4. #include <stdio.h>

  5. /* USART baudrate definition */
  6. #define USART_BAUDRATE                  (115200ul)

  7. /* USART3 RX Port/Pin definition */
  8. #define USART3_RX_PORT                   (PortE)
  9. #define USART3_RX_PIN                    (Pin04)
  10. #define USART3_RX_FUNC                   (Func_Usart3_Rx)

  11. /* USART3 TX Port/Pin definition */
  12. #define USART3_TX_PORT                   (PortE)
  13. #define USART3_TX_PIN                    (Pin05)
  14. #define USART3_TX_FUNC                   (Func_Usart3_Tx)

  15. /* USART interrupt number  */
  16. #define USART_RI_NUM                    (INT_USART3_RI)
  17. #define USART_EI_NUM                    (INT_USART3_EI)
  18. #define USART_TI_NUM                    (INT_USART3_TI)
  19. #define USART_TCI_NUM                   (INT_USART3_TCI)

  20. void USART3_Config(void);

  21. void Usart_Rx_Tx(void);

  22. void UsartRxIrqCallback(void);

  23. void UsartTxIrqCallback(void);

  24. void UsartTxCmpltIrqCallback(void);

  25. void UsartErrIrqCallback(void);

  26. #endif
复制代码


效果如图:
616455f05e1559b356.png

期待next.
马上把代码整理一下,附件形式送给大家,喜欢华大的产品,我是认真的,请各位同仁多多点评!

使用特权

评论回复
 楼主 | 2020-7-8 23:45 | 显示全部楼层
抢沙发! I2C_OLED_091.rar (657.2 KB, 下载次数: 12)

使用特权

评论回复
| 2020-7-15 17:07 | 显示全部楼层

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

使用特权

评论回复
 楼主 | 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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表