嵌入式stm32学习:USART串口通信

发布者:BlissfulMoments最新更新时间:2019-06-21 来源: eefocus关键字:stm32  USART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

bsp_debug_usart.h


#ifndef __DEBUG_USART_H

#define __DEBUG_USART_H


#include "stm32f4xx.h"

#include



//引脚定义

/*******************************************************/

#define DEBUG_USART                             USART1

#define DEBUG_USART_CLK                         RCC_APB2Periph_USART1

#define DEBUG_USART_BAUDRATE                    115200  //串口波特率


#define DEBUG_USART_RX_GPIO_PORT                GPIOA

#define DEBUG_USART_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOA

#define DEBUG_USART_RX_PIN                      GPIO_Pin_10

#define DEBUG_USART_RX_AF                       GPIO_AF_USART1

#define DEBUG_USART_RX_SOURCE                   GPIO_PinSource10


#define DEBUG_USART_TX_GPIO_PORT                GPIOA

#define DEBUG_USART_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOA

#define DEBUG_USART_TX_PIN                      GPIO_Pin_9

#define DEBUG_USART_TX_AF                       GPIO_AF_USART1

#define DEBUG_USART_TX_SOURCE                   GPIO_PinSource9


#define DEBUG_USART_IRQHandler                  USART1_IRQHandler

#define DEBUG_USART_IRQ                                 USART1_IRQn

/************************************************************/


void Debug_USART_Config(void);

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);

void Usart_SendString( USART_TypeDef * pUSARTx, char *str);


void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);


#endif /* __USART1_H */



bsp_debug_usart.c


/**

  ******************************************************************************

  * 重定向C库的printf函数到usart端口,中断接收模式

  ******************************************************************************

  */ 


#include "./usart/bsp_debug_usart.h"

 /**

  * 配置嵌套向量中断控制器NVIC

  */

static void NVIC_Configuration(void)

{

  /* 创建一个NVIC中断控制器 */

  NVIC_InitTypeDef NVIC_InitStructure;


  /* 配置NVIC为优先级组2 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


  /* 配置USART为中断源 */

  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;

  /* 配置抢占优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

  /* 配置子优先级:1 */

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  /* 使能中断 */

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  /* 初始化配置NVIC */

  NVIC_Init(&NVIC_InitStructure);

}


 /**

  * DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1,中断接收模式

  */

void Debug_USART_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;


  RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);


  /* 使能USART时钟 */

  RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);


  /* GPIO初始化 */

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  /* 配置Tx引脚为复用功能 */

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN  ;  

  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  /* 配置Rx引脚为复用功能 */

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


 /* 连接PXx到USART_Tx */

  GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);


  /* 连接PXx到USART_Rx */

  GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);


  /* 配置串DEBUG_USART模式 */

  /* 波特率设置DEBUG_USART_BAUDRATE */

  USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

  /* 字长(数据位+校验位):8 */

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  /* 停止位:1个停止位 */

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  /* 校验位选择:不使用校验 */

  USART_InitStructure.USART_Parity = USART_Parity_No;

  /* 硬件流控制:不使用硬件流 */

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  /* USART模式控制:同时使能接收和发送 */

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  /* 完成USART初始化配置 */

  USART_Init(DEBUG_USART, &USART_InitStructure); 


  /* 嵌套向量中断控制器NVIC配置 */

    NVIC_Configuration();


    /* 使能串口接收中断 */

    USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);


  /* 使能串口 */

  USART_Cmd(DEBUG_USART, ENABLE);

}


/*****************  发送一个字符 **********************/

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)

{

    /* 发送一个字节数据到USART */

    USART_SendData(pUSARTx,ch);


    /* 等待发送数据寄存器为空/发送完成 */

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

}


/*****************  发送字符串 **********************/

void Usart_SendString( USART_TypeDef * pUSARTx, char *str)

{

    unsigned int k=0;

  do 

  {

      Usart_SendByte( pUSARTx, *(str + k) );

      k++;

  } while(*(str + k)!='');


  /* 等待发送完成 */

  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)

  {}

}


/*****************  发送一个16位数 **********************/

void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)

{

    uint8_t temp_h, temp_l;


    /* 取出高八位 */

    temp_h = (ch&0XFF00)>>8;

    /* 取出低八位 */

    temp_l = ch&0XFF;


    /* 发送高八位 */

    USART_SendData(pUSARTx,temp_h); 

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


    /* 发送低八位 */

    USART_SendData(pUSARTx,temp_l); 

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

}


// 重定向C库函数printf到串口,重定向后可使用printf函数

int fputc(int ch, FILE *f)

{

        /* 发送一个字节数据到串口 */

        USART_SendData(DEBUG_USART, (uint8_t) ch);


        /* 等待发送完毕 */

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


        return (ch);

}


// 重定向C库函数scanf到串口,重定向后可使用scanf、getchar等函数

int fgetc(FILE *f)

{

        /* 等待串口输入数据 */

        while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);


        return (int)USART_ReceiveData(DEBUG_USART);

}

/*********************************************END OF FILE**********************/


关键字:stm32  USART  串口通信 引用地址:嵌入式stm32学习:USART串口通信

上一篇:嵌入式stm32学习:DMA-存储到存储
下一篇:嵌入式stm32学习:系统定时器

推荐阅读最新更新时间:2024-11-17 11:50

STM32自学笔记——复用重映射
端口复用 什么事端口复用: STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 如何使用: 1.使能GPIO时钟 2.使能复用功能的时钟 3.依据数据手册设置GPIO口数据 eg. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//①IO时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//②外设时钟使能//③初始化IO为对应的模式GPIO_InitStructure.GPIO_P
[单片机]
STM32】外部中断概述、寄存器、库函数(EXTI一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件 外部中断概述 外部中断(EXTI),和在【STM32】NVIC中断优先级管理(中断向量表) 中讲述的CM3内核的外部中断不同。特指的是,在中断向量表中的EXTI的外部中断。STM32的每个IO都可以作为外部中断输入。 外部中断线 STM32的中断控制器支持19个外部中断、事件请求(也就是19条外部中断线): 线0~15:对应外部IO口的输入中断; 线16:连接到PVD输出; 线17:连接到RTC闹钟事件; 线18:连接到USB唤醒事件。 每条外部中断线可以独立的配置触发方式(上升沿、下降沿或者双边沿触发)、使能/失能
[单片机]
【<font color='red'>STM32</font>】外部中断概述、寄存器、库函数(EXTI一般步骤)
STM32 UART2程序
USART1程序很多,看看USART2程序。注意红色部分,首先要使能相关端口的时钟。 因为USART2可以映射成不同的端口,所以要端口映射。 结合你自己的开发板,设置正确的映射口.(正点原子的是PA03PA02.) STM32F103ZE默认的USART2就是PA03PA02,如果配置映射,USART2端口是PD05PD06了。 程序在正点原子开发板SRAM中调试通过,开发环境IAR5.30. void USART2_Initialise( u32 bound ) { GPIO_InitTypeDef GPIO_InitStructure;//I/O¿ú3õê¼»ˉ½á11ìå NVIC_InitTypeDef N
[单片机]
嵌入式-stm32学习:使用固件库点亮LED
bsp_led.h #ifndef __LED_H #define __LED_H #include stm32f4xx.h //引脚定义 /*******************************************************/ //红色灯 R #define LED1_PIN GPIO_Pin_10 //GPIO引脚号 #define LED1_GPIO_PORT GPIOH //GPIO端口H #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOH //GPIO端口时钟 //绿色
[单片机]
stm32学习——中断的优先级设置
stm32的中断具有不同的优先级,可以使用NVIC(嵌套向量中断控制器,Nested Vectored Interrupt Controller)来控制。 一、基本原理介绍 stm32的中断优先级分主副两类(也称为抢占式优先级和响应式优先级),主优先级是抢占式的(为零表示最高),即,优先级高的中断到来时即使优先级较低的中断正在执行,也要停下来先执行优先级较高的中断。而辅优先级是非抢占式的,即,具有相同主优先级的两个中断,如果辅优先级较高的中断到来,此时有副优先级较低的中断正在执行,要等这个中断执行完了再执行后到来的这个中断。 stm32使用4为寄存器来管理中断优先级,NVIC_PriorityGroup来设置中断优先级的分组方式的
[单片机]
STM32建立IAR开发环境
以前用IAR,正点原子提供的是MDK开发环境,我重新建立了一个IAR5.30工程,使用MDK库函数版本。拷贝MDK库函数版本工程到一个工程目录下就好了,见下图。几个icf文件要从其他地方考过来,不难的。startup_stm32f10x_hd.s文件要使用IAR格式的,在IAR安装目录中有MDK,GCC,IAR三种格式的,需要使用IAR格式。 IAR开发环境设置。 这里要选择FULL ,不然会出现FILE not found 的错误。 上面的红圈很重要,第一个是头文件目录,必须要设置,工程下所有用到的.h文件 第二个是宏定义,USE_STDPERIPH_DRIVER和STM32F10X_HD必须要添加,VECT_TAB_SRA
[单片机]
浅谈费控电表在充电站微电网的应用
摘要:现阶段由于充电站内的电费计量模块不能接入电网公司电表系统,电网公司需额外加装电表获取充电数据。设计了一种基于储能电表的充电站,整合电表与充电站的重复功能模块。利用STM32F103C8T6微控制器结合控制器局域网络总线完成充电站与储能电表之间的电气连接和交互控制,并进行了样机开发验证。结果表明相较于传统充电站,基于储能电表的充电站可以简化充电站结构,降低充电站制造、安装成本,更好地实现电动汽 0引言 近年来我国电动汽车(ElectricVehicle,EV)销量持续猛增,根据预测2021年中国新能源汽车销量或将超过180万辆,相较2020年销量同比增长明显。一方面持续增长的EV充电负荷会产生新的充电高峰,对电网运行造成
[单片机]
浅谈费控电表在充电站微电网的应用
关于STM32 ADC时采用DMA的一点疑问
手册上有这样的话:只有ADC1能够产生DMA请求,似乎是只有ADC通道1能采用DMA方式传输数据。 但是万利的开发板上的ADC例子,用的是ADC通道10,还用了DMA 方式传数据。 所以我猜测 “只有ADC1能够产生DMA请求”中提到的ADC1 并不是指ADC 通道1, 而是软件可配置的 ADC 通道的分类形式,可分为ADC1和ADC2. 我们可将 通道10(或其他)配置成ADC1 “模式”。通过函数 /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_5
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved