STM32 UART串口驱动程序

发布者:温暖的拥抱最新更新时间:2019-01-29 来源: eefocus关键字: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_GPIOA, ENABLE);  //选择串口对应引脚的RCC时钟

  //UART1_TX   GPIOA_Pin_9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOC_Pin_9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //

  GPIO_Init(GPIOA, &GPIO_InitStructure);        //

  //UART1_RX    GPIOA_Pin_10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //GPIOA_Pin_10

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //UART1通讯参数配置

  USART_InitStructure.USART_BaudRate = 115200;            //通讯波特率

  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_Tx | USART_Mode_Rx;                  //

  USART_Init(USART1, &USART_InitStructure);

  USART_Cmd(USART1, ENABLE);

}



将数据0xBA通过UART1发送出


USART_SendData(USART1,0xBA); //Send Data 0xBA



----------

示例2.通过对UART1进行接收中断配置,收到外部数据后进入中断读取数据 

UART 1 的初始化 开启接收中断



/**


@brief UART1 Initialise.


@param None.


@retval None.


@brief Data transfer PC

*/

void UART1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //UART1

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //


//UART1_TX GPIOA_Pin_9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOC_Pin_9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //

GPIO_Init(GPIOA, &GPIO_InitStructure); //


//UART1_RX GPIOA_Pin_10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //GPIOA_Pin_10

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);


//UART1通讯参数配置

USART_InitStructure.USART_BaudRate = 115200; //通讯波特率

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_Tx | USART_Mode_Rx; //

USART_Init(USART1, &USART_InitStructure);


//Uart1 NVIC 中断配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //数据接收中断使能

NVIC_Init(&NVIC_InitStructure);


USART_Cmd(USART1, ENABLE);

}


中断入口函数,变量rxdat用于存放接收到的1个字节数据


void USART1_IRQHandler(void)

{

  unsigned char  rxdat ;

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

  {

    USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Clear flag

    rxdat = USART_ReceiveData(USART1);

  }

}


关键字:STM32  UART  串口驱动 引用地址:STM32 UART串口驱动程序

上一篇:关于STM32正交编码器边沿的理解
下一篇:STM32L151C8T6的串口配置

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

工程师应该掌握的STM32单片机关键基础精华
从51开始,单片机玩了很长时间了,有51,PIC,AVR等等,早就想跟潮流玩玩ARM,但一直没有开始,原因-----不知道玩了ARM可以做什么(对我自己而言)。如果为学习而学习,肯定学不好。然后cortex-m3出来了,据说,这东西可以替代单片机,于是马上开始关注。也在第一时间开始学习,可惜一开始就有点站错了队,选错了型(仍是对我自己而言)。我希望这种芯片应该是满大街都是,随便哪里都可以买得到,但我选的第一种显然做不到。为此,大概浪费了一年多时间吧,现在,回到对我来说是正确的道路上来啦,边学边写点东西。      这里写的是我的学习的过程,显然,很多时候会是不全面的,不系统的,感悟式的,甚至有时会是错误的,有些做法会是不专业的
[模拟电子]
工程师应该掌握的<font color='red'>STM32</font>单片机关键基础精华
STM32硬件IIC
1 /** 2 * @brief 写一个字节到I2C设备中 3 * @param 4 * @arg pBuffer:缓冲区指针 5 * @arg WriteAddr:写地址 6 * @retval 正常返回1,异常返回0 7 */ 8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr) 9 { 10 /* Send STRAT condition */ 11 I2C_GenerateSTART(macI2Cx, ENABLE); 12 13 I2CTimeout = I2CT_FLAG_TIMEOUT; 14 15 16 /*
[单片机]
适合嵌入式stm32的五大操作系统解析
  基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。   1、μClinux   μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧
[单片机]
STM32正交编码器接口
一、主要内容 芯片型号、使用引脚及初始化程序源码 TIM2端口重映射问题 与JTAG接口冲突时的现象及解决方法 二、芯片型号、使用引脚及初始化程序源码 芯片型号:STM32F103RET6 使用定时器:TIM2、TIM3、TIM4、TIM5 使用引脚:      TIM2—PA15、PB3(remap)      TIM3—PA6、PA7      TIM4—PB6、PB7      TIM5—PA0、PA1 初始化程序源码: (其中TIM2的配置有特殊需要注意的地方,其他配置相同,调试时遇到的问题和解决方法见下文) #include stm32f10x.h #include encoder.h void TI
[单片机]
STM32 I2C硬件的结构
引子 STM32的硬件I2C很多人都对它望而却步。因为很多电工都说,STM32 硬件 I2C有BUG、不稳定、死机等等……最后都使用GPIO模拟I2C。 的确,模拟I2C好用。但是在我看来在一个72M的Cortex-M3的MCU上这样做非常不妥。一般来说I2C是一种慢速总线,就算工作在400kHz的快速模式上,I2C传送每个字节仍需要至少23us——还没有计算地址、起始信号和结束信号的发送。如果使用GPIO模拟的I2C,这23us的CPU时间都在空转中浪费了,而这23us已经可以做不少的事情了,所以在STM32上I2C还是使用硬件为佳——虽然它多多少少有点缺陷。 这篇文章不是给完全没有接触过STM32 硬件I2C的新手看的
[单片机]
<font color='red'>STM32</font> I2C硬件的结构
STM32开发笔记67: 在keil中使用ST-Link不能成功下载的解决方法
单片机型号:STM32F091RCT6 在Keil中使用ST-Link对STM32F091RCT6单片机下载程序,第1次可下载成功,第2次就不可以成功下载,如下图所示,找不到单片机。 但是使用STVP进行程序下载是没有问题的,这就说明硬件线路板没有问题,问题出现在Keil中。 经反复测试,发现只需将connect连接方式更改为under Reset就可以正确解决,如下图所示。
[单片机]
<font color='red'>STM32</font>开发笔记67: 在keil中使用ST-Link不能成功下载的解决方法
简要描述下STM32 定时器对正交编码器进行计数控制的方法
如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。 下面是我调试OK的代码: void Encoder_Configration(void) { GPIO_InitTypeDef GPIO_Ini
[单片机]
简要描述下<font color='red'>STM32</font> 定时器对正交编码器进行计数控制的方法
STM32单片机对TFTLCD的驱动设计
看了TFTLCD和FSMC(灵活的静态存储控制器)的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D[15: 0]: 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: intmain(void) { u8x=0; u8lcd_id[12];//存放LCDID字符串
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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