1375|1

208

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

[极海M3内核 APM32E103VET6S MINI开发板]02.USART在线交互功能 [复制链接]

 

APM32E103VET6S MINI开发板带有一个DB9的RS-232接口,通过J3跳帽来选择连接的是MCU的USART1还是USART2端口引脚,如下图所示:

本文主要实现的是通过USART的查询发送和中断接收功能来实现PC端与MCU端的串口通讯交互功能,通过对PC端发送过来的数据/命令进行解析,执行相应的功能函数;这边就需要引入到一个开源的Letter Shell,其功能非常强大,具体的可以参考如下链接:https://github.com/NevermindZZT/letter-shell,本文主要还是具体的移植和实现功能部分的步骤分享:

  • 首先需要定义一个全局的SHELL结构体变量:
/* Private variables ---------------------------------------------------------*/
SHELL_TypeDef shell;
  • 初始化串口配置参数,并对shell结构体变量中成员参数进行赋值:
/*******************************************************************************
 * [url=home.php?mod=space&uid=159083]@brief[/url] * @param       
 * @retval      
 * [url=home.php?mod=space&uid=1020061]@attention[/url] *******************************************************************************/
void shellPortInit(void)
{
    GPIO_Config_T  GPIO_ConfigStruct;
    USART_Config_T USART_ConfigStruct;

#if 1
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);

    USART_ConfigStructInit(&USART_ConfigStruct);
    USART_ConfigStruct.baudRate     = 115200;
    USART_ConfigStruct.wordLength   = USART_WORD_LEN_8B;
    USART_ConfigStruct.stopBits     = USART_STOP_BIT_1;
    USART_ConfigStruct.parity       = USART_PARITY_NONE;
    USART_ConfigStruct.mode         = USART_MODE_TX_RX;
    USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    USART_Config(USART1, &USART_ConfigStruct);

    USART_EnableInterrupt(USART1, USART_INT_RXBNE);
    NVIC_EnableIRQRequest(USART1_IRQn, 0, 1);

    USART_Enable(USART1);

    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_9;
    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
    GPIO_ConfigStruct.mode  = GPIO_MODE_AF_PP;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_10;
    GPIO_ConfigStruct.mode  = GPIO_MODE_IN_FLOATING;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);
#else
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);

    USART_ConfigStructInit(&USART_ConfigStruct);
    USART_ConfigStruct.baudRate     = 115200;
    USART_ConfigStruct.wordLength   = USART_WORD_LEN_8B;
    USART_ConfigStruct.stopBits     = USART_STOP_BIT_1;
    USART_ConfigStruct.parity       = USART_PARITY_NONE;
    USART_ConfigStruct.mode         = USART_MODE_TX_RX;
    USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    USART_Config(USART2, &USART_ConfigStruct);

    USART_EnableInterrupt(USART2, USART_INT_RXBNE);
    NVIC_EnableIRQRequest(USART2_IRQn, 0, 0);

    USART_Enable(USART2);

    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_2;
    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
    GPIO_ConfigStruct.mode  = GPIO_MODE_AF_PP;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);

    GPIO_ConfigStructInit(&GPIO_ConfigStruct);
    GPIO_ConfigStruct.pin   = GPIO_PIN_3;
    GPIO_ConfigStruct.mode  = GPIO_MODE_IN_FLOATING;
    GPIO_Config(GPIOA, &GPIO_ConfigStruct);
#endif

    shell.write = shellPortWrite;
    shellInit(&shell);
}
  • 构造shell结构体变量成员函数:
/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void shellPortWrite(const char ch)
{
#if 1
    USART_TxData(USART1, (uint8_t)ch);
    while(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
#else
    USART_TxData(USART2, USART_RxData(USART2));
    while(USART_ReadStatusFlag(USART2, USART_FLAG_TXBE) == RESET);
#endif
}
  • 实现串口中断接收函数,将接收到的数据传递到shell中进行解析:
/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void USART1_IRQHandler(void)
{
    if(USART_ReadIntFlag(USART1, USART_INT_RXBNE) == SET)
    {
        shellHandler(&shell, USART_RxData(USART1));
    }
}


/*******************************************************************************
 * @brief       
 * @param       
 * @retval      
 * @attention   
*******************************************************************************/
void USART2_IRQHandler(void)
{
    if(USART_ReadIntFlag(USART2, USART_INT_RXBNE) == SET)
    {
        shellHandler(&shell, USART_RxData(USART2));
    }
}
  • 最后就是根据需要,修改相应的shell配置,具体的可以参考shell_cfg.h这个文件中的相关宏定义

 

完成shell的移植后,在main函数中调用shellPortInit函数进行初始化,将编译无误的程序下载到MCU运行;PC端口使用SecureCRT软件进行对接调试,MCU启动运行后打印日志信息,然后等待PC输入指令字符,在PC端输入help并敲入回车键后,MCU对接收到的命令进行解析执行,运行如下所示:

软件工程源代码: Project.zip (287.33 KB, 下载次数: 4)

最新回复

USART在线交互功能方法值得学习   详情 回复 发表于 2022-9-27 07:14
点赞 关注
个人签名We are a team and we work as a team !
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

USART在线交互功能方法值得学习

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表