STM32 UART(接收 ,发送数据)

发布者:鑫森淼焱最新更新时间:2017-09-16 来源: eefocus关键字:STM32  UART  发送数据 手机看文章 扫描二维码
随时随地手机看文章

UART接收发送数据:

平台:STM32F401 discovery版

此代码用的UART6,TX,RX对应的PIN脚是PC6,PC7

如图:


代码如下:

步骤一:初始化串口的GPIO,USART,并且配置上UART的RX中断


  1. void USART6_Config(void)  

  2. {  

  3.    USART_InitTypeDef USART_InitStructure;  

  4.    NVIC_InitTypeDef NVIC_InitStructure;  

  5.   GPIO_InitTypeDef GPIO_InitStructure;  

  6.     

  7.     /* Enable GPIO clock */  

  8.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC , ENABLE);  

  9.     

  10.   /* Enable USART clock */  

  11.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);  

  12.     

  13.   /* Connect USART pins to  */  

  14.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);  

  15.   GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);  

  16.     

  17.   /* Configure USART Tx and Rx as alternate function push-pull */  

  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  

  19.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; //GPIO_Speed_100MHz;  

  20.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  

  21.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  

  22.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  

  23.   GPIO_Init(GPIOC, &GPIO_InitStructure);  

  24.     

  25.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  

  26.   GPIO_Init(GPIOC, &GPIO_InitStructure);  

  27.     

  28.   /* USARTx configuration ----------------------------------------------------*/   

  29.   USART_InitStructure.USART_BaudRate = 115200 ; //5250000;  

  30.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

  31.   USART_InitStructure.USART_StopBits = USART_StopBits_1;  

  32.   USART_InitStructure.USART_Parity = USART_Parity_No;  

  33.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

  34.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

  35.   USART_Init(USART6, &USART_InitStructure);  

  36.     

  37.   /* Enable the USARTx Interrupt */  

  38.   NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;  

  39.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

  40.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

  41.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

  42.   NVIC_Init(&NVIC_InitStructure);  

  43.     

  44.   USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);  

  45.   USART_Cmd(USART6, ENABLE);  

  46. }  

步骤二:测试一下TX,即用printf,但是printf内部是调用fputs,所以需要重定向一下


  1. int fputc(int ch, FILE *f)  

  2. {  

  3.   USART_SendData(USART6, (unsigned char) ch);  

  4.   while (!(USART6->SR & USART_FLAG_TXE));  

  5.   return (ch);  

  6.       

  7. }  

  8.   

  9.   

  10. int fgetc(FILE *f)  

  11. {  

  12.   while (USART_GetFlagStatus(USART6, USART_FLAG_RXNE) == RESET);  

  13.   

  14.   return (int)USART_ReceiveData(USART6);  

  15. }  

步骤三:编写RX中断函数



[cpp] view plain copy

  1. void USART6_IRQHandler(void)  

  2. {  

  3.   uint8_t ch;  

  4.   if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)  

  5.   {       

  6.       ch = USART_ReceiveData(USART6);  

  7.       printf( "%c\n", ch );   

  8.     }   

  9. }  

注意地方:使用的IAR,冲定向的时候出现FILE类型找不到,可是在C原因中#include ,但是为什么还是报错呢?


追代码发现:

#if _DLIB_FILE_DESCRIPTOR
  typedef _Filet FILE;
#endif /* _DLIB_FILE_DESCRIPTOR */

_DLIB_FILE_DESCRIPTOR宏是0,但是IAR又不让修改,所以肯定是哪里的lib没有配置,于是找到如图就搞定了



附一张板子图:


用标准的杜邦线连接


整个工程如连接:

http://download.csdn.net/detail/xiaoxiaopengbo/9425422


关键字:STM32  UART  发送数据 引用地址:STM32 UART(接收 ,发送数据)

上一篇:STM32 BUTTON方式(polling & interrupt)
下一篇:STM32 DMA->内存到内存

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

STM32_CorTex-M3位带操作的理解
STM32支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第二个则是片内外设 区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区 把每个比特膨胀成一个32 位的字。 每个比特膨胀成一个32 位的字,就是把 1M 扩展为 32M , 于是;RAM地址 0X200000000(一个字节)扩展到8个32 位的字,它们是:(STM32中的SRAM依然是8位的,所以RAM中任一地址对应一个字节内容) 0X220000000 ,0X220000004,0X220000008,0X22000000C,0X2200
[单片机]
STM32_CorTex-M3位带操作的理解
深入解析STM32_USB-FS-Device_Lib库V0.2
图1 展示了一个典型的USB应用与USB-FS-Device library的关系图。我们可以看出图中由3个层构成分别是:外围硬件(hardware)、STM32_USB-FS_Device_Lib和用户层(User application)。我们从下到上来分析: 图1 典型的USB应用与USB-FS-Device library的关系图 1.外围硬件(hardware) 就是我们的购买的芯片STM32F10XXX和开发板 2 STM32_USB-FS_Device_Lib 就是STM提供给我们的The USB-FS-Device library固件库,它由STM32_USB FS_Device_ Driver和A
[单片机]
深入解析STM32_USB-FS-Device_Lib库V0.2
STM32的USART使用DMA--操作
使用STM32的DMA来处理USART3的RX的多数据 注意:DMA的中断产生条件中,TC=transfer complete interrupt产生,需要DMA的buffer满才会产生。 只有当DMA内存中的数据个数达到20个时候才能产生中断。定义如下。DMA_InitStructure.DMA_BufferSize = 20;//sizeof(Ch3DMABuffer); static usart3_dma_config(void) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClo
[单片机]
STM32启动模式及IAP
我们玩ARM9,一般都是在内存里调试程序,速度飞快。STM32下也可以这样,虽说现在的flash寿命已经很长了,但flash中调试烧录程序还是一个很慢的过程,有时候程序上一个小小的改动要花上几倍的时间下载代码,这确实是不能忍受的。   我们也可以在开发STM32时,在内存中调试程序。   { STM32这颗Cortex-M3控制器,与其他许多ARM一样,提供了BOOT0和BOOT1两个管脚用于启动选择。 BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。(用于串口ISP) BOOT1=1 BOOT0=1 从内置SRAM启动,这种
[单片机]
<font color='red'>STM32</font>启动模式及IAP
STM32系统时钟配置查询
有时候我们需要知道自己单片机平台使用的主频是多少,因为很多外设都要根据主频去分配自己的时钟系统。 RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); 系统调试信息: 根据此调试信息,我们可以清楚看到系统分配的时钟频率。
[单片机]
STM32处理器输入捕获分析
前言: 1.博文基于ARM Cortex-M3内核的STM32F103ZET6芯片和标准3.5.0库; 2.如有不足之处,还请多多指教; ** 一 基本知识 ** 输入捕获的功能:用来测量脉宽或者测量信号频率; 输了TIM6和TIM7外,其他定时器都有输入捕获功能; 通用定时器输入捕获中断和定时器更新中断公用同一个中断函数; 二 侧脉宽工作原理 如何获取一个脉冲的宽度(比如高电平): 开启并设置好定时器的时钟源 ,频率为F; 输入需要检测的脉冲; 利用CNT计数器计算一个脉冲的上升沿和下降沿之间的脉宽 三 相关寄存器 TIMx_ARR,TIMx_PSC,TIMx_CCMRx,TIMx_CCERx,TIMx_DIER,T
[单片机]
<font color='red'>STM32</font>处理器输入捕获分析
STM32】FSMC 应用
【时间计算】 由公式:DATAST HCLK = tWRLW , DATAST= 15/13.8 ns = 1.08 ,取 1 。 再由公式((ADDSET + 1) + (DATAST + 1)) HCLK = max(tCYC, tCYC(READ)) ,即((ADDSET + 1) + (DATAST + 1)) HCLK = 66 ,算出 ADDSET = 66/13.8 - 3 = 1.7,这取 2 。 最后 得出 Address setup time: 0x1 Address hold time: 0x0 Data setup time: 0x2 。不知道这个设置是否有问题。
[单片机]
单片机软件UART的设计思想
目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个单片机主动和多个设备通信,实时性差;③、用软件模拟的方法扩展串口,其优势也是成本低、实时性好, 但要占用一些CPU时间。 一般的软件模拟扩展串口方法,使用1个I/O端口、1个INT外部中断和定时器,该方法扩展的串口有2个缺点,①、由于使用了INT外部中断,故只能使用2个INT外部中断扩展2个串口。②
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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