文章目录
- 1 前言
- 2 串口打印库函数版本
- 3 串口打印寄存器版本
- 3.1 配置时钟
- 3.2 配置GPIO功能
- 3.3 配置CR2寄存器
- 3.4 配置CR1寄存器
- 3.5 配置CR3寄存器
1 前言
我们在调试的过程中,都比较喜欢直观的数据,这时候我们可以使用芯片的串口功能,把数据打印到电脑上,这样就可以清晰的看到数据的变化。
2 串口打印库函数版本
下面呢,就到串口打印的程序啦。
首先,先分享一下库函数版本的代码。
main.c文件。
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"int main(void)
{RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHzDelay_Init();Usart_Init(115200);printf("hello world!\r\n");while(1){GPIOC->BSRR = (uint32_t)0x00002000;//PC13引脚输出高电平Delay_ms(1800); //延时1800msGPIOC->BRR = (uint16_t)0x2000; //PC13引脚输出低电平Delay_ms(1800); //延时1800ms}
}
usart.c文件。
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"int fputc(int ch,FILE *f)
{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成return ch;
}void Usart_Init(uint32_t bound)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//打开USART1和GPIOA的时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA10引脚USART_InitStructure.USART_BaudRate = bound; //串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送接收模式USART_Init(USART1,&USART_InitStructure); //初始化USART1USART_Cmd(USART1,ENABLE); //使能USART1
}
usart.h文件。
#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"void Usart_Init(uint32_t bound);#endif
当我们把需要的代码写好并编译通过后,可以把程序烧录到单片机中。
注意:这里是使用小马哥的下载器和stm32最小系统板,连线如下图所示。
这时候,打开串口助手,按下单片机上的复位按键,即可以看到信息被打印了出来。
当然也可以用逻辑分析仪抓取下芯片的TX引脚发出的波形。
用逻辑分析仪自带的解析工具,对usart的单片机Usart1_Tx(PA9)引脚波形进行解析,可以对着ascii表找到十进制对应的字符即可。
3 串口打印寄存器版本
3.1 配置时钟
RCC->APB2ENR |= (uint32_t)0x00000004;//打开GPIOA时钟RCC->APB2ENR |= (uint32_t)0x00004000;//打开USART1时钟
打开GPIOA和USART1的时钟。
3.2 配置GPIO功能
PA9(Usart1_Tx)设置为复用推挽输出,速度为50mhz。
GPIOA->CRH &= (uint32_t)0xFFFFFF0F;//使用前清零GPIOA->CRH |= (uint32_t)0x000000B0;//配置PB9为复用推挽输出,最大速度50MHz
PA10(Usart1_Rx)设置为浮空输入。
GPIOA->CRH &= (uint32_t)0xFFFFF0FF;//使用前清零GPIOA->CRH |= (uint32_t)0x00000400;//配置PA10为浮空输入
3.3 配置CR2寄存器
控制CR2寄存器的代码如下,对12、13位进行操作。
USART1->CR2 &= (uint16_t)0xCFFF; //使用前清零USART1->CR2 |= (uint16_t)0x0000; //停止位设置为1位
3.4 配置CR1寄存器
控制CR2寄存器的代码如下,对2、3、9、10、12位进行操作。
USART1->CR1 &= (uint16_t)0xE9F3; //使用前清除 M, PCE, PS, TE and RE位USART1->CR1 |= (uint16_t)0x000C; //设置一个起始位,8个数据位,无奇偶校验,使能发送,使能接收
下图是几个关键位的介绍