4981|3

309

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【沁恒RISC-V内核 CH582】 4 串口例程及串口调试组件评测 [复制链接]

 

MCU嵌入式的开发中,调试是必不可少的,相对一些缺少昂贵调试设备的开发者来说,就需要另辟蹊径了,因此串口调试组件,在裸机系统的作用中更加显得重要;而有操作系统的开发平台中,大多提供了这样的调试接口,如RTT的MSH组件,CDK的CLI组件等,核心均采用串口作为调试接口。

本次评测移植原子正点的USMART组件,方便今后进行调试,课通过串口输入命令实现内部函数的功能。

移植到沁恒CH582时,难度也不大,是在串口的demo中移植的,主要面临的小困难有两个,一个是串口1中断函数的改写,另一个是定时器例程的加入

废话不多说了,直接贴代码吧

/********************************** (C) COPYRIGHT *******************************
 * File Name          : Main.c
 * Author             : WCH
 * Version            : V1.0
 * Date               : 2020/08/06
 * Description 		    : 串口1收发演示
 *******************************************************************************/

#include "CH58x_common.h"
#include "usmart.h"

UINT8 TxBuff[] = "This is a tx exam\r\n";
UINT8 RcvMsg[] = "Recv:\r\n";
UINT8 RxBuff[100];
UINT8 trigB;
u8 USART1_RECEIVE_DATA[USART1_RECV_LEN];
u16 USART1_RX_STA=1;

volatile u8 Task1MS = 0;

int main()
{
  UINT8 len;

  SetSysClock( CLK_SOURCE_PLL_60MHz );

  /* 配置串口1:先配置IO口模式,再配置串口 */
  GPIOA_SetBits( GPIO_Pin_9 );
  GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );			// RXD-配置上拉输入
  GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );    // TXD-配置推挽输出,注意先让IO口输出高电平
  UART1_DefInit();
//  USART_Config();
  usmart_init(100);

#if 1       // 测试串口发送字符串
    UART1_SendString( TxBuff, sizeof( TxBuff ) );

    //TMR0_TimerInit( FREQ_SYS / 10 );                  // 设置定时时间 100ms
    R32_TMR0_CNT_END = FREQ_SYS / 1000;
        R8_TMR0_CTRL_MOD = RB_TMR_ALL_CLEAR;
        R8_TMR0_CTRL_MOD = RB_TMR_COUNT_EN;
    TMR0_ITCfg( ENABLE, TMR0_3_IT_CYC_END );          // 开启中断
    PFIC_EnableIRQ( TMR0_IRQn );
#endif   

#if 1      // 中断方式:接收数据后发送出去
    UART1_ByteTrigCfg( UART_7BYTE_TRIG );
    trigB = 7;
    UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
    PFIC_EnableIRQ( UART1_IRQn );
#endif    

    while( 1 ) {
      if(Task1MS>=100){
          Task1MS = 0;
          usmart_scan();
      }
    }
    ;
}

void Check_Usart1_Rcv(UINT8V Res)
{
    if((USART1_RX_STA&0x8000)==0)//接收未完成
    {
        if(USART1_RX_STA&0x4000)//接收到0x0d
        {
            if(Res!=0x0a) USART1_RX_STA=0;//接收错误,重新开始
            else USART1_RX_STA|=0x8000; //接收完成了
        }
        else //还没收到0x0d
        {
              if(Res==0x0d) USART1_RX_STA|=0x4000;
              else
              {
                  USART1_RECEIVE_DATA[USART1_RX_STA&0X3FFF]=Res ;
                  USART1_RX_STA++;
                  if(USART1_RX_STA>(USART1_RECV_LEN-1)) USART1_RX_STA=0;//接收数据错误,重新开始接收
              }
        }
    }
}

__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler( void )
{
    UINT8V i;

    switch ( UART1_GetITFlag() )
    {
        case UART_II_LINE_STAT :        // 线路状态错误
            UART1_GetLinSTA();
            break;

        case UART_II_RECV_RDY :          // 数据达到设置触发点
            for ( i = 0; i != trigB; i++ )
            {
                Check_Usart1_Rcv(UART1_RecvByte());
            }
            break;

        case UART_II_RECV_TOUT :         // 接收超时,暂时一帧数据接收完成
            while( R8_UART1_RFC )
            {
                Check_Usart1_Rcv(R8_UART1_RBR);
            }
            break;

        case UART_II_THR_EMPTY :         // 发送缓存区空,可继续发送
            break;

        case UART_II_MODEM_CHG :         // 只支持串口0
            break;

        default :
            break;
    }

}


另外,usmart组件也作了少些修改,主要是检测函数执行时间的代码

就采用压缩包上传了,有需要的小伙伴自取哈。

 usmart.rar https://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=NTkzOTE0fGM3ZWIyNzIwZDQ0MWM5ODdjNzcxNTQ2NmVlN2Y1ODI4fDE3Mzc2OTY0Mjc%3D&request=yes&_f=.rar

执行后的效果图

 

需要增加调试函数的,在 usmart_config.c中自行增加就可以了。

最新回复

南京沁恒的我们也在用,非常不错啊。   详情 回复 发表于 2022-3-25 11:37
点赞(1) 关注
 
 

回复
举报

7003

帖子

11

TA的资源

版主

沙发
 

对调试组件用得出神入化,感谢分享。如果不用串口中断来监控的话,会不会占用资源比较多,影响本身的性能?如果本身还有其他内容要与外部设备交互,需要怎么处理资源的分配?可否分享一下?

点评

不用中断的话,只能用查询了吧,DMA的话,资源会少用些。交互过程如果不能被打断的话,估计要设置独占或者不能打断标志了。  详情 回复 发表于 2022-3-23 20:13
 
 
 

回复

309

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2022-3-21 07:38 对调试组件用得出神入化,感谢分享。如果不用串口中断来监控的话,会不会占用资源比较多,影响本身的性能? ...

不用中断的话,只能用查询了吧,DMA的话,资源会少用些。交互过程如果不能被打断的话,估计要设置独占或者不能打断标志了。

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 

南京沁恒的我们也在用,非常不错啊。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表