STM32笔记之八:来跟PC打个招呼,基本串口通讯

发布者:HarmonySpirit最新更新时间:2015-09-14 来源: eefocus关键字:STM32  串口通讯 手机看文章 扫描二维码
随时随地手机看文章
a)        目的:在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。

b)        初始化函数定义:

void USART_Configuration(void);        //定义串口初始化函数

c)        初始化函数调用:

void UART_Configuration(void);        //串口初始化函数调用

初始化代码:

void USART_Configuration(void)                        //串口初始化函数

{

//串口参数初始化  

  USART_InitTypeDef USART_InitStructure;              //串口设置恢复默认参数

//初始化参数设置

  USART_InitStructure.USART_BaudRate 9600;                                     //波特率9600

   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_Rx USART_Mode_Tx;//打开Rx接收和Tx发送功能

    USART_Init(USART1, &USART_InitStructure);                                         //初始化

  USART_Cmd(USART1, ENABLE);                                                          //启动串口

}

RCC中打开相应串口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ENABLE);

GPIO里面设定相应串口管脚模式

//串口1的管脚初始化  

  GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;                        //管脚9

    GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;       //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);                               //TX初始化

  GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;                    //管脚10

    GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; //浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);                             //RX初始化

d)        简单应用:

发送一位字符

USART_SendData(USART1, 数据);                //发送一位数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}                                                                                        //等待发送完毕

接收一位字符

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}                                                                                        //等待接收完毕

变量= (USART_ReceiveData(USART1));        //接受一个字节

发送一个字符串

    先定义字符串:char rx_data[250];

      然后在需要发送的地方添加如下代码

  int i;                                                                     //定义循环变量

    while(rx_data!='')                                           //循环逐字输出,到结束字''

    {USART_SendData(USART1, rx_data);            //发送字符

     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待字符发送完毕

     i++;} [page]

e)        USART注意事项:

发动和接受都需要配合标志等待。

只能对一个字节操作,对字符串等大量数据操作需要写函数

使用串口所需设置:RCC初始化里面打开RCC_APB2PeriphClockCmd

(RCC_APB2Periph_USARTx);GPIO里面管脚设定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP); 

f)        printf函数重定义(不必理解,调试通过以备后用)

(1)        需要c标准函数:

#include "stdio.h"

(2)        粘贴函数定义代码

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  //定义为putchar应用

(3)        RCC中打开相应串口

(4)        GPIO里面设定相应串口管脚模式

(6)        增加为putchar函数。

int putchar(int c)                                              //putchar函数

{

  if (c == ' '){putchar(' ');}                                //将printf的 变成

  USART_SendData(USART1, c);                                    //发送字符

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

  return c;                                                     //返回值

}

(8)        通过,试验成功。printf使用变量输出:%c字符,%d整数,%f浮点数,%s字符串,/n或/r为换行。注意:只能用于main.c中。

3、        NVIC串口中断的应用

a)        目的:利用前面调通的硬件基础,和几个函数的代码,进行串口的中断输入练习。因为在实际应用中,不使用中断进行的输入是效率非常低的,这种用法很少见,大部分串口的输入都离不开中断。

b)        初始化函数定义及函数调用:不用添加和调用初始化函数,在指定调试地址的时候已经调用过,在那个NVIC_Configuration里面添加相应开中断代码就行了。

c)        过程:

i.        在串口初始化中USART_Cmd之前加入中断设置:

USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个。

ii.        RCC、GPIO里面打开串口相应的基本时钟、管脚设置

iii.        NVIC里面加入串口中断打开代码:

NVIC_InitTypeDef NVIC_InitStructure;//中断默认参数

NVIC_InitStructure.NVIC_IRQChannel USART1_IRQChannel;//通道设置为串口1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;   //中断占先等级0

NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;              //中断响应优先级0

NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;             //打开中断

NVIC_Init(&NVIC_InitStructure);                                                //初始化

iv.        在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。

void USART1_IRQHandler(void)                              //串口1中断

{

char RX_dat;                                                          //定义字符变量

   

  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //判断发生接收中断

  {USART_ClearITPendingBit(USART1,  USART_IT_RXNE);          //清除中断标志

  

   GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01);             //开始传输

   RX_dat=USART_ReceiveData(USART1) 0x7F;                       //接收数据,整理除去前两位

   USART_SendData(USART1, RX_dat);                                       //发送数据

   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//等待发送结束

  }

}

d)        中断注意事项:

可以随时在程序中使用USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来关闭中断响应。

NVIC_InitTypeDef NVIC_InitStructure定义一定要加在NVIC初始化模块的第一句。

全局变量与函数的定义:在任意.c文件中定义的变量或函数,在其它.c文件中使用extern+定义代码再次定义就可以直接调用了。
关键字:STM32  串口通讯 引用地址:STM32笔记之八:来跟PC打个招呼,基本串口通讯

上一篇:STM32笔记之七:让它跑起来,基本硬件功能的建立
下一篇:STM32笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用

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

浅析基于STM32的除以0运算话题
有人使用STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除法运行结果【也就是商】直接等于当前变量类型所支持的最大值,比如,若被除数为16位变量,则经过该除以零操作后直接为其赋值为0xffff。【实际应用中客户的需求往往也是五彩斑斓的。^_^】 事实上是否可以如该STM32用户所愿呢?我们不妨一起看看。 首先,这个问题不属于STM32外设相关的,而是内核相关的。客户选用的是Cortex M4的内核STM32芯片,那我们就从M4内核手册中寻找相关内容。 我们通过查看ARM M4的内核手册,可以看
[单片机]
浅析基于<font color='red'>STM32</font>的除以0运算话题
STM32 SPI Flash DFU
这次讲的是将程序、图片或其他文件下载到SPI Flash中。我使用的是W25X16的SPI Flash,他共有2MB空间,2个Block,512ge Sector,8096个Page。由于SPI Flash不能直接跑程序,我们从接口就知道了。 接下去我们就来讲讲怎么编写SPI flash的升级功能。这次的工程是基于之前的Internal Flash修改而来的。修改的部分主要在USB_User组里: 我只将改改的部分。 hw_config.c、usb_istr.c、usb_prop.c、usb_pwr.c这介个文件没有什么还修改的。usb_desc.c文件需要修改下接口字符串描述符,由于我们的SPI Flash空间2M,所以我们将
[单片机]
<font color='red'>STM32</font> SPI Flash DFU
【话说定时器系列】之七:STM32定时器比较输出话题
我们知道,STM32定时器除了基本计数定时功能外,还对外拓展了输入、输出通道,从而可以实现输入捕捉、比较输出功能。 比较输出【Compare Output】功能: 定时器通过对预设的 比较值 与 计数器的值 做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲输出、强制输出等。一般来讲,STM32的通用定时器和高级定时器都具有比较捕获功能,不同的定时器可能通道数量上有差异。 或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。这个不难理解,因为比较输出的基本特征是计数器CNT的值与比较寄存器CCR的值做比较,计数器数据变化意味着时间的流逝, 当计数器记到跟比较值相等或相匹配时 ,也就
[单片机]
JFlash ARM对stm32程序的读取和烧录
本篇文章主要是记录一下JFlash ARM 的相关使用和操作步骤,读取程序说不上破解,这只是在没有任何加密情况下对Flash的读写罢了! 在我们装了JLINK驱动后再根目录下找到JFlash ARM ,运行。 读取Flash程序: 第一步:Option-- Project Settings-- CPU下选择 Device 在下拉菜单中找到自己的芯片型号后点击确定。 第二步:Targect-- Connect链接JLINK ;Targect-- Read back-- Entrie chip读取整个Flash区域, 接下来就等待读取完成了。 第三部:File-- Save file as 选择要储存的文件类型如:HE
[单片机]
JFlash ARM对<font color='red'>stm32</font>程序的读取和烧录
STM32中断函数名
和普通的ARm裸板开发不同。使用stm32库函数编程时,中断函数名是固定死的。 具体函数名可以在启动文件startup_stm32fxxx_xd.s的Vector Table Mapped(中断函数向量表)中查看。 启动文件 startup_stm32fxxx_xd.s里面都是汇编代码 ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size __V
[单片机]
STM32学习:ADC/DMA/USART
  学习STM32的ADC转换,在开发板上写程序调试。   四个任务:   1.AD以中断方式(单次)采集一路   2.AD以中断方式连续采集四路   3.AD以DMA方式采集一路,DMA深度为一级   4.AD以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。   总结:   第一个任务:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),   ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。   ADC_ContinuousCo
[单片机]
STM32中断系统(NVIC和EXTI)
EXTI EXTI (External interrupt) 就是指外部中断,通过 GPIO 检测输入脉冲,引起中断事件,打断原来的代码执行流程,进入到中断服务函数中进行处理,处理完后,再返回到中断之前的代码中执行。 STM32 的所有 GPIO 都可以用作外部中断源的输入端,利用这个特性,我们可以把按键轮询检测 改为由中断 来处理,大大提高软件执行的效率。 Cortex 内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,编号为 0~15 的称为内核异常,而 16 以上的则称为外部中断(外,相对内核而言),这个表就称为中断向量
[单片机]
<font color='red'>STM32</font>中断系统(NVIC和EXTI)
STM32串口通信过程详解
按照数据传送方向分类: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口; 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 分别如下图中的a、b、c所示: 按照通信方式分类: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口; 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线; 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数
[单片机]
<font color='red'>STM32</font>串口通信过程详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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