前提准备:
1.库函数基础模板
2.stlink下载器、USB-TTL下载器、单片机最小开发板stm32F103C8T6
3.面包板及相关接线
4.vscode与keil的联合开发更流畅
5.串口软件,这个下面视频有
本文基于 哔哩哔哩 江科大自化协STM32入门教学
知识讲的非常详细,非常感谢作者的无私奉献,本文主要是基于此进行试验笔记。便于以后查找。
1.在库函数模板的前提下,在工程文件下新建文件夹Hardware,然后在keil中将文件目录加一下,Hardware文件下的文件也可以在keil下添加,添加时注意文件目录。保存关闭keil,打开VScode显示以下文件说明添加成功。具体步骤就不详细说明了,写过LED灯的应该都有了解。
2.在Hardware中添加文件夹Serial.c用来配置串口发送数据函数
首先是配置GPIO时钟以及USART时钟
void Serial_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
3.发送数据(以字节发送)
void Serial_SendByte(u8 Byte)
{
USART_SendData(USART1,Byte);
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
主函数中
int main(void)
{
Serial_Init();
Serial_SendByte(0x41);
}
4.发送数组
void Serial_SendArray(u8 *Array,u16 Length)
{
u16 i;
for ( i = 0; i < Length; i++)
{
Serial_SendByte(Array[i]);
}
}
主函数
u8 My_Array[] = {0x11,0x22,0x33,0x44};
int main(void)
{
Serial_Init();
Serial_SendArray(My_Array,4);
}
5.发送字符串
void Serial_SendString(char *String)
{
u8 i;
for(i=0; String[i]!='\0'; i++)
{
Serial_SendByte(String[i]);
}
}
主函数
int main(void)
{
Serial_Init();
Serial_SendString("Hello,world!\r\n");
}
6.发送数字
u32 Serial_Pow(u32 X,u32 Y)
{
u32 Result = 1;
while(Y--)
{
Result *= X;
}
return Result;
}
void Serial_SendNumber(u32 Number,u8 Length)
{
u8 i;
for ( i = 0; i < Length; i++)
{
Serial_SendByte((Number / Serial_Pow(10,Length - i - 1) % 10) + '0');
}
}
主函数
int main(void)
{
Serial_Init();
Serial_SendNumber(1234567890,10);
}
7.重定向prinf发送数据,这个需要**include<stdio.h>**别忘了
int fputc(int ch,FILE *f)
{
Serial_SendByte(ch);
return ch;
}
主函数
int main(void)
{
Serial_Init();
printf("Number=%d\r\n",666);
}
8.在7的基础上使用非封装sprintf函数
主函数
char String[100];
int main(void)
{
Serial_Init();
sprintf(String,"Number=%d\r\n",666);
printf(String);
}
9.使用封装sprinf函数,别忘了include<stdarg.h>
void Serial_Printf(char *format,...)
{
char String[100];
va_list arg;
va_start(arg,format);
vsprintf(String,format,arg);
va_end(arg);
Serial_SendString(String);
}
主函数
int main(void)
{
Serial_Init();
Serial_Printf("真的%d\r\n",666);
}
总的代码
Serial.c
#include "Serial.h"
void Serial_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void Serial_SendByte(u8 Byte)
{
USART_SendData(USART1,Byte);
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
void Serial_SendArray(u8 *Array,u16 Length)
{
u16 i;
for ( i = 0; i < Length; i++)
{
Serial_SendByte(Array[i]);
}
}
void Serial_SendString(char *String)
{
u8 i;
for(i=0; String[i]!='\0'; i++)
{
Serial_SendByte(String[i]);
}
}
u32 Serial_Pow(u32 X,u32 Y)
{
u32 Result = 1;
while(Y--)
{
Result *= X;
}
return Result;
}
void Serial_SendNumber(u32 Number,u8 Length)
{
u8 i;
for ( i = 0; i < Length; i++)
{
Serial_SendByte((Number / Serial_Pow(10,Length - i - 1) % 10) + '0');
}
}
int fputc(int ch,FILE *f)
{
Serial_SendByte(ch);
return ch;
}
void Serial_Printf(char *format,...)
{
char String[100];
va_list arg;
va_start(arg,format);
vsprintf(String,format,arg);
va_end(arg);
Serial_SendString(String);
}
Serial.h
#ifndef __SERIAL_H
#define __SERIAL_H
#include "stm32f10x.h"
#include <stdio.h>
#include <stdarg.h>
void Serial_Init(void);
void Serial_SendByte(u8 Byte);
void Serial_SendArray(u8 *Array,u16 Length);
void Serial_SendString(char *String);
void Serial_SendNumber(u32 Number,u8 Length);
void Serial_Printf(char *format,...);
#endif
main.c
#include "stm32f10x.h"
#include "Serial.h"
u8 My_Array[] = {0x11,0x22,0x33,0x44};
char String[100];
int main(void)
{
Serial_Init();
Serial_SendByte(0x41);
Serial_SendArray(My_Array,4);
Serial_SendString("Hello,world!\r\n");
Serial_SendNumber(1234567890,10);
printf("Number=%d\r\n",666);
sprintf(String,"Number=%d\r\n",666);
printf(String);
Serial_Printf("真的%d\r\n",666);
}
试验硬件接图
暂未用到屏幕,可不接
实验效果
按复位键,电脑串口接收到数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)