• 嵌入式02 STM32 实验07 串口通信


    STM32串口通信(F1系列包含3个USART和2个UART)

    一、单片机与PC机串行通信研究目的和意义:

      单片机自诞生以来以其性能稳定,价格低廉、功能强大、在智能仪器、工业装备以及日用电子消费产品中得到了广泛的应用。在单片机的输入输出控制中,除直接接上小键盘和LCD显示屏等方法外,一般都通过串口和上位机PC进行通信。这样不仅能够实现远程控制,而且能够利用PC机强大的数据处理功能以及友好的控制界面。在一般的利用PC机对单片机进行控制的场合,都是采用操作系统作为上位机的平台,其优点是界面友好,编程和操作都比较容易。因此PC机与单片机串行通信具有重要的现实及工业意义。

      UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器

      USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器

    串行通信

      按数据传送方向:

        a、单工:数据传输只支持数据在一个方向上传输

        b、半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信

        c、全双工:允许数据同时在两个方向上传输,因此全双工通信是两个单工通信方式的结合,他要求发送设备和接收设备都由独立的接收和发送能力。

                         

      按串行通信的通信方式:

           a、同步通信:带时钟同步信号传输      SPI,IIC通信接口

        b、异步通信:不带时钟同步信号传输     UART(同步异步收发器),单总线

                

                       USART:1、2、3       UART:4、5

    二、串口通信过程

                                               

      

    三、STM32F10x程序设计

      本程序的功能是通过串口给STM32发送‘1‘,点亮LED1,发送’2‘,点亮LED2。接收数据同时单片机将接收到的数据发回给电脑

    子函数

     1 #include "my_usart.h"
     2 #include "stm32f10x.h"
     3 
     4 void My_USART1_Init(void)
     5 {
     6     GPIO_InitTypeDef KST_GPIO_Structure;           
     7     USART_InitTypeDef KST_USART_Structure;
     8     NVIC_InitTypeDef KST_NVIC_Structure;
     9     
    10     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA时钟
    11     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);  //使能USART1时钟
    12 
    13     KST_GPIO_Structure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
    14     KST_GPIO_Structure.GPIO_Pin = GPIO_Pin_9;
    15     KST_GPIO_Structure.GPIO_Speed = GPIO_Speed_10MHz;
    16     GPIO_Init(GPIOA, &KST_GPIO_Structure);                  //初始化GPIOA.9
    17     
    18     KST_GPIO_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
    19     KST_GPIO_Structure.GPIO_Pin = GPIO_Pin_10;
    20     KST_GPIO_Structure.GPIO_Speed = GPIO_Speed_10MHz;
    21     GPIO_Init(GPIOA, &KST_GPIO_Structure);                    //初始化GPIOA.10
    22     
    23     KST_USART_Structure.USART_BaudRate = 115200;             //设置波特率为115200
    24     KST_USART_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 
    25     KST_USART_Structure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;    //收发模式
    26     KST_USART_Structure.USART_Parity = USART_Parity_No;                //无奇偶校验位
    27     KST_USART_Structure.USART_StopBits = USART_StopBits_1;            //一个停止位
    28     KST_USART_Structure.USART_WordLength = USART_WordLength_8b;        //字长为8位数据模式
    29     
    30     USART_Init(USART1, &KST_USART_Structure);                //初始化串口1
    31     USART_Cmd(USART1, ENABLE);                                //使能串口
    32     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);            //开启中断
    33     
    34     KST_NVIC_Structure.NVIC_IRQChannel = USART1_IRQn;            
    35     KST_NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;                //IRQ通道使能
    36     KST_NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 1;     //抢占优先级1
    37     KST_NVIC_Structure.NVIC_IRQChannelSubPriority = 1;            //子优先级1
    38     NVIC_Init(&KST_NVIC_Structure);                    //根据指定的参数初始化NVIC寄存器
    39 }
    40 
    41 void USART1_IRQHandler(void)            //串口1终端服务函数
    42 {
    43     u8 res;
    44     if(USART_GetITStatus(USART1, USART_IT_RXNE))    //接收中断
    45     {
    46         res = USART_ReceiveData(USART1);            //读取接收到的数据
    47         if(res == '1')
    48         {
    49             GPIO_ResetBits(GPIOB, GPIO_Pin_5);        //点亮LED1
    50             USART_SendData(USART1, res);            //发送数据
    51         }
    52         if(res == '2')
    53         {
    54             GPIO_ResetBits(GPIOE, GPIO_Pin_5);        //点亮LED2
    55             USART_SendData(USART1, res);            //发送数据
    56         }
    57 
    58     }
    59 }

    主函数

     1 #include "stm32f10x.h"
     2 #include "my_usart.h"
     3 #include "led.h"
     4 
     5 int main(void)
     6 {
     7     LED_Init();               //LED初始化
     8     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
     9     My_USART1_Init();        //串口初始化   
    10     while(1);
    11 }
  • 相关阅读:
    vi 编辑器使用技巧
    sql____001
    PL/sql 启动时出现:NLS_LANG在客户端不能确定,字符集转变将造成不可预期的后果
    oracle数据库只查询前n条
    Linux下统计当前文件夹下的文件个数、目录个数
    oracle链接指定实例
    nmon的安装和使用
    jmeditor与CKEditor4x整合的BUG
    Word图片上传控件卸载教程-Xproer.WordPaster
    ScreenCapture手动卸载教程-Xproer.ScreenCapture
  • 原文地址:https://www.cnblogs.com/ksht-wdyx/p/11616831.html
Copyright © 2020-2023  润新知