精华内容
下载资源
问答
  • 串口usart

    2018-09-10 15:44:12
    #ifndef _H_IL_USART1_201611251016_H_ #define _H_IL_USART1_201611251016_H_ #include "il_system_configure.h" #include <stdbool.h> #include <stdint.h> typedef ...

    #ifndef _H_IL_USART1_201611251016_H_
    #define _H_IL_USART1_201611251016_H_

    #include "il_system_configure.h"

    #include <stdbool.h>
    #include <stdint.h>

    typedef enum {
        USART_STATE_CLOSED = 0,
        USART_STATE_OPENED = 1
    }usart_state_t;

    extern void usart1_init(void);
    extern void usart1_open(void);
    extern void usart1_close(void);
    extern void usart1_send(uint8_t* ,uint16_t);

    #endif // _H_IL_USART1_201611251016_H_

     

     

    #include "il_usart1.h"

    #include "stm32l4xx.h"
    #include "stm32l4xx_hal.h"
    #include "stm32l4xx_hal_gpio.h"
    #include "stm32l4xx_ll_usart.h"
    #include "il_wwdg.h"

    #include <stdio.h>

        #if __GNUC__
            /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
            set to 'Yes') calls __io_putchar() */
            #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
        #else
            #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
        #endif /* __GNUC__ */

    #if ENABLE_PRINT
        PUTCHAR_PROTOTYPE
        {
            /* Place your implementation of fputc here */
            /* e.g. write a character to the USART */
            uint16_t timeout = 512;
            while (!LL_USART_IsActiveFlag_TC(USART1) && timeout-->0){
                feed_dog();
            }
            LL_USART_TransmitData8(USART1, (uint8_t)ch);

            return ch;
        }
    #else
        PUTCHAR_PROTOTYPE{
            return ch;
        }
    #endif

    typedef struct{
        USART_HandleTypeDef usart_handler;
        DMA_HandleTypeDef dma_handler;
    }usart_t;

    /**********************************************************************
    * 函数名称: usart1_send()
    * 功能描述: 
    * 输入参数: void
    * 输出参数: void
    * 返 回 值: void
    * 其他说明: void
    * 修改日期       版本号     作者         修改内容
    * -----------------------------------------------
    * 2017.01.04     V1.0    Bruce Cheng     create
    **********************************************************************/
    void usart1_send(uint8_t* data, uint16_t length){
    #if ENABLE_PRINT
        for (uint16_t idx = 0; idx < length; idx++){
            uint16_t timeout = 512;
            while (!LL_USART_IsActiveFlag_TC(USART1) && timeout-->0){
                feed_dog();
            }
            LL_USART_TransmitData8(USART1, data[idx]);
        }
    #endif
    }

    /**********************************************************************
    * 函数名称: usart1_init()
    * 功能描述: 初始化打印串口
    * 输入参数: void
    * 输出参数: void
    * 返 回 值: void
    * 其他说明: void
    * 修改日期       版本号     作者         修改内容
    * -----------------------------------------------
    * 2016.08.29     V1.0       Kous         添加注释
    * 2016.11.02     V1.1       chf          移植至STM32L475
    **********************************************************************/
    void usart1_init(void){
    #if ENABLE_PRINT
        __HAL_RCC_GPIOB_CLK_ENABLE();

        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.Pin          = GPIO_PIN_6;
        GPIO_InitStructure.Mode         = GPIO_MODE_AF_PP;
        GPIO_InitStructure.Speed        = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStructure.Pull         = GPIO_NOPULL;
        GPIO_InitStructure.Alternate    = GPIO_AF7_USART1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);

        LL_USART_DeInit(USART1);
        __HAL_RCC_USART1_FORCE_RESET();
        __HAL_RCC_USART1_RELEASE_RESET();
        __HAL_RCC_USART1_CLK_ENABLE();
        __HAL_RCC_USART1_CLK_SLEEP_ENABLE();

        LL_USART_InitTypeDef usart1ll;
        usart1ll.BaudRate               = 115200;
        usart1ll.DataWidth              = LL_USART_DATAWIDTH_8B;
        usart1ll.HardwareFlowControl    = LL_USART_HWCONTROL_NONE;
        usart1ll.OverSampling           = LL_USART_OVERSAMPLING_16;
        usart1ll.Parity                 = LL_USART_PARITY_NONE;
        usart1ll.StopBits               = LL_USART_STOPBITS_1;
        usart1ll.TransferDirection      = LL_USART_DIRECTION_TX;
        LL_USART_Init(USART1, &usart1ll);
        LL_USART_Enable(USART1);
    #else
        usart1_close();
    #endif
    }

    /**********************************************************************
    * 函数名称: usart1_deinit()
    * 功能描述: 反初始化打印串口
    * 输入参数: void
    * 输出参数: void
    * 返 回 值: void
    * 其他说明: void
    * 修改日期       版本号     作者         修改内容
    * -----------------------------------------------
    * 2016.12.22     V1.0     Bruce Cheng     create
    **********************************************************************/
    void usart1_open(void){
    #if ENABLE_PRINT
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_USART1_CLK_ENABLE();
        LL_USART_Enable(USART1);
    #endif
    }

    /**********************************************************************
    * 函数名称: ()
    * 功能描述: 
    * 输入参数: void
    * 输出参数: void
    * 返 回 值: void
    * 其他说明: void
    * 修改日期       版本号     作者         修改内容
    * -----------------------------------------------
    * 2016.12.22     V1.0     Bruce Cheng     create
    **********************************************************************/
    void usart1_close(void){
        __HAL_RCC_USART1_CLK_DISABLE();
        LL_USART_Disable(USART1);
    }

    展开全文
  • 本文介绍串口USART收发数据处理方式总结的知识,很不错的知识,一起来看下吧。
  • STM32串口USART STM32串口USART**STM32串口USART**一、USARTX(串口)二、UART的配置步骤(使能、初始化)三、UART的配置步骤(中断方式)四、STM32串口在首次发送字符的时候,首字符丢失解决办法五、USART2、USART3的...

    STM32串口USART

    一、USARTX(串口)

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信。
    STM32固件库使用外围设备的主要思路
    在STM32中,外围设备的配置思路比较固定。首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟;最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟。
    其次是配置GPIO,GPIO的各种属性由硬件手册的AFIO一章详细规定,较为简单。
    接着相关设备需要如果需要使用中断功能,必须先配置中断优先级,后文详述。
    然后是配置外围设备的相关属性,视具体设备而定,如果设备需要使用中断方式,必须使能相应设备的中断,之后需要使能相关设备。
    最后如果设备使用了中断功能,则还需要填写相应的中断服务程序,在服务程序中进行相应操作。

    二、UART的配置步骤(使能、初始化)

    2.1、打开时钟
    由于UART的TX和RX和AFIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);``
    

    2.2、GPIO初始化
    GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。
    以下是GPIO设置的实例代码:
    GPIO_InitTypeDef GPIO_InitStructure;

      //USART1 Tx(PA.09) 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //USART1 Rx(PA.10) 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    

    2.3、配置UART相关属性
    通过结构体USART_InitTypeDef来确定。UART模式下的字段如下
    USART_BaudRate:波特率,视具体设备而定
    USART_WordLength:字长
    USART_StopBits:停止位
    USART_Parity:校验方式
    USART_HardwareFlowControl:硬件流控制
    USART_Mode:单/双工
    最后设置。实例代码为:

       //USART1配置
      USART_InitTypeDef USART_InitStructure;
    
       USART_InitStructure.USART_BaudRate = 9600; 
        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_Tx | USART_Mode_Rx; 
        USART_Init(USART1, &USART_InitStructure);
        USART_Cmd(USART1, ENABLE); 
    

    别忘了最后要使用USART_Cmd()来启动设备UART1。
    2.4、重定向print()函数。

    int fputc(int ch,FILE *f)
    {
        USART1->SR;  //USART_GetFlagStatus(USART1, USART_FLAG_TC) 解决第一个字符发送失败的问题
        //一个一个发送字符
        USART_SendData(USART1, (unsigned char) ch);
        //等待发送完成
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        
        return(ch);
    }
    

    最后通过主函数直接输出即可。

    int main(void)
    {
        // USART1 config 9600 8-N-1 
        USART1_Config();
        
        printf("hello world!");
    }
    

    三、UART的配置步骤(中断方式)

    打开时钟、GPIO初始化、配置UART相关属性、重定向print()函数 与上面的相同。
    3.1、中断优先级的配置
    这是STM32比较奇怪的地方,在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是先占优先级和从优先级,而整个优先级设置参数的长度为4位,因此需要首先划分先占优先级位数和从优先级位数,通过NVIC_PriorityGroupConfig()实现;
    特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级,NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般定位ENABLE。最后通过NVIC_Init()来使能这一中断向量。实例代码如下:

    //配置UART1接收中断
    void NVIC_Configuration(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure; 
        /* Configure the NVIC Preemption Priority Bits */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        
        /* Enable the USARTy Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    

    3.2、中断的服务程序的设计
    目前使用了UART的两个中断USART_IT_RXNE(接收缓存补空中断)和USART_IT_TXE(发送缓存空中断),前一个中断保证了一旦有数据接收到就进入中断以接收特定长度的数据,后一个中断表示一旦发完一个数据就进入中断函数,保证连续发送一段数据。一个设备的所有中断都包含在一个中断服务程序中,因此必须首先分清楚这次响应的是哪一个中断,使用USART_GetITStatus()函数确定;采用USART_ReceiveData()函数接收一个字节数据,采用USART_SendData()函数发送一个字节数据,当关闭中断时采用USART_ITConfig()失能响应的中断。实例程序:

    void USART1_IRQHandler(void)
    {
        uint8_t ch;
        
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {     
            //ch = USART1->DR;
                ch = USART_ReceiveData(USART1);     //接受数据
              printf( "%c", ch );    //返回打印
        } 
         
    }
    

    3.3、接收数据函数:

    //重定向scanf函数到USART1
    int fgetc(FILE *f)
    {
            /*等待串口1输入数据*/
            while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    
            return (int)USART_ReceiveData(USART1);
    }
    

    四、STM32串口在首次发送字符的时候,首字符丢失解决办法

    网上关于发送字符的代码大多如下:
    USART_SendData(USART1, (uint8_t)ch);
    while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
    其实咋一看是说的通的,但是在仔细看手册的时候发现 TC 和 TXE 标志位在复位的时候被置1 ,这样第一次while循环就是没有用的。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉,造成实际看到的丢失现象。解决办法就很简单:在前面加上一句 USART1->SR;
    具体代码如下:
    USART1->SR;
    USART_SendData(USART1, (uint8_t)ch);
    while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
    下面我来说说原因: 第一句读取SR寄存器,第二句写DR寄存器 刚好清除了TC标志位 。第一次while循环就起作用了。
    也可将USART1->SR;替换为USART_GetFlagStatus(USART1, USART_FLAG_TC)

    五、USART2、USART3的配置

    串口2、3的配置与串口1配置同理将其的需要使能的引脚和中断函数名称修改即可,插上线即可使用。
    接线:将单片机PB2、PB3引脚使用杜邦线与烧录器(我使用DAP)的TX、RX相连,有一点需要注意的是,发送应与接受相连,即单片机的TX与烧录器的RX相接。

    	//USART1_TX   GPIOA.2
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
    
      //USART1_RX	  GPIOA.3初始化
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
    
      //Usart1 NVIC 配置
      NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3  
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		  //IRQ通道使能
      NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    

    中断函数的配置:

    void USART2_IRQHandler(void)                	//串口2中断服务程序
    	{
    		u8 Res2;
    		if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
       {
    			USART_ClearITPendingBit(USART2,USART_IT_RXNE);
    
    			Res2 =USART_ReceiveData(USART2);	//读取接收到的数据
    		 
    			USART_SendData(USART2,Res2);
    	 }
    	}
    
    展开全文
  • stm32f103rbt6 串口 USART2 通讯。 网上有很多USART1的例子,根据USART1改的USART2,很多人会失败不能用,USART1与USART2除了IO口不同外还要注意他们的时钟频率也不同,USART1时钟频率72Mhz,USART2为36Mhz。 stm32...
  • STM32串口USART小结

    2019-03-02 08:14:39
    5 串口USART 5.1 基本原理 (1)USART (2)/USART框图 (3)/波特率计算 5.2 硬件连接 (1)USB/RS232/TTL (2)CH340 (3)/RS-232 5.3 步骤 5.4 printf重定向 5 串口USART 端口复用+中断+USART 5.1 ...

    目录

     

    5 串口USART

    5.1 基本原理

    (1)USART

    (2)/USART框图

    (3)/波特率计算

    5.2 硬件连接

    (1)USB/RS232/TTL

    (2)CH340

    (3)/RS-232

    5.3 步骤

    5.4 printf重定向


    5 串口USART

    端口复用+中断+USART

    5.1 基本原理

    (1)USART

    通信方式

    并行通信

     

     

     

    串行通信

    传送方向

    单工

    单向数据传输方式

    半双工       

    可切换方向的数据双向传输方式

    全双工

    双向数据传输方式

    通信方式

    同步通信

    带时钟信号

    SPI,IIC通信接口

    异步通信

    带波特率、不带时钟

    接收双方(stm32/串口助手)波特率相同

    UART(通用异步收发器),单总线

    常见的串行通信接口:

    通信标准

    引脚说明

    通信方式

    通信方向

    UART

    TXD:发送端

    RXD:接受端

    GND:公共地

    异步通信

    全双工

    单总线

    (1-wire)

    DQ:发送/接受端

    异步通信

    半双工

    SPI

    SCK:同步时钟

    MISO:主机输入,从机输出

    MOSI:主机输出,从机输入

    同步通信

    全双工

    I2C

    SCL:同步时钟

    SDA:数据输入/输出端

    同步通信

    半双工

    UART

    STM32F10x系列

    3USART

    通用同步异步收发器

    可用作UART

    2UART

    通用异步收发器

    RXD

    数据输入引脚

    PA10

    PA3

    PB11

    PC11

    PD2

    TXD

    数据发送引脚

    PA9

    PA2

    PB10

    PC10

    PC12

    串口号

    1

    2

    3

    4

    5

     

    (2)/USART框图

    中文参考手册

     

     

    (3)/波特率计算

    衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:           10位×240个/秒 = 2400 bps

    这里的fCK是给外设的时钟(PCLK1用于USART2、 3、 4、 5, PCLK2用于USART1)
    USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。

    寄存器版:如何通过 USARTDIV 得到串口 USART_BRR 寄存器的值。 假设我们的串 口 1 要设置为 115200 的波特率,而 PCLK2 的时钟为 72M。这样,我们根据上面的公式有:

    USARTDIV=72000000/(115200*16)= 39.0625

    那么:DIV_Fraction=16*0. 0625=1=0X01;DIV_Mantissa=39=0X27;

    这样,我们就得到了 USART1->BRR 的值为 0X0271。只要设置串口 1 的 BRR 寄存器值为0X0271 就可以得到 115200 的波特率。

    5.2 硬件连接

    XCOM串口助手与STM32实现数据串行通信,注意USART相关参数要一致!

    STM32通过USART1实现与PC机对话,STM32的USART1收到PC机发来的数据后原封不动的返回给PC机显示。

    PA9,PA10(串口1)连接到了USB串口电路。

    (1)USB/RS232/TTL

    在计算机和单片机组成的RS-232串口通信系统中,下位机由单片机系统组成,上位机为普通的PC机。但现在的电脑上,已经不存在串口,所以一般使用USB转串口芯片,把电脑的USB口映射为串口用。

    上位机

    电平转换芯片

    下位机

    实例

    串口RS232(-12-12V)

    MAX232

    TTL(0-5V)

    51--计算机

    串口RS232(-12-12V)

    MAX3232

    TTL(0-5V/3.3V)

    STM32--计算机

    USB(-12-12V)

    CH340

    串口(0-5V/3.3V)

    51/STM32--计算机

    (2)CH340

    用串口和CH340模块都可以让计算机和单片机进行通信,但是使用CH340更加方便,省去了使用串口的麻烦。CH340是一个USB总线的转接芯片,实现USB转串口、USB转IrDA红外或者USB转打印口。

    CH340将普通的串口设备直接升级到USB总线、通过USB总线为计算机增加额外串口。通过外加电平转换器件,可以进一步提供RS232、RS485、RS422 等接口。

    (3)/RS-232

    RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准,20。RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排   列位置都有明确的定义。(阳/公头)

    插针序号

    信号名称

    功能

    信号方向

    1

    PGND

    保护接地

     

    2(3)

    TXD

    发送数据(串行输出)

    DTE→DCE

    3(2)

    RXD

    接收数据(串行输入)

    DTE→DCE

    4(7)

    RTS

    请求发送

    DTE→DCE

    5(8)

    CTS

    允许发送

    DTE→DCE

    6(6)

    DSR

    DCE就绪(数据建立就绪)

    DTE→DCE

    7(5)

    SGND

    信号接地

     

    8(1)

    DCD

    载波检测

    DTE→DCE

    20(4)

    DTR

    DTE就绪(数据终端准备就绪)

    DTE→DCE

    22(9)

    RI

    振铃指示

    DTE→DCE

     

    5.3 步骤

    main.c文件下的stm32f10x_usart.h文件中可以查到大部分相关函数!

    1时钟使能-复用端口

     

    串口时钟使能,GPIO时钟使能

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能串口1时钟

    2串口复位

     

    当外设出现异常的时候可以通过复位设置,实现该外设的复位

    void USART_DeInit(USART_TypeDef* USARTx);

    USART_DeInit(USART1); //复位串口 1

    3 GPIO端口初始化

     

    GPIO_Init();

    GPIO_InitTypeDef GPIO_InitStructure; //结构体定义

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //ISART1_TX PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RX PA.10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入


    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.10

    4串口参数初始化

     

    ①波特率②字长③停止位④奇偶校验位⑤硬件数据流控制⑥模式(收/发)

    void uart_init(u32 bound);//115200

    USART_InitTypeDef  USART_InitStructure;  //定义结构体

     

    USART_InitStructure.USART_BaudRate = bound; //波特率设置,用变量bound方便移植
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位字长USART_InitStructure.USART_StopBits = USART_StopBits_1; //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); //初始化串口

    5 使能串口

     

    串口先初始化,再使能

    USART_Cmd(USART1, ENABLE); //使能串口 1

    6 中断组/级初始化

    stm32f10x.h(IRQ)

     

    中断先初始化,再开启中断

     

    NVIC_InitTypeDef NVIC_InitStructure; //定义结构体

     

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级 3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级 3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能


    NVIC_Init(&NVIC_InitStructure); //中断优先级初始化

    7开启串口中断IT

    stm32f10x_usart.h

     

    当需要开启串口中断,则应使能串口中断,串口中断有很多,需要确定是那种中断

    void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
    FunctionalState NewState)

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断,接收到数据中断

    USART_ITConfig(USART1, USART_IT_TC, ENABLE); //发送数据结束中断

    8编写中断处理函数IRQ

    startup_stm32f10x_hd.s(IRQ)

     

    void USART1_IRQHandler(void);

    8.1中断响应状态

     

    使能了某中断,当中断发生会置位状态寄存器某标志位,在中断处理函数中可以调用函数判断该中断是哪种中断

    判断是否发生了该中断,发生则说明串口状态肯定改变了

    ①串口发送数据完成中断响应;②串口接收数据完成中断响应;③清除发送完成状态位

    USART_GetITStatus(USART1, USART_IT_RXNE) != RESET;//若使能串口接收完成中断,当中断发生了,便可以在中断处理函数中用函数判断到底是否发生该中断

    USART_GetITStatus(USART1, USART_IT_TC) != RESET;//是否发送完成

    8.2 串口状态

     

    在没有使能相应的中断函数时,通常使用该函数来判断标志位是否置位

    串口的状态可以通过状态寄存器 USART_SR 读取,

    RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除;

    TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了,如果设置了这个位的中断,则会产生中断,该位也有两种清零方式: 1)读 USART_SR,写USART_DR; 2)直接向该位写 0

     

    USART_GetFlagStatus(USART1, USART_FLAG_RXNE!=SET); //是否读取完成

    USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET; //是否发送完成

    8.3 串口传输数据获取

     

    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); //发送数据到串口

    uint16_t USART_ReceiveData(USART_TypeDef* USARTx); //从DR读取接受到的数据

     

    //usart.c中数据接收:

    void USART1_IRQHandler(void)      //串口1中断服务程序

    {

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET);//串口接收1字节数据

    Res =USART_ReceiveData(USART1);//(USART1->DR),读取接收到的数据

    //main.c中数据发送:

    len=USART_RX_STA&0x3f; //得到此次接收到的数据长度
    printf("\r\n 您发送的消息为:\r\n\r\n");
    for(t=0;t<len;t++)
    { USART_SendData(USART1, USART_RX_BUF[t]); //向串口 1 发送数据
     while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    }
    USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送完成状态标志

    }

    正点:

    #define USART_REC_LEN   200   //定义最大接收字节数 200

     u8  USART_RX_BUF[USART_REC_LEN];

    //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符

     u16 USART_RX_STA;    //接收状态标记

    USART_RX_STA

    bit15

    bit14

    bit14

    接收完成标志

    接收到0X0D标志

    接收到的有效数据个数

    ABCDEFGHI…….(0x0D),(0x0A)

    5.4 printf重定向

    我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用的与输出设备相关的函数。比如使用printf输出到串口,需要将fputc里面的输出指向串口,这一过程就叫重定向

    那么如何让STM32使用printf函数呢?

    #include stdio.h//头文件一定不能忘

    int fputc(int ch,FILE *p)  //函数默认的,在使用printf函数时自动调用

    {

    USART_SendData(USART1,(u8)ch);

    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

    return ch;

    }

     

    展开全文
  • 电子-串口USART1REMAPPB6PB7.rar,单片机/嵌入式STM32-F0/F1/F2
  • STM32串口USART通讯

    千次阅读 2017-10-05 07:49:14
    STM32串口USART通讯 1. USART和UART USART(Universal Synchronous Asynchronous Receiver and Transmitter)即通用同步异步收发器,它是一个串行通信设备,与外部设备可灵活进行全双工数据交换。在这之前...

    STM32串口USART通讯

    1. USART和UART

    USART(Universal Synchronous Asynchronous Receiver and Transmitter)即通用同步异步收发器,它是一个串行通信设备,与外部设备可灵活进行全双工数据交换。在这之前我们常用到的是UART(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。区分同步和异步最简单的方法就是看通信时需不需要对外提供时钟输出,我们平时使用的串口通信基本都是UART。关于串口通信其他基本概念,在上一篇文章http://blog.csdn.net/qq_29344757/article/details/75246263已有详细解析,这里不再赘述。

    2. STM32中USART功能框图

    这里写图片描述

    2.1 功能引脚

    (1)TX:输出引脚,用于发送数据 
    (2)RX:输入引脚,用于接收数据 
    (3)SW_RX:输入引脚,用于单线和智能卡模式,属于内部引脚,没有具体外部引脚引出 
    (4)IRDA_OUT:输出引脚,用于发送红外数据 
    (5)IRDA_IN:输入引脚,用于接收红外数据 
    (6)nRTS:请求以发送(Request To Send),n表低电平有效。若使能RTS硬件流控制,当USART接收器准备好接收数据时,nRTS有效,即它为低电平;当接收寄存器已满时,nRTS被设置为高电平 
    (7)nCTS:请求以发送(Clean To Send),n表低电平有效。若使能CTS硬件流控制,发送器在发送下一帧数据前会检测nCTS引脚状态,若为低电平表可以发送数据,若为高电平则在发送完当前数据帧之后停止发送。 
    (8)SCLK:发送器时钟输出引脚,仅适用于同步模式。

    2.2 数据寄存器

    USART数据寄存器(USART_DR)只有低9位有效, 
    这里写图片描述
    第9位数据是否有效要取决于USART_CR1(USART控制寄存器1)的M位设置, 
    这里写图片描述
    当M位为0时表示8位数据字长,当M位为1时表9位数据字长,一般我们使用8位数据字长。 
    USART_DR实际是包含了两个寄存器,一个专门用于发送的TDR,一个专门用于接收的RDR。进行发送数据操作时,往USART_DR写入数据会自动存储在TDR内,当进行读取数据操作时,向USART_DR读取数据会自动提取RDR数据。串行通信时一位一位传输的,所以TDR和RDR寄存器都是介于系统总线和移位寄存器间的:发送数据时把TDR内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到RDR。

    2.3 控制器

    STM32的USART有专门用于控制发送、接收、唤醒单元和中断等的寄存器。例如: 
    (1)USART_CR1寄存器的UE位用于开启/关闭给串口的时钟源的,使用USART之前向该位写1用于使能USART。 
    (2)USART_CR1寄存器的M位用于控制发送/接收数据字长可选8位/9位。 
    (3)USART_CR1寄存器的TE位用于启停数据发送,向该位写1时发送移位寄存器上的数据会从TX引脚输出,低位在前,高位在后。如果设置USART为同步模式,SCLK引脚将会输出时钟信号。 
    (4)USART_CR1寄存器的RE位用于开启/关闭USART的接收,若为1,接收器在RX线开始接收数据帧的起始位,确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内,接收完成后就要接收移位寄存器移到RDR内,并将USART_SR寄存器的RXNE位置1(若USART_CR2寄存器的RXNEIE置1的话此时可以产生中断)

    一般在我们编程中较为重要的USART_CR1寄存器标志位有: 
    在发送数据时,

    TE:发送使能
    TXE:发送寄存器为空
    TC: 发送完成
    TXIE:发送完成中断使能
    • 1
    • 2
    • 3
    • 4

    接收数据时,

    RE:接收使能
    RXNE:读数据寄存器非空
    RXNEIE:发送完成中断使能
    • 1
    • 2
    • 3

    2.4 波特率设置

    USART的发送器和接收器使用相同的波特率,计算公式为:

    Tx/Rx波特率 = USART的时钟频率 / (16 * USARTDIV)
    • 1

    USARTDIV是一个存放波特率寄存器(USART_BRR)的无符号浮点数 
    这里写图片描述
    DIV_Mantissa[11:0]表示USARTDIV的整数部分 
    DIV_Fraction[3:0]表示USARTDIV的小数部分。 
    例如:DIV_Mantissa = 26(0x1a),DIV_Fraction = 12(0x0c),那么USART_CRR的值为0x26c。USARTDIV的小数位12 / 16 = 0.75,整数位26,最终USARTDIV的值为26.75。 
    假设知道USARTDIV的值为22.63,那么,DIV_Fraction = 16 * 0.63 = 10.08,最接近的整数位10,即DIV_Fraction = 0x0a,DIV_Mantissa = 22,即为0x16。 
    以USART1为例,它是挂接在APB2总线上的: 
    这里写图片描述
    即USART1的时钟源频率为72MHz,那么如果要得到115200的波特率,即: 
    115200 = 72000000 / (16 * USARTDIV),USARTDIV = 39.0625, 
    同理计算可得,DIV_Fraction = 0.0625 * 16 = 1,DIV_Mantissa = 39,USART_BRR的值设置为0x271。

    2.5 校验控制

    STM32F103系列单片机的USART支持奇偶校验,USART_CR1寄存器的PCE位置1就可以启动奇偶校验,奇偶检验由硬件自动完成。使能奇偶校验控制后,每个字符帧的格式变为:

    起始位 + 数据帧 + 校验位 + 停止位
    • 1

    注意,当使用校验位时,USART_CR1寄存器的M位需要设置为1,即9位模式,因为串口传输的长度为8位数据帧加上1位校验位共9位。启动奇偶校验控制后,在发送数据帧时会自动添加校验位,接收数据帧时自动验证校验位。接收数据时若出现奇偶校验位验证失败,USART_SR寄存器的PE位会被置1并可以产生奇偶校验中断。

    2.6 中断控制

    USART有多个中断请求事件,常用中断请求有: 
    这里写图片描述

    3. USART初始化数据结构

    有了标准库,我们的编程变得十分简单,若上面讲到的寄存器操作及原理不清晰,也不是我们要动手编程的阻碍了,不过了解下总归是好的。 
    初始化结构体定义在标准外设库的stm32f10x_usart.h文件中:

    typedef struct
    {
      uint32_t USART_BaudRate;            //波特率,标准库会根据此值计算得到USARTDIV的值,从而设置USART_BRR的值。
      uint16_t USART_WordLength;          //字长,可选8位或9位(多一位表带奇偶校验)
      uint16_t USART_StopBits;            //停止位,0.5、1、1.5、2个停止位可选。设置在USART_CR2的STOP[1:0]位
      uint16_t USART_Parity;              //校验位,可设置USART_Parity_No,USART_Parity_Even(偶校验),USART_Parity_Odd(奇校验)。
                                          //设置在USART_CR1的PCE、PS位
      uint16_t USART_Mode;                //USART模式,USART_Mode_Rx和USART_Mode_Tx可选,可或
      uint16_t USART_HardwareFlowControl; //硬件流控制,可使能RTS/使能CTS/同时使能RTS和CTS,不使能硬件流
    } USART_InitTypeDef;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4. USART编程使用到的外设库函数

    4.1 USART时钟使能

    以USART1为例,它是挂接在APB2总线在的外设,使能函数为

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
    • 1

    4.2 USART复位

    当外设出现异常时可通过复位设置实现对外设的复位,然后重新配置该外设使其重新工作。一般系统在刚开始配置外设时,都会先执行复位外设操作。USART的复位函数为

    void USART_DeInit(USART_TypeDef* USARTx);
    • 1

    复位USART1时

    USART_DeInit(USART1);
    • 1

    4.3 串口初始化

    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
    • 1

    参数一为待初始化的串口标号 
    参数二为USART_InitTypeDef类型的结构体指针,原型及其意义在前面已讲

    4.4 USART发送数据

    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
    • 1

    该函数向USART_DR写入一个数据,串口会自动发送。

    4.5 接收数据

    uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
    • 1

    该函数是操作USART_DR读取串口接收到的数据

    4.6 串口状态

    串口的状态是保存在USART_SR寄存器中,读取串口状态寄存器的函数为】

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
    • 1

    参数二表示我们要查看串口的哪种状态,可取值为:

    USART_FLAG_LBD:  LIN Break detection flag
    USART_FLAG_TXE:  Transmit data register empty flag(传输数据寄存器为空标志)
    USART_FLAG_TC:   Transmission Complete flag(传输完成标志)
    USART_FLAG_RXNE: Receive data register not empty flag
    USART_FLAG_IDLE: Idle Line detection flag
    USART_FLAG_ORE:  OverRun Error flag
    arg USART_FLAG_NE:   Noise Error flag
    arg USART_FLAG_FE:   Framing Error flag
    arg USART_FLAG_PE:   Parity Error flag
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.7 串口使能

    void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
    • 1

    4.8 串口响应中断

    void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
    • 1

    参数二表示使能串口哪种中断。串口能产生中断的中断源有许多,取值为:

    USART_IT_CTS:  CTS change interrupt (not available for UART4 and UART5)
    USART_IT_LBD:  LIN Break detection interrupt
    USART_IT_TXE:  Transmit Data Register empty interrupt
    USART_IT_TC:   Transmission complete interrupt
    USART_IT_RXNE: Receive Data register not empty interrupt(接收数据中断)
    USART_IT_IDLE: Idle line detection interrupt
    USART_IT_PE:   Parity Error interrupt
    USART_IT_ERR:  Error interrupt(Frame error, noise error, overrun error)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.9 获取相应中断状态

    使能某中断后,当该中断发生了就会设置状态寄存器的某个标志位。在中断服务函数中我们经常要去判断是哪个中断源,

    ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
    • 1

    若使能了串口发送完成中断,判断是否产生该中断时用

    USART_GetITStatus(USART1, USART_IT_TC);
    • 1

    返回值等于SET,说明发生串口发送完成中断。

    5. 编程实践

    硬件平台采用MiniSTM32开发板,要实现板载USART和计算机通讯,需要用到一个USB转USART的芯片,MiniSTM32开发板采用的转换芯片为CH340G。硬件接线图为: 
    这里写图片描述
    需要注意的是,STM32的USART1的引脚和CH340的接线。USART1的发送、接收引脚分别是PA9和PA10: 
    这里写图片描述 
    通过跳线帽将PA9(U1_TXD)、PA10(U1_RXD)连接到CH340G的RXD、TXD。这个在配置GPIO功能的时候要注意是以STM32芯片原理图上的引脚功能为准。

    程序实现功能:开发板上电后通过USART发送字符串到计算机(计算机用串口调试助手接收),进而开发板进入等待中断状态,若计算机通过串口调试助手向开发板发数据就会触发STM32的接收数据终中断,在中断服务函数中接收数据并将数据发回给计算机。

    STM32的串口编程关键点在于: 
    (1)使能RX和TX引脚GPIO时钟和USART时钟 
    (2)初始化GPIO,并将GPIO复用到USART上。参照《STM32中文参考手册_V10.pdf》-P110 外设的GPIO配置-USART部分 
    这里写图片描述
    (3)配置USART初始化参数 
    (4)配置终端控制器NVIC并使能USART接收中断 
    (5)使能USART 
    (6)在USART1中断服务函数中实现数据接收和发送

    编程环境采用MDK5,工程结构如图: 
    这里写图片描述

    BSP/BSP_USART.c中实现对USART的所有操作及NVIC初始化操作,相关声明在BSP/BSP_USART.h中:

    //BSP_USART.h
    #ifndef __BSP_UART_H__
    #define __BSP_UART_H__
    
    #include <stm32f10x_conf.h>
    
    void NVIC_Configuration(void);
    void USART_Configuration(void);
    void USART_SendChar(USART_TypeDef* pUSARTx, uint8_t c);
    void USART_SendString(USART_TypeDef* pUSARTx, char* str);
    
    #endif /* __BSP_UART_H__ */
    
    //BSP_USART.c
    #include "BSP_USART.h"
    
    //配置NVIC
    void NVIC_Configuration(void)
    {
        NVIC_InitTypeDef NVIC_InitStu;
    
        //设置中断分组寄存器
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
        NVIC_InitStu.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
    
        NVIC_Init(&NVIC_InitStu);
    }
    
    void USART_Configuration(void)
    {
        GPIO_InitTypeDef GPIO_InitStu;
        USART_InitTypeDef USART_InitStu;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
        //PA9用作串口1输入引脚,配置为浮空输入
        GPIO_InitStu.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStu.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStu.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStu);
    
        //PA10用作串口1输出引脚,配置为复用推挽输出
        GPIO_InitStu.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStu.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStu);
    
        //设置USART初始化结构体
        USART_InitStu.USART_BaudRate = 115200;
        USART_InitStu.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_InitStu.USART_Parity = USART_Parity_No;
        USART_InitStu.USART_StopBits = USART_StopBits_1;
        USART_InitStu.USART_WordLength = USART_WordLength_8b;
        USART_InitStu.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_Init(USART1, &USART_InitStu);
    
        //配置NVIC
        NVIC_Configuration();
    
        //使能串口接收中断
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
        //开启
        USART_Cmd(USART1, ENABLE);
    }
    
    //发送一个字符
    void USART_SendChar(USART_TypeDef* pUSARTx, uint8_t c)
    {
        USART_SendData(pUSARTx, c);
    
        //等待发送结束标志
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    }
    
    //发送字符串
    void USART_SendString(USART_TypeDef* pUSARTx, char* str)
    {
        uint32_t n = 0;
    
        while (*(str + n) != '\0')
        {
            USART_SendChar(pUSARTx, *(str + n));
            n++;
        }
        //等待发送结束标志
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    USART1的接收数据产生的中断的中断服务函数在stm32f10x_it.c中实现:

    void USART1_IRQHandler(void)
    {
        uint16_t c;
    
        //判断是否为USART1的接收中断
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
            c = USART_ReceiveData(USART1);
            USART_SendData(USART1, c);
        }   
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在main函数中:

    #include <BSP_USART.h>
    
    int main(void)
    {
    
        USART_Configuration();
        USART_SendString(USART1, "HelloWorld\n");
        //USART_SendChar(USART1, 'h');
        while (1);  
    
        return 0;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    发送完”HelloWorld\n”后进入等待中断中。

    下载运行,注意若使用板载的串口下载方式下载程序,就会占用了USART1发送/接收数据用的串口,所以需要下载完程序后再用串口调试助手测试。另外,计算机串口调试助手的波特率、停止位、数据位等要跟在代码中的设置一致。运行如图:

    这里写图片描述

    0

    展开全文
  • STM32串口USART1接收字符串

    千次阅读 2020-10-17 16:38:29
    STM32F407ZE开发板实现使用串口USART1接收、发送字符串实例 具体代码及解析如下: main.c部分 #include <stm32f4xx.h> #include "led.h" #include "ustart.h" #include <string.h> int main() { LED_...
  • atmega128串口usart通信代码电路图全套
  • LPC11E68串口USART1学习笔记 https://www.yiboard.com/thread-628-1-1.html LPC11E68微控制器带有5个USART串口。USART1-4与UART0不同,有一套不同的寄存器映射和寄存器功能。 USART1时钟 USART1外设挂载在LPC11E...
  • STM32F1案例 串口USART使用 硬件平台 野火STM32F103ZET6 霸道V2开发板 正点原子F1系列开发板 STM32F103ZET6核心板 ST7735 TFT液晶显示屏 软件平台 Keil MDK 5.31 串口调试助手 STM32F103ZET6 串口 结构 串口...
  • STM32串口USART1程序

    2020-08-11 07:51:33
    PA9,PA10端口复用为串口1的TX,RX。 在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟进行使能,同时由于用到复用IO口功能用于配置串口。因此...
  • STM32串口USART2程序

    2020-08-11 07:24:47
    PA2,PA2端口复用为串口2的TX,RX。在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟。进行使能,同时由于用到复用IO口功能用于配置串口。因此...
  • STM32《串口USART收发》第一个字符丢失问题 问题及现象 stm32 串口发送数据第一字节丢失 使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04…接收端收到的数据...
  • stm32串口USART

    2013-07-24 15:07:21
    STM32的串口通信可以在lcd12864中显示发送的内容
  • STM32串口usart

    2020-01-11 11:20:58
    STM32 串口 UART串口通信协议是嵌入式开发的常用通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。 异步串行通讯 异步通信是指发送和接收端使用的是...
  • STM32串口USART

    2018-10-26 21:28:36
    一、通用同步异步收发器(USART)   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的 外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它...
  • ** 中断 中断有中断标志位和中断使能位,当开启对应的中断使能时,若其中断标志位置1,则会进入对应的中断服务函数,需要注意的是标志位是否自动清0。 ...USART_IT_TC,USART_IT_TXE中断标志位的区
  • 网上有很多USART1的例子,根据USART1改的USART2,很多人会失败不能用,USART1与USART2除了IO口不同外还要注意他们的时钟频率也不同,USART1时钟频率72Mhz,USART2为36Mhz。
  • STM32 串口USART1 的使用

    2021-01-03 23:19:39
    1.初始化串口要用的GPIO 2.初始化结构体USART_InitTypeDef 3.中断配置 NVIC_InitTypeDef 4.使能串口中断 5.编写发生和接收函数 6.中断函数 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) 发送一个数据...
  • STM32基础知识3-STM32串口USART1的使用方法和程序http://blog.csdn.net/OurRtems/article/details/72730346 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备...
  • AVR单片机异步串行通信(USART)实验 详细的说明和寄存器介绍。
  • 因学校比赛原因接触到RFID技术,并结合STM32单片机开发一卡通系统。由于需要和RFID读写器通信,以及上位机...阶段一:demo程序功能:通过串口USART2接收数据包,并把数据再发回去。RFID型号M3650A-HA 数据包第二个数据
  • STM32F1 串口USART_SendData

    2021-03-28 11:12:26
    做平衡车的时候,换了串口2 ,自己配置了一下,然后用USART_SendData()发送数据,写了这个 USART_SendData(USART2,9),结果输出的是B, 然后换成USART_SendData(USART,‘9’),就输出正常的9,很奇怪,因为...
  • 目录一、时钟的配置二、USART的配置1、引脚配置2、中断及其他配置三、...生成的串口中断代码如下: void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_
  • 运行的芯片是STM32F103RCT6 使用单独的USART2通道 功能:使用串口调试助手,发送什么就返回什么 程序说明:本程序是用野火的程序移植后修改的
  • 流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-1284、IEEE-1394 等标准,是由“委员会定制”。因而...
  • stm32f103 学习笔记 —— 06 串口USART

    千次阅读 2018-05-19 18:04:24
    编程要点:初始化串口需要用到的GPIO初始化串口USART_InitTypeDef中断配置(接收中断,中断优先级)使能串口编写发送和接收函数编写中断服务函数宏:// 串口1-USART1 #define DEBUG_USARTx USART1 #define DEBUG_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,462
精华内容 1,784
关键字:

串口usart