树莓派作为PC端通信STM32(写给自己的一些笔记,以谈话的方式引导学习)

Posted 衾许°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派作为PC端通信STM32(写给自己的一些笔记,以谈话的方式引导学习)相关的知识,希望对你有一定的参考价值。

前言

哎,就说实话,就因为这几天一直在写那个课堂作业嘛,那个通过串口来控制电机调速的,给我学麻了(小声BB,proteus太难用啦),这不,趁热打铁一波,拿STM32的野火的MINI开发板来一波串口通信

咋串口通信呢?一发二收嘛,发是PC端进行发送吧?当然,STM32一样可以通过串口发送数据到我们的树莓派上

为了实现收发的功能那必然要有一条渠道吧,一般串口分为线接和无线串口,我们就不搞这么高级了,先TTL转串口试试,首先就是硬件的连接了

 树莓派接收端RXD发送端TXD引脚

捞一下这个树莓派这一排排针都是些啥脚,这不,一眼望去就看见了TXD0和RXD0这两个玩意,分别为GPIO14和GPIO15,等等我们就是要用到这两个脚。

那STM32呢?先不着急怎么去接线.. 

在这之前我们先复习一下STM32的与PC端进行串口通信的操作(我这里使用的是野火的STM32F103RC的MINI板,HD版本)

 STM32的与PC端进行串口通信的操作

 关于STM32F103RCT6的TXD和RXD引脚汇总如下(共5路USART串口通信)

我们这里主要用到挂载在APB2总线上的USART1串口,分别为PA9和PA10两个io口

STM32F103RCT6芯片的串口GPIO
引脚APB2总线
USART1USART2USART3USART4USART5
TXPA9PA2PB10PC10PC12
RXPA10PA3PB11PC11PD2

 我们在这里用到的是USART1串口,可从系统结构图上看出USART1挂载在APB2总线上

 STM32实现串口控制LED(代码由野火官方例程修改,可直接编译烧写))

(野火的代码风格确实很不错,但就是不太适合新手去看,宏有点多

1.main.c

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */

int main(void)
{    
  char ch;
  /* LED GPIO 初始化 */
  LED_GPIO_Config();
  /* 初始化USART 配置模式为 115200 8-N-1 */
  USART_Config();
    
  while(1)
    {    
    /* 获取字符指令 */
    ch=getchar();
    
    /* 根据字符指令控制RGB彩灯颜色 */
    switch(ch)
        {
          case '1':
              /*PC2口置低电平点亮LED*/
            GPIO_ResetBits(GPIOC,GPIO_Pin_2);
          break;
          case '2':
              /*PC3口置低电平点亮LED*/
            GPIO_ResetBits(GPIOC,GPIO_Pin_3);
          break;
          case '3':
              /*PC2,PC3口置高电平熄灭LED*/
            GPIO_SetBits(GPIOC,GPIO_Pin_2);
            GPIO_SetBits(GPIOC,GPIO_Pin_2);
          break;
          default:
            break;      
        }   
    }    
}

 2.USART_Config();函数(未在main.c中声明,若要复制使用请在main函数前声明)(这里配置的串口模式为N115200-8-1)

void USART_Config(void)
{
    // 定义GPIO总线结构体变量
    GPIO_InitTypeDef GPIO_InitStructure;
    // 定义串口初始化结构体变量
    USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟(APB2总线上的GPIOA)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 打开串口外设的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
    
    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = 115200;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl = 
    USART_HardwareFlowControl_None;
    // 配置工作模式,收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init(USART1, &USART_InitStructure);    
    
    // 使能串口
    USART_Cmd(USART1, ENABLE);        
}

 3.LED_GPIO_Config();函数(未在main.c中声明,若要复制使用请在main函数前声明)

void LED_GPIO_Config(void)
{        
        /*定义一个GPIO_InitTypeDef类型的结构体*/
        GPIO_InitTypeDef GPIO_InitStructure;

        /*开启LED相关的GPIO外设时钟*/
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
        /*选择要控制的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    

        /*设置引脚模式为通用推挽输出*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

        /*设置引脚速率为50MHz */   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

        /*调用库函数,初始化GPIO*/
        GPIO_Init(GPIOC, &GPIO_InitStructure);    
        
        /*选择要控制的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

        /*调用库函数,初始化GPIO*/
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        

        /* 关闭所有led灯    */
        GPIO_SetBits(GPIOC, GPIO_Pin_2);
        
        /* 关闭所有led灯    */
        GPIO_SetBits(GPIOC, GPIO_Pin_3);     
 
}

烧录进入开发板中,可见左下角蓝色LED1亮起,输入字符2则LED2亮起,输入字符3则LED都熄灭

 到此实现PC端与STM32通信控制IO口,讲一下这里面的一些小知识点:

关于开漏输出和推挽输出

推挽输出:可以输出高,低电平,连接数字器件。
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。
输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。

开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式可以把端口作为双向IO使用。

 那么现在就来我们最终要实现的目的了

树莓派与STM32串口通信控制LED

树莓派我使用的是Linux下的串口调试助手:minicom

打开树莓派终端配置设置sudo raspi-config
interfacing options→Serial→NO→YES→reboot

打开/boot/config.txt文件,查找‘enable_uart=1’,若有,使其所在行内容与这一行完全相同。若无,在文档最后添加这一行

在terminal中输入sudo apt-get install minicom安装minicom串口调试助手
使用 minicom -s 指令(如果后续操作权限不足,把本指令改为sudo minicom -s再进行操作)→Serial port setup

按下E 调整波特率校验位等与PC上的串口调试助手设置一致(低波特率数据传输受干扰相对小),否则传输的数据混乱(我这里STM32的代码设置波特率为115200)

硬件流控制(F)与软件流控制(我自己也不清楚为啥)(G)均调整为NO

回车保存,返回上一层,选择save setup as dfl(这一步可能出现权限不足,可以sudo为更高权限)

以上是关于树莓派作为PC端通信STM32(写给自己的一些笔记,以谈话的方式引导学习)的主要内容,如果未能解决你的问题,请参考以下文章

树莓派作为PC端通信STM32(写给自己的一些笔记,以谈话的方式引导学习)

树莓派安装docker,并在PC端监控,启动swarm集群

树莓派使用socket发送数据到PC,并存入数据库

树莓派使用socket发送数据到PC,并存入数据库

树莓派使用socket发送数据到PC,并存入数据库

stm32和树莓派哪个好?哪个入手难度更高?