你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32和树莓派串口透传

[复制链接]
STMCU-管管 发布时间:2020-9-4 16:05

最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下:


第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信;


第二步:确保第一步成功后,将树莓派和STM32连接,进行串口透传。


下面进行具体实验吧~


  • 树莓派环境串口透传


在开始前说明以下几点:


1、树莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可选其他GND)。


2、树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序。


20200904160714.9b8063eba5fc9888b8d84c69a52c5aec.png


树莓派串口通信需要配置环境,主要修改两处,具体如下:


第一处:进入  /boot/cmdline.txt 文件


输入以下指令:

  1. sudo nano /boot/cmdline.txt
复制代码

删除以下部分:

  1. console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
复制代码

最终变为:

  1. dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
复制代码

第二步:进入  /etc/inittab  文件


输入以下指令:

  1. sudo nano /etc/inittab
复制代码

注释最后一行内容:

  1. #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
复制代码

配置完之后便可测试一下树莓派的UART是否正常工作,而minicom便是一个简单好用的工具。minicom是linux/树莓派平台串口调试工具,相当于windows上的串口调试助手。此时需要先安装minicom:

  1. <p style="line-height: 26px;"><span style="font-family: -apple-system, &quot;&quot;;">sudo apt-get </span><span style="font-family: -apple-system, &quot;&quot;;">install</span><span style="font-family: -apple-system, &quot;&quot;;"> minicom</span></p>
复制代码

接下来启动minicom工具

  1. minicom -b 9600 -o -D /dev/ttyAMA0
  2. #-b代表波特率,-D代表端口,/dev/ttyAMA0 类似于windows中的COM1,-o功能暂时未知
复制代码

效果如下:

2.png



注意:


1、minicom发送内容直接在控制台中输入内容即可,如果minicom打开了回显可在控制台中观察到输出内容,如果回显关闭则控制台中没人任何反应,千万不要以为minicom没有正常工作。


2、minicom回显控制,先Ctrl+A,再E。可翻转回显状态(原来回显打开则此事回显关闭)


3、minicom回显关闭,先Ctrl+A,再Q。


minicom仅满足调试用途,如果需要编程解决问题那么python的serial扩展库——pyserial则是一个不错的选择。


收下需要安装pyserial扩展库,可使用pip或者easy_install安装,也可以直接选择apt-get工具安装。


若使用apt-get工具安装,可输入以下指令:


  1. sudo apt-get install python-serial
复制代码

当以上步骤成功后,就可以使用Python编写树莓派串口透传程序,具体Demo如下:


  1. # -*- coding: utf-8 -*
  2. import serial
  3. import time
  4. # 打开串口
  5. ser = serial.Serial("/dev/ttyAMA0", 9600)
  6. def main():
  7.     while True:
  8.         # 获得接收缓冲区字符
  9.         count = ser.inWaiting()
  10.         if count != 0:
  11.             # 读取内容并回显
  12.             recv = ser.read(count)
  13.             ser.write(recv)
  14.         # 清空接收缓冲区
  15.         ser.flushInput()
  16.         # 必要的软件延时
  17.         time.sleep(0.1)
  18.    
  19. if __name__ == '__main__':
  20.     try:
  21.         main()
  22.     except KeyboardInterrupt:
  23.         if ser != None:
  24.             ser.close()
复制代码

此时实现了莓派的串口通信功能。


  • STM32环境串口透传

接下来实现STM32串口透传,这里我使用的MCU是STM32F103C8T6,配置UART1,STM32不需要配置环境直接在Demo中配置GPIO即可,将USB转TTL的TX连接STM32的RX(PA10),USB转TTL的RX连接STM32的TX(PA9),核心Demo如下:



  1. #include "usart1.h"
  2. #include <stdarg.h>


  3. void USART1_Config(void)
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         USART_InitTypeDef USART_InitStructure;


  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  8.   
  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.   GPIO_Init(GPIOA, &GPIO_InitStructure);   
  13.   
  14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        
  16.   GPIO_Init(GPIOA, &GPIO_InitStructure);   
  17.          

  18.         USART_InitStructure.USART_BaudRate = 115200;        
  19.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;        
  20.         USART_InitStructure.USART_StopBits = USART_StopBits_1;         
  21.         USART_InitStructure.USART_Parity = USART_Parity_No ;  
  22.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        
  23.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  24.         USART_Init(USART1, &USART_InitStructure);  
  25.         USART_Cmd(USART1, ENABLE);
  26. }


  27. void UART1SendByte(unsigned char SendData)
  28. {           
  29.         USART_SendData(USART1,SendData);
  30.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);            
  31. }  


  32. unsigned char UART1GetByte(unsigned char* GetData)
  33. {              
  34.         if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
  35.         {  return 0;
  36.                 }
  37.         *GetData = USART_ReceiveData(USART1);
  38.         return 1;
  39. }

  40. void UART1Test(void)
  41. {
  42.        unsigned char i = 0;

  43.        while(1)
  44.        {   
  45.                  while(UART1GetByte(&i))
  46.         {
  47.          USART_SendData(USART1,i);
  48.         }      
  49.        }     
  50. }
复制代码



当STM32测试成功后,恭喜各位,将树莓派的TX和STM32的RX(PA10)连接,树莓派的RX和STM32的TX连接(PA9),注意一定要将STM32的GND和树莓派的GND连接,即可实现STM32和树莓派串口通信。







收藏 评论0 发布时间:2020-9-4 16:05

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版