959|3

253

帖子

0

资源

一粒金砂(高级)

【沁恒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 http://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=NTkzOTE0fDFkNjljNDY3NTA3ZGNjMzZhNWU4ZDE5ZDcxYzUyZTc2fDE2NTY1NDAxMzM%3D&request=yes&_f=.rar

执行后的效果图

dfdcfc2f9c088ec7a7839b124134c74.png  

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


回复

1409

帖子

3

资源

版主

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

点评

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

回复

253

帖子

0

资源

一粒金砂(高级)

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

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


回复

2

帖子

0

资源

一粒金砂(初级)

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


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

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    推荐帖子
    利用MEMS麦克风测试比较耳机的性能(三)完善扫频测试

    开始在用MEMS麦克风测试耳机时使用了扫频方式 方法是通过SensorTile的音频DAC生成指定频率的正弦信号 通过MEMS麦克风对单一频 ...

    EEWORLD DIY-无线电子冰箱贴-成品展示

    本帖最后由 北方 于 2017-12-13 11:14 编辑 1. 在冰箱贴的模块上增加外壳,展示如下。(本来应该在原贴上增加,不过发现编辑 ...

    NRF24L01模块使用

    NRF24L01模块使用 454496454497CE:模块控制线,CSN为低时,CE协同CONFIG寄存器共同决定NRF24L01状态 CSN:SPI片选线 SCK: ...

    案例分享丨大规模天线阵列系统中Doherty功放模块的应用

    作者:周鹏飞,保石,杨嘉,来自Qorvo公司 引言 近年来,随着移动互联网 ...

    【工程源码】ARM汇编指令 连载一

    本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。 虽然现在很 ...

    CircuitPython已经可以在超过 116 个开发板上运行了

    462244 https://circuitpython.org/downloads

    关闭
    站长推荐上一条 1/8 下一条

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

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

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

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