在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的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!='0') //循环逐字输出,到结束字'0'

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

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

i++;}

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 == 'n'){putchar('r');} //将printf的n变成r

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笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用

a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。

b) 初始化函数定义:

void EXTI_Configuration(void); //定义IO中断初始化函数

c) 初始化函数调用:

EXTI_Configuration();//IO中断初始化函数调用简单应用:

d) 初始化函数:

void EXTI_Configuration(void)

{ EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义

EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚选择

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式

EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择

EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断

EXTI_Init(&EXTI_InitStructure);//初始化

}

e) RCC初始化函数中开启I/O时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

GPIO初始化函数中定义输入I/O管脚。

//IO输入,GPIOA的4脚输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

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

f) 在NVIC的初始化函数里面增加以下代码打开相关中断:

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动

NVIC_Init(&NVIC_InitStructure); //初始化

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

if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判断中断发生来源

{ EXTI_ClearITPendingBit(EXTI_Line3); //清除中断标志

USART_SendData(USART1, 0x41); //发送字符“a”

GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED发生明暗交替

}

h) 中断注意事项:

中断发生后必须清除中断位,否则会出现死循环不断发生这个中断。然后需要对中断类型进行判断再执行代码。

使用EXTI的I/O中断,在完成RCC与GPIO硬件设置之后需要做三件事:初始化EXTI、NVIC开中断、编写中断执行代码。

Linux-C语言学习交流群【721709245】在学的进群一起交流,资料自己群文件下载

相关资料:

stm32 USART串口应用

PWM脉宽调制技术

基于STM32讲解串口操作

通过Z-stack协议栈实现串口透传

stm32直流电机驱动

10 vm 添加串口_STM32的串口通信相关推荐

  1. 计算机串口连接原理,串口通信的原理及USB转串口通信

    串口通信的原理 串口通信(SerialCommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  2. 单片机 串口编程之串口通信仿真实验

    单片机 串口编程之串口通信仿真实验 一.简述        记--简单的使能串口,串口收发数据的例子.(使用Proteus仿真+虚拟串口调试)        代码,仿真文件打包:链接: https:/ ...

  3. imx6 配置串口波特率_stm32异步串口(uart)通讯基本操作

    | 串口是一种全双工通讯方式 单工 数据传输只支持数据在一个方向上传输 半双工 允许数据在两个方向上传输,在同一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信 全双工 允许数据同时 ...

  4. cubemx stm32 陶晶驰 串口屏 基于YXY通信原理的串口屏驱动代码

    陶晶驰串口屏 资料 陶晶驰串口屏是本质是一个MCU,屏幕是MCU的模块,一般是一块TFT屏幕.在串口屏厂商提供的软件上面编写界面,然后通过串口直接烧到串口屏的MCU上,然后在屏幕上展示出来. 串口屏资 ...

  5. STM32开发,串口和PC机通信(串口中断、FIFO机制),安富莱+正点原子程序合并

    STM32开发,串口和PC机通信(串口中断.FIFO机制),安富莱+正点原子程序合并 1 概述 1.1 资源概述 1.2 实现功能 2 软件实现 2.1实现步骤 2.2 main()函数代码 2.3 ...

  6. android usb通讯波特率,USB串口的特殊波特率通信

    USB串口的特殊波特率通信是指波特率为非标准数值的任意波特率.由于这些波特率是非标的,所以从硬件到软件都有特殊要求和方法才可以实现.本文以最新2015款的波仕USB232ET转换器为例从硬件和软件两方 ...

  7. 利用python程序、虚拟串口软件、串口通信助手,实现串口通信(两串口互相收发文字)

    一.流程简述 程序可以参考: https://blog.csdn.net/colcloud/article/details/42454839 这是我参考后简化的版本: https://github.c ...

  8. 【题目】一个信道的比特速率为4Mbps,信号的传播延迟为20ms,数据帧的大小为10^4比特,采用滑动串口协议,不考虑帧的生成时间,支持捎带应答,那么帧序号应为多少bit?

    [题目]一个信道的比特速率为4Mbps,信号的传播延迟为20ms,数据帧的大小为10^4比特,采用滑动串口协议,不考虑帧的生成时间,支持捎带应答,那么帧序号应为多少bit? [答案] 以上答案为本人考 ...

  9. 51单片机进阶案例(1)——基于MATLAB GUI的单片机串口与PC的通信实现实时时钟和双向可调时钟功能(利用DS1302时钟芯片和LCD1602液晶屏)

    目录 一.案例描述 二.实现功能 三.51单片机部分实现 3.1 实时时钟的实现 3.2 串口通信的实现 3.2.1 接收数据 3.2.2 发送数据 四.MATLAB部分实现 4.1 GUI界面 4. ...

最新文章

  1. mysql中列的增删_mysql中怎么增删一列
  2. java matchcollection_Java集合之collection
  3. 3.放弃CHAR吧,在铸成大错之前!
  4. Go报错:more than one character in rune literal
  5. 大批工厂提前20天放假,而大家却都在玩金融
  6. 【算法1-2】排序(今天刷洛谷了嘛)
  7. [BZOJ] 3301: [USACO2011 Feb] Cow Line
  8. [原创]全球首款不使用ViewState的Asp.Net2.0控件库
  9. WCF编程]WCF使用Net.tcp绑定时候出现错误:元数据包含无法解析的引用
  10. Hibernate 与 Mybatis 如何共存?打破你的认知!
  11. c++ websocket客户端_ESP32 Arduino教程:Websocket客户端
  12. Chirp信号基础知识及matlab实现
  13. 软件观念革命:交互设计精髓_交互的学习与应用指南
  14. 软件开发,网站建设,性价比高的PLC仿真软件。
  15. 企业级用户画像: 价格敏感度模型-PSM
  16. Eclipse代码/目录虚线对齐设置
  17. CSS3硬件加速 - GPU加速
  18. COSCon'20 Apache Roadshow- China 精彩收官!|城市回顾篇
  19. vue实现导出表格数据
  20. C# 图形处理-缩略图,图片合并,图片写文字,图片调整

热门文章

  1. Nagios配置文件上传
  2. T4文本模板转换过程
  3. 奇妙的Base64编码
  4. IDEA 引入传统 j2ee spring mvc
  5. Linux下svn搭建配置流程
  6. 最常用的javascript自定义函数大搜集
  7. LINQ体验系列文章导航
  8. 山西DOT NET俱乐部
  9. 户籍改革更进一步!我国将推动户籍准入年限同城化累计互认
  10. ARM 嵌入式入门经验