【沁恒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中自行增加就可以了。
|