STM32下串口的使用

发布者:深沉思考最新更新时间:2016-06-07 来源: eefocus关键字:STM32  串口 手机看文章 扫描二维码
随时随地手机看文章

STM32下关于串口的固件库写得相当好了,以下只是本文对串口库的一点点封装:

 

/*HKY_uart.h*/

#ifndef _HKY_UART_H_
#define _HKY_UART_H_

#include "stm32f10x_lib.h"
//#include "platform_config.h"
#define  GPIO_RTSPin              GPIO_Pin_1
#define  GPIO_CTSPin              GPIO_Pin_0
#define  GPIO_TxPin               GPIO_Pin_2
#define  GPIO_RxPin               GPIO_Pin_3

void USART2_Configuration(void);

int USART_sendBuf(USART_TypeDef* USARTx, u8 *buf, u32 len);


int USART_recvBuf(USART_TypeDef* USARTx, u8 *buf, u32 len);

#endif //_HKY_UART_H_

/*HKY_uart.c*/

#include "HKY_uart.h"

/* --------------------------------------------------------------------------*/
/ 
 * @Brief:  USART2_Configuration 
 */
/* --------------------------------------------------------------------------*/
void USART2_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    //IO port----------------------------------------------------------------------
    /* Configure USART2 RTS and USART2 Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;//GPIO_RTSPin | GPIO_TxPin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 CTS and USART2 Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;//GPIO_CTSPin | GPIO_RxPin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    /* USART2 configuration ------------------------------------------------------*/
    /* USART2 configured as follow:
	- BaudRate = 115200 baud  
	- Word Length = 8 Bits
	- One Stop Bit
	- No parity
	- Hardware flow control enabled (RTS and CTS signals)
	- Receive and transmit enabled
    */
    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_HardwareFlowControl_RTS_CTS;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART2, &USART_InitStructure);
    /* Enable the USART2 */
    USART_Cmd(USART2, ENABLE);
    USART_ClearFlag(USART2, USART_FLAG_TC); // clear flag
}

/* --------------------------------------------------------------------------*/
/ 
 * @Brief:  USART_sendBuf 
 * 
 * @Param: USARTx, which uart port
 * @Param: buf, send buffer
 * @Param: len, buffer length
 * 
 * @Returns:   send bytes count
 */
/* --------------------------------------------------------------------------*/
int USART_sendBuf(USART_TypeDef* USARTx, u8 *buf, u32 len)
{
    u32 busy_cnt = 0;
    u32 i = 0;

    while (i < len)
    {
	USART_SendData(USARTx, buf[i++]);
	busy_cnt = 0;
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
	{
	    busy_cnt++; 
	    if (busy_cnt > 0xffff)
		return i; //send error, return sended bytes count
	}
    }
    return len; 
}

/* --------------------------------------------------------------------------*/
/ 
 * @Brief:  USART_recvBuf 
 * 
 * @Param: USARTx, which uart port
 * @Param: buf, receive buffer
 * @Param: len, buffer length
 * 
 * @Returns:  received bytes count
 */
/* --------------------------------------------------------------------------*/
int USART_recvBuf(USART_TypeDef* USARTx, u8 *buf, u32 len)
{
    u32 busy_cnt = 0;
    u32 i = 0;

    while (i < len)
    {
	if(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) != RESET)
	{
	   buf[i] = USART_ReceiveData(USARTx) & 0xff;
	   i++;
	}
	else
	{
	    busy_cnt++;
	}
	
	if (busy_cnt > 0xffff)
	    return i; //receive error, return received bytes count
    }
    return len;
}
 
关键字:STM32  串口 引用地址:STM32下串口的使用

上一篇:基于51系列单片机控制步进电机调速闭环系统设计
下一篇:基于T89C51CC0X系列的程序下载器与通讯调试器设计

推荐阅读最新更新时间:2024-03-16 14:56

STM32学习总结之Sysstick(系统滴答定时器)
学习内容: 1、Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer STM32内核有一个定时器。 2、有定时器就需要有时钟源,时钟源可以是内部的还可以是外部的,需要阅读使用手册确定什么作为时钟源。 在STM32 中SysTick 以 HCLK(AHB 时钟)或HCLK/8 作为运行时钟 3、SysTick 是一个24 位的定时器,即一次最多可以计数2^24 个时钟脉冲,这 个脉冲计数值被保存到 当前计数值寄存器STK_VAL(SysTick current value register) 中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直至0,当STK_VAL 的值被
[单片机]
<font color='red'>STM32</font>学习总结之Sysstick(系统滴答定时器)
其实,STM32有隐藏的定时器~
DWT 在Cortex-M里面有一个外设叫DWT(DataWatchpoint andTrace),是用于系统调试及跟踪,DWT的中文名字应该是:数据观察点触发。在STM32用户手册的第32章节Debugsupport (DBG)有如下框图。 明显DWT属于DBG部分的功能,从上图的标题可以看出DWT属于CortexM3内核的,理论上M3内核的MCU都支持的,这个下文会说明。在这里我将其称之为“隐藏的定时器”,因为他可以代替定时器外设实现上文提到延时功能和测量代码运行时间的功能,DWT不能代替定时器的其他功能。 之所以DWT可以实现延时功能,因为它有一个32的计数器CYCCNT,这是一个向上计数的计数器,当它溢出时会自动清零并
[单片机]
STM32开发板的TIM3开启和关闭
关闭定时器中断要考虑好多情况 1)关闭定时器时,定时器是否在处在工作状态 2)关闭定时器时,定时器是否正好进入中断,造成关闭程序出现断层,进而无法实现完整关闭程序,此时可以使用高一级别的外部中断强制进入外部中断服务函数进行关闭程序 3)关闭定时器时,关闭定时器的程序是否在定时器服务函数里面?还是在总函数里面?还是在外部中断服务函数里面?是需要考量的? 4)关闭定时器时,定时器的中断触发时间是否太紧凑?定时器的中断总次数是否太小?都会影响关闭定时器程序运行的连续性。 以下为关闭程序: 首先打开时钟,然后才能进行关闭操作。 RCC- APB1ENR|=1 1; //TIM3时钟使能 TIM3- ARR=arr; //设定计数器自
[单片机]
判断STM32 GPIO输入口的输入状态(高电平或低电平)
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法
[单片机]
STM32 UART串口驱动程序
示例1.通过UART1进行数据发送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //UART1 选择对应UART的RCC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
如何配置stm32中断的优先级
写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置; 此文思路:“中断优先级”思维导图--》关键要点---》结合图和要点相关程序应用例程讲解; 我们先来看ST公司的一张图: 我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0》NVIC_PriorityGroup_1》NVIC_PriorityGroup_2》NVIC_PriorityGrou
[单片机]
如何配置<font color='red'>stm32</font>中断的优先级
STM32单片机中使用SPI通信的方法
  在本教程中,我们将使用 STM32F103C8 的 Blue Pill 板替换一个 Arduino 板,并将使用 SPI 总线与 Arduino 板进行通信。在这个STM32 SPI 示例中,我们将使用Arduino UNO作为 Slave,STM32F103C8 作为 Master,两个16X2 LCD 显示器分别连接在一起。两个电位器还与STM32(PA0)和Arduino(A0)相连,通过改变电位器来确定主机到从机和从机到主机的发送值(0到255)。   STM32F103C8中的SPI   比较 Arduino 和 STM32F103C8 Blue Pill 板中的 SPI 总线,STM32 有2 条 SPI 总线
[单片机]
在<font color='red'>STM32</font>单片机中使用SPI通信的方法
如何利用定时器产生PWM波
摘要:利用定时器产生PWM波。然后利用32的外部中断和定时器来测量32输出的波形硬件:STM32F103C8T6核心板、示波器、串口调试助手所用到的的引脚为PA8和PA0。 测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,同时关闭计数器。因为知道了计数器计数一个数的时间,所以在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,通过这个值就知道一个脉冲的时间周期。时间周期的倒数就是外部信号的频率。 一、利用TIM1的CH1产生PWM波 pwm.c #include pwm.h voidTIM1_PWM_Init
[单片机]
如何利用定时器产生PWM波
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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