STM32调试大法 之 串口通讯
开发过程经常需要查看某些特定参数。通常的方法可以使用paintf进行打印输出,观察具体的变量值。STM32内部集成有USART的串口功能,可以通过串口直接输出到电脑(上位机)。使用非常方便,基本不需要不需要写代码,只要配置一下就可以使用。
简单设置就可以看到上面的效果
配置方法:
1、重定向printf的输出函数 int fputc(int ch, FILE *f)
2、配置STM32F10x的USART串口
重定向方法 stdio.h 的输出内容
int fputc(int ch, FILE *f)
{
// 等待USART1 数据发送完成(发送区域空)
while (!(USART1->SR & USART_SR_TXE));
// 填充发送寄存器,数据 + 校验位 最多9位
USART1->DR = (ch & 0x1FF); return (ch);
}
启动STM32的 USART1 串口
1、使能 复用功能
2、使能 A引脚(USART1 在 PA9,PA10)
3、使能 USART1
4、设置 PA9(TX)复用推挽输出
5、设置 PA10(RX)输入浮空
6、 设置串口参数:波特率、数据位、校验、停止位、流控制
7、使能串口、使能输入、使能输出
OK
void serial_init(void)
{
//
// 设置串口调试
//
// 输 出: USART1
// 引 脚: PA9(TX), PA10(RX)
// 波特率: 9600
// 数据位: 8 bit (default) (CR1)
// 校 验: none (default) (CR1)
// 停止位: 1 bit (default) (CR2)
// 流控制: none (default) (CR3)
//
// 清除设置后上面配置为系统默认状态 int i;
/// 使能复用功能,使能GPIOA,使能USART1
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 关闭映射,确保USART使用 PA9,PA10
AFIO->MAPR &= ~AFIO_MAPR_USART1_REMAP; // 清除PA9,PA10状态
GPIOA->CRH &= ~( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 |
GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置PA9 发送 为复用推挽输出 2MHz
GPIOA->CRH |= GPIO_CR_AFOUT_PP2MHz & ( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 );
// 设置PA10接收 为复用上拉下拉模式
GPIOA->CRH |= GPIO_CR_AFIN_PULLDOWN & ( GPIO_CRH_CNF10 | GPIO_CRH_MODE10 ); // 设置波特率为 9600
// 计算方法
// 系统时钟 / (16分频 * 波特率)
// Baud = 72,000,000 / (16 * 9600) = 468.75
// 整数部分 << 4 + 取整(小数部分 * 16)
// 468 << 4 + 0.75 * 16
USART1->BRR = __USART_BRR(SystemCoreClock, ); // 清除寄存器状态
USART1->CR1 = USART_CR1_REST;
USART1->CR2 = USART_CR2_REST; // 停止位 1
USART1->CR3 = USART_CR3_REST; // 没用控制流 // 防止产生不必要的信息
for (i = ; i < 0x1000; i++) __NOP(); // USART1 使能, 使能输出,使能输入
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; }
整个过程中关键的输出定向主要用到了2个寄存器:
一个状态寄存器,检查发送是否为空(USART_ST_TXE)
一个数据寄存器,用于发送数据
int main(void)
{
uint8_t ud = 'a';
Delay_init();
// 初始化串口调试
serial_init(); // 使用寄存器直接 输出 a~z
while (ud <= 'z') {
while (!(USART1->SR & USART_SR_TXE));
USART1->DR = ud;
ud++;
} // 使用打印重定向输出字符串
printf("\ntest!\n");
printf("USART1 使能, 使能输出,使能输入\n"); ud = 'a';
while () {
Delay(); // 太快降低速度方便看结果(200ms延迟)
// 使用寄存器直接输出
while (!(USART1->SR & USART_SR_TXE));
USART1->DR = ud;
ud++; // 使用打印输出换行
if (ud > 'z') {
ud = 'a';
printf("\n");
}
}; }
具体的配置寄存器可以查看《参考手册》
完整代码
#define GPIO_CR_RESET (uint32_t)0x44444444
#define GPIO_CR_MODE_INPUT (uint32_t)0x00000000
#define GPIO_CR_MODE_2MHz (uint32_t)0x22222222
#define GPIO_CR_MODE_10MHz (uint32_t)0x11111111
#define GPIO_CR_MODE_50MHz (uint32_t)0x33333333 #define GPIO_CR_GP_PUSHPULL (uint32_t)0x00000000
#define GPIO_CR_GP_OPENDRAIN (uint32_t)0x44444444
#define GPIO_CR_OUT_PP2MHz (GPIO_CR_MODE_2MHz | GPIO_CR_GP_PUSHPULL)
#define GPIO_CR_OUT_PP50MHz (GPIO_CR_MODE_50MHz | GPIO_CR_GP_PUSHPULL) #define GPIO_CR_AFO_PUSHPULL (uint32_t)0x88888888
#define GPIO_CR_AFO_OPENDRAIN (uint32_t)0xcccccccc #define GPIO_CR_AFOUT_PP2MHz (GPIO_CR_MODE_2MHz | GPIO_CR_AFO_PUSHPULL) // 复用推挽输出,2MHz
#define GPIO_CR_AFIN_FLOAT (uint32_t)0x44444444 // 复用开漏输入
#define GPIO_CR_AFIN_PULLDOWN (uint32_t)0x88888888 // 复用上拉下拉输入 #define USART_CR1_REST (uint32_t)0x00000000
#define USART_CR2_REST (uint32_t)0x00000000
#define USART_CR3_REST (uint32_t)0x00000000
常量定义
/**
********************************************************************
*
* @file serial.c
* @author fpack
* @version v1.0
* @date 2014-9-1
* @brief 小穆妹纸串口调试
*
********************************************************************
**/ #include <stdio.h>
#include "armsis.h" /*----------------------------------------------------------------------------
Define Baudrate setting (BRR) for USART
*----------------------------------------------------------------------------*/
#define __DIV(__PCLK, __BAUD) ((__PCLK*25)/(4*__BAUD))
#define __DIVMANT(__PCLK, __BAUD) (__DIV(__PCLK, __BAUD)/100)
#define __DIVFRAQ(__PCLK, __BAUD) (((__DIV(__PCLK, __BAUD) - (__DIVMANT(__PCLK, __BAUD) * 100)) * 16 + 50) / 100)
#define __USART_BRR(__PCLK, __BAUD) ((__DIVMANT(__PCLK, __BAUD) << 4)|(__DIVFRAQ(__PCLK, __BAUD) & 0x0F)) //struct __FILE { int handle; /* Add whatever you need here */ };
//FILE __stdout;
//FILE __stdin; int fputc(int ch, FILE *f)
{
// 等待USART1 数据发送完成(发送区域空)
while (!(USART1->SR & USART_SR_TXE));
USART1->DR = (ch & 0x1FF); return (ch);
} void serial_init(void)
{
//
// 设置串口调试
//
// 输 出: USART1
// 引 脚: PA9(TX), PA10(RX)
// 波特率: 9600
// 数据位: 8 bit (default) (CR1)
// 校 验: none (default) (CR1)
// 停止位: 1 bit (default) (CR2)
// 流控制: none (default) (CR3)
//
// 清除设置后上面配置为系统默认状态 int i;
/// 使能复用功能,使能GPIOA,使能USART1
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// 关闭映射,确保USART使用 PA9,PA10
AFIO->MAPR &= ~AFIO_MAPR_USART1_REMAP; // 清除PA9,PA10状态
GPIOA->CRH &= ~( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 |
GPIO_CRH_CNF10 | GPIO_CRH_MODE10 );
// 设置PA9 发送 为复用推挽输出 2MHz
GPIOA->CRH |= GPIO_CR_AFOUT_PP2MHz & ( GPIO_CRH_CNF9 | GPIO_CRH_MODE9 );
// 设置PA10接收 为复用上拉下拉模式
GPIOA->CRH |= GPIO_CR_AFIN_PULLDOWN & ( GPIO_CRH_CNF10 | GPIO_CRH_MODE10 ); // 设置波特率为 9600
// 计算方法
// 系统时钟 / (16分频 * 波特率)
// Baud = 72,000,000 / (16 * 9600) = 468.75
// 整数部分 << 4 + 取整(小数部分 * 16)
// 468 << 4 + 0.75 * 16
USART1->BRR = __USART_BRR(SystemCoreClock, ); // 清除寄存器状态
USART1->CR1 = USART_CR1_REST;
USART1->CR2 = USART_CR2_REST; // 停止位 1
USART1->CR3 = USART_CR3_REST; // 没用控制流 // 防止产生不必要的信息
for (i = ; i < 0x1000; i++) __NOP(); // USART1 使能, 使能输出,使能输入
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; }
整理后的串口配置代码 Serial.c
/**
********************************************************************
*
* @file serial.h
* @author fpack
* @version v1.0
* @date 2014-9-1
* @brief 小穆妹纸串口调试
*
********************************************************************
**/ #ifndef __SERIAL_H__
#define __SERIAL_H__ #ifdef __cplusplus
extern "C" {
#endif void serial_init(void); #ifdef __cplusplus
}
#endif #endif
串口调试头 Serial.h
STM32调试大法 之 串口通讯的更多相关文章
- STM32 + RT Thread OS 串口通讯
1. 创建项目 a) 禁用Finsh和console b) 默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...
- STM32与PC机串口通讯
有时要将板子的信息输出到电脑上来调试之类的,或者把传感器收集到的数据显示到电脑. 当然了,这只是最基本的串口通信,简单的说,是有一根USB线连着的. mbed上并没有能显示printf的功能.需要自己 ...
- STM32—串口通讯详解
串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...
- stm32串口通讯问题
stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...
- STM32F10x 学习笔记5(USART实现串口通讯 1)
STM32F10x 系列单片机中都包含了USART 模块,所谓USART,就是通用同步异步收发器.通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间 ...
- STM32菜鸟成长记录---RS485通讯协议的应用
写作原因:近来蛋闲?非也 ! 昨天一同事合作的项目代码出现的bug-----他的上位机每200ms给我发送命令向我这边下位机读取一些数据,在此过程会按下按键做一些另外操作并给他返回数据:(通信是通 ...
- 第20章 USART—串口通讯
本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...
- USART—串口通讯
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号, 所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码 . 串口通讯的一个数据包从起始信号开始,直到停止信号结束.数据 ...
- 第20章 USART—串口通讯—零死角玩转STM32-F429系列
第20章 USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
随机推荐
- MS SQL SERVER 中的系统表
MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行. 2 syscomments 包含每 ...
- 如何使用 SQL Developer 导出数据
完成此方法文档后,您应该能够了解: 如何使用 SQL Developer 将数据导出为各种文件格式 如何导出模式中的对象定义 目录 1. 简介 2. 软件要求 3. 导出数据 4. 导出对象定义 5. ...
- Table of Contents - 设计模式
设计原则 OCP - 开闭原则 SRP - 单一职责原则 DIP - 依赖倒置原则 ISP - 接口隔离原则 LSP - 里氏替换原则 LoD - 迪米特法则 创建型模式 工厂方法模式 抽象工厂模式 ...
- 根据不同的浏览器对不同元素进行css调整
<!if firefox> .element { top:4px; } <![endif]> <!if chrome> .element { top:6px; } ...
- DWZ(JUI) 教程 左侧栏默认是关闭状态的问题
DWZ(JUI) 教程 左侧栏默认是关闭状态的问题,初始化是全屏状态,只需简单处理就可以了 $(function(){ DWZ.init("dwz.frag.xml", { log ...
- list转换成DataTable
list转换成DataTable类如下: public static DataTable ToDataTable<T>(this IList<T> datas) { DataT ...
- JavaScript之六种排序法
1.冒泡排序循环的最大值从length递减每次循环只能排好最后一个,然后递减到第一个 function bubbleSort(){ var changedData = new Array(); var ...
- Zend studio 12.5.1破解过程
开始学习php了 今天又安装了一下Zend 之前找了很久的教程终于成了 , 今天换了一台电脑需要重新安装一下 又点忘记了. 就讲这个过程写下来 1.安装zend studio 12.5.1.这个过程 ...
- 服务器无法播放flv格式的视频解决办法
浏览某个网站时播放视频可能会出现下面的情况: 其实原因很简单,因为国内大多都是Win2003的主机 .默认是没有指定输出FLV这种格式的. 虽然FTP里面可以看见,但无法通过http访问,也就无法播放 ...
- 20150309--gridview
GridView: 使用代码套用模板,变为DataList的样式,添加<asp:TemplateField>标签,(注意必须加上<Columns>) <asp:GridV ...