上位机图像处理和嵌入式模块部署(mcu中的串口接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        在mcu开发中,mcu扮演着非常重要的角色。一方面,串口可以帮助我们对固件功能进行调试,另外一方面,串口还是很好的模块通信工具。通常情况下,一个mcu里面会有若干个串口,不过因为mcu里面各个pin脚都是复用的,所以这几个串口能不能全部用起来,取决于对应的pin脚有没有被占领。

        除了串口之外,其他的接口也有类似的功能,比如说spi、i2c、sdio、485、can、eth等等。这些都是接口的形式,但是接口上面的数据以什么样的协议进行数据传输,这就要具体的模块或者是芯片了。用一个比喻来说,接口相当于搭了一条路,数据好比路上面的车,这过程中一次发送多少车,都是不定的。以i2c为例,它对应的模块可能是一个陀螺仪芯片,也有可能是一个eeprom的芯片,所以协议这部分要查看具体的芯片手册才能做决定。

        今天,我们回头看下,stm32f103c8t6是怎么实现串口的输入、输出的。

1、从main函数看起

        拿到示例工程后,我们一般直接编译一下。编译除了判断是否成功之外,编译日志还会告诉我们工程中使用的rom多少、ram多少,这也是十分重要的,

Program Size: Code=4516 RO-data=360 RW-data=20 ZI-data=1092  

        解析来简单看下main函数内容,

int main(void)
{
    HAL_Init();        
    SystemClock_Config();
    DEBUG_USART_Config();
  
	printf("Welcome to use fire board!\r\n");	
	Usart_SendString( (uint8_t *)"This is just an echo experiment\r\n" );
	
    while(1)
	{		
	}
}

        整个函数中比较明显的区别就是DEBUG_USART_Config函数,其他的就是打印和字符输出。最后while循环是空的,这代表对应的处理都是在中断完成的。

2、串口初始化

void DEBUG_USART_Config(void)
{ 
  
  UartHandle.Instance          = DEBUG_USART;
  
  UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;
  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits     = UART_STOPBITS_1;
  UartHandle.Init.Parity       = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode         = UART_MODE_TX_RX;
  
  HAL_UART_Init(&UartHandle);
  __HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);  
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  DEBUG_USART_CLK_ENABLE();
	
  DEBUG_USART_RX_GPIO_CLK_ENABLE();
  DEBUG_USART_TX_GPIO_CLK_ENABLE();
  
/**USART1 GPIO Configuration    
  PA9     ------> USART1_TX
  PA10    ------> USART1_RX 
  */
	
  GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =  GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);
  
  GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;
  GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT;	
  HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); 
 
  HAL_NVIC_SetPriority(DEBUG_USART_IRQ ,0,1);
  HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ ); 
}

        DEBUG_USART_Config函数中主要就是对串口的一些属性进行配置,比如波特率多少、数据长度多少、停止位多少等等。这里就是常规的115200-8-1配置。配置完了,会调用函数HAL_UART_Init,这个函数会进一步调用下面的HAL_UART_MspInit。而在HAL_UART_MspInit函数当中,主要就是对a9、a10两个pin脚进行配置,配置完了设置中断优先级,并且使能中断。而在DEBUG_USART_Config函数的最后一步,则是全局配置中断,也就是接收数据的时候才响应中断。

3、补充fputc和fgetc函数

        我们自己写代码的时候,习惯用printf和getchar这样的函数。如果需要这样的函数,就需要显示开发一下fputc和fgetc。这两个函数都是WEAK函数。所谓的WEAK函数,就是工程里面已经有一个函数了,但是客户如果自己重新定义了,那就用客户自己定义的函数。

void Usart_SendString(uint8_t *str)
{
	unsigned int k=0;
    do 
    {
      HAL_UART_Transmit(&UartHandle,(uint8_t *)(str + k) ,1,1000);
      k++;
    } while(*(str + k)!='\0'); 
}

int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}

4、中断响应

        在stm32 mcu里面,主要的中断都是在文件stm32f1xx_it.c里面完成的。所以我们需要做的,就是直接找到对应的内容,看看是怎么实现的即可,

void  DEBUG_USART_IRQHandler(void)
{
    uint8_t ch=0; 
  
	if(__HAL_UART_GET_FLAG( &UartHandle, UART_FLAG_RXNE ) != RESET)
	{		
        ch=( uint16_t)READ_REG(UartHandle.Instance->DR);
        WRITE_REG(UartHandle.Instance->DR,ch); 
	}
}

        __HAL_UART_GET_FLAG主要是查看一下是不是真的有数据,READ_REG是读取数据,WRITE_REG是发送数据。所以整个代码的功能就是一个回显的功能。

5、实验和测试

        要进行实际验证的话,除了下载好固件之外,还需要进行串口连接,打开mobaxterm。这时候如果可以回显对应的内容,那么就说明固件没问题。不然就会回头check一下硬件、接线和软件了。

6、其他

        因为是涉及到串口,一般的pc电脑已经没有串口的接口,所以需要提前购买一个usb转232的模块。另外,我们实践过程中,一般是把调试串口和协议串口是分开来处理的。

        串口本身的意义还是十分巨大的,它使得我们通过外部设备,以协议的形式对这个模块进行控制了。之前我们学习了gpio的读和写,那么就可以通过串口实现gpio的读、写控制,这样的话就可以编写上位机对mcu模块进行控制了。这个上位机可以是pc,可以是嵌入式linux。

        mcu固件开发中,大部分应用都是事件触发式的,上位机给一个命令,我们处理一个命令。如果是需要定时反馈的,这个时候就再添加一个定时器就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/640335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

申请表填写错误?河南道路与桥梁乙级资质申请表填写技巧

在填写河南道路与桥梁乙级资质申请表时,为了避免错误并确保申请顺利进行,以下是一些填写技巧: 仔细阅读申请指南: 在填写申请表之前,务必仔细阅读相关的申请指南或说明文件。这些文件会详细解释每个填写项的要求和目的…

【Linux系列】软链接使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【耕地保卫战:揭秘“占补平衡”】守护粮仓的智慧策略

嗨,各位小伙伴们,今天咱们来聊聊一个与我们每日餐桌紧密相关的主题——耕地占补平衡。在现代化的车轮滚滚向前时,如何在发展与保护之间找到那个微妙的平衡点,确保我们的“米袋子”满满当当呢?这就不得不提到耕地占补平…

PY32F系列32位单片机 特殊引脚复用说明

一 、 PY32F030 系 列 , 包 括 PY32F030 、PY32F003、 PY32F002A、 XL32F003 的特殊引脚使用说明。 1、晶振引脚的复用,使用 HSE/LSE 引脚作为 GPIO 功能引脚时,只要没有配置相关功能的情况下,正常配置 GPIO 功能即可。 其中&am…

法那科机器人M-900iA维修主要思路

发那科工业机器人是当今制造业中常用的自动化设备之一,而示教器是发那科机器人操作和维护的重要组成部分。 一、FANUC机械手示教器故障分类 1. 硬件故障 硬件故障通常是指发那科机器人M-900iA示教器本身的硬件问题,如屏幕损坏、按键失灵、电源故障等。 2…

纹理映射技术在AI去衣中的艺术与科技融合

引言: 在数字图像处理的世界里,AI去衣技术正逐步揭开其神秘的面纱。这门技术结合了深度学习的智能算法与图形学的先进手段,以实现对图像中衣物的智能识别与处理。在这一过程中,纹理映射技术发挥着至关重要的作用。本篇博客将深入探…

OpenHarmony实战开发——网络组件axios可以在OpenHarmony上使用了

什么是axios 上古浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分…

Vision Mamba代码笔记

1 论文回顾 基本思路 论文解读见: 《VideoMamba》论文笔记_video mamba-CSDN博客 注意 Vision Mamba和VIT的输入和输出的shape的形状是相同的(VIT基于Transformer的Encoder设计,输入经过多层MHA和MLP计算,输入和输出的形状相同…

构建传统企业信息化数字化智能化技术架构:挑战与机遇

随着数字化和智能化技术的快速发展,传统企业在信息化转型过程中面临着前所未有的机遇和挑战。如何构建适应企业需求的信息化数字化智能化技术架构,成为企业发展的关键之一。本文将探讨传统企业信息化数字化智能化技术架构的设计与实践。 一、数字化转型的…

阿里云Linux 3.2104 LTS 64位安装SVN服务器

直接按步骤 yum install subversion 写y就行 主要是看看安装了那些文件 rpm -ql subversion 主要是为了创建版本库而准备,这个能一遍创建就一遍创建,不行就逐个创建。能创就忽略下面两个mkdir步骤。 mkdir /home/svn/groupRepos 根据新建目录作为版本…

Windows 10x64 IoT Enterprise LTSC 2021

打KB5036892补丁,升级版本19044.4291,打简体中文补丁包,系统后续升级需要升级英文补丁,需要重新打中文补丁包,系统禁用升级。禁用打印机服务,需要安装打印机的自行打开服务Print Spooler。 链接&#xff1a…

Docker-制作镜像的两种方式=》基于容器制作基于Dockerfile制作

本文主要是基于Docker如何制作一个Java镜像,而一个Java镜像想要运行需要系统环境,JDK。所以我们要先有一个系统环境,本文使用的是centos7,JDK选择版本是8,而我使用的Java程序是一个简易的springBoot项目,你…

时空扭曲:重温相对论的终极挑战,探寻真理的脚步

大家都知道,相对论是爱因斯坦提出的划时代理论,为人类认知时空和引力做出了革命性贡献。但这个理论真的万无一失吗?近日,一项新研究提出了测试时间扭曲的新方法,或许能让我们重新审视相对论在宇宙大尺度上的适用性。 时…

【数据结构】快速排序(详解)

目录 快速排序 历史: 基本思想: 主框架: 下面解释实现单次排序的几种版本: 1.Hoare版本 2. 挖坑法 3. 前后指针法 快速排序的实现包括递归与非递归: 1. 递归实现:(即开头的基本框架&am…

正在直播:Microsoft Copilot Studio 新增支持Copilot代理、Copilot扩展等多项功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

现代C++ 如何使用 Lambda 使代码更具表现力、更容易理解?

使用 Lambda 使代码更具表现力 一、Lambda VS. 仿函数二、总结 一、Lambda VS. 仿函数 Lambda 是 C11 中最引人注目的语言特性之一。它是一个强大的工具,但必须正确使用才能使代码更具表现力,而不是更难理解。 首先,要明确的是,…

上位机图像处理和嵌入式模块部署(mcu之串口控制gpio)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们陆续学习了gpio输入、输出,串口输入、输出。其实有了这两个接口,就可以做产品了。因为我们可以通过发送串口命令&a…

【智能算法应用】北方苍鹰算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】北方苍鹰优化算法(NGO)原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出,障碍物的栅格用黑色表示,可通过的…

element-plus表格的表单校验如何实现,重点在model和prop

文章目录 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重点&#xff1a; 1) tableData放到form对象里 2) form-item的prop要写成tableData.序号.属性 <!--table-表单校验--> <template><el-form ref"forms" :model"form"><e…

百度墨斗鱼文库创作中心上传验证码分析

之前发表过一篇&#xff0c;百度墨斗鱼后台上传文章分析的文章。时隔几个月&#xff0c;文件预览接口加了asc- token 和 验证码&#xff08;百度v2&#xff09;。闲来没事分析一下。所有的分析都基于协议&#xff0c;不基于web自动化。 验证码目前有四种&#xff0c;验证码刷…