• STM32串口通信-代码实现


    代码实现

    功能实现:与上位机进行通信

    宏定义需要的GPIO

    //头文件中的引脚 宏定义
    #ifndef _USART_H
    #define _USART_H
    
    #include "stm32f10x.h"
    #include <stdio.h>
    
    // 串口1-USART1
    //#define  USART1                   USART1
    #define  USART1_CLK                RCC_APB2Periph_USART1
    #define  USART1_APBxClkCmd         RCC_APB2PeriphClockCmd
    #define  USART1_BAUDRATE           115200
    
    // USART GPIO 引脚宏定义
    #define  USART1_GPIO_CLK           (RCC_APB2Periph_GPIOA)
    #define  USART1_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
        
    #define  USART1_TX_GPIO_PORT       GPIOA   
    #define  USART1_TX_GPIO_PIN        GPIO_Pin_9
    #define  USART1_RX_GPIO_PORT       GPIOA
    #define  USART1_RX_GPIO_PIN        GPIO_Pin_10
    
    #define  USART1_IRQ                USART1_IRQn
    #define  USART1_IRQHandler         USART1_IRQHandler
    
    void USART_Config(void);
    void Usart_SendByte(USART_TypeDef *TX, uint8_t data);
    void Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data);
    void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num);
    void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str);
    
    #endif
    
    

    串口初始化配置

    //这里只在这个函数使用 可用static限制一下
    //中断分组配置函数
    static void NVIC_Configuration(void)
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      /* 嵌套向量中断控制器组选择 */
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      
      /* 配置USART为中断源 */
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQ;
      /* 抢断优先级*/
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
      /* 子优先级 */
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      /* 使能中断 */
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      /* 初始化配置NVIC */
      NVIC_Init(&NVIC_InitStructure);
    }
    
    
    //串口初始化函数
    void USART_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    
    	// 打开串口GPIO的时钟
    	//DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
    	RCC_APB2PeriphClockCmd(USART1_GPIO_CLK, ENABLE);
    	// 打开串口外设的时钟
    	//DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
    	RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);
    	
    	//将USART TX的GPIO配置为推挽复用模式
    	GPIO_InitStructure.GPIO_Pin   = USART1_TX_GPIO_PIN;
    	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; 
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(USART1_TX_GPIO_PORT,&GPIO_InitStructure);
    	
    	//将USART RX的GPIO配置为浮空输入模式
    	GPIO_InitStructure.GPIO_Pin  = USART1_RX_GPIO_PIN;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStructure);
    	
    	//配置串口的工作参数
    	//波特率
    	USART_InitStructure.USART_BaudRate = USART1_BAUDRATE;
    	// 配置 针数据字长
    	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);
    	
    	// 串口中断优先级配置
    	NVIC_Configuration();
    	
    	// 使能串口接收中断
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
    	
    	// 使能串口
    	USART_Cmd(USART1, ENABLE);	    
    	
    }
    
    

    给上位机发送数据

    提示:下面这些函数 都在usart.c中哦(⊙o⊙)

    发送一个字节

    void Usart_SendByte(USART_TypeDef *TX_usart, uint8_t data)
    {
    	USART_SendData(TX_usart,data);
    	//检测串口发送的数据
    	//若没有数据来 就会一直等待
    	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
    
    

    发送两个字节

    void  Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data)
    {
    	uint8_t temp_h,temp_l;
    	
    	temp_h = (data&0xff00) >> 8;
    	temp_l = data&0xff;
    	
    	//发送高八位
    	USART_SendData(TX_usart,temp_h);
    	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
    	//发送低八位
    	USART_SendData(TX_usart,temp_l);
    	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
    }
    

    发送八位数组

    void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num)
    {
    	uint8_t i;
    	for(i=0; i<num; i++)
    	{
    		Usart_SendByte(TX_usart,array[i]);
    	}
    	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
    }
    

    发送字符串

    void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str)
    {
    	uint8_t i = 0;
    	do
    	{
    		Usart_SendByte(TX_usart,str[i]);
    		i++;
    	}while(str[i] != '');
    	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
    }
    
    

    注意:要勾选keil中的 ues MicroLIB选项

    重定向c库函数调用

    //重定向c库函数printf到串口,重定向后可使用printf函数
    int fputc(int ch, FILE *f)
    {
    		/* 发送一个字节数据到串口 */
    		USART_SendData(USART1, (uint8_t) ch);
    		
    		/* 等待发送完毕 */
    		while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		
    	
    		return (ch);
    }
    
    //重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
    int fgetc(FILE *f)
    {
    		/* 等待串口输入数据 */
    		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    
    		return (int)USART_ReceiveData(USART1);
    }
    

    主程序测试

    #include "stm32f10x.h"
    #include "led.h"
    #include "key.h"
    #include "systick.h"
    #include "usart.h"
    
    int main(void)
    {
    	uint8_t array[] = {0x00,0x01,0x03,0x04,0x05};
    	
    	USART_Config();
    
    	Usart_SendByte(USART1,100);
      Usart_Two_SendByte(USART1,0xff00);
    	Usart_SendArray(USART1,array,5);
    	Usart_SendStr(USART1,"陈一一哇龘
    "); 
    
    	printf("chen yi yi wa
    
    
    
    ");
    	while(1)
    	{
    		
    	}
    }
    
    
  • 相关阅读:
    超简单的博弈算法题,一行代码解决!
    图解「剑指Offer」之用前序和中序遍历序列构建二叉树
    GitHub 标星 2.4w!最火正则表达式课程学起来!
    经典面试题:最长公共子序列
    记一道字节跳动的算法面试题
    LeetCode 实战:「图解」二叉树中的最大路径和
    你离攻克数据结构与算法,只差这一步
    在《我的世界》里从零打造一台计算机有多难?复旦本科生大神花费了一年心血...
    三分钟理解字符串经典考题:有效的字母异位词
    【算法之美】改变世界的十位算法大师
  • 原文地址:https://www.cnblogs.com/Serendipitychen/p/13915158.html
Copyright © 2020-2023  润新知