写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.08
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图

2、STM32F103C6和51对比

3、STM32F103C6核心板

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图

引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)

数据手册

解答和科普
一、串口发送

这是USB转串口模块,这里有个跳线帽,说过这个跳线帽要接在VCC和3.3V上,因为VCC是给CH340芯片供电,选择通信的TTL电平为3.3V, 然后通信引脚TXD和RXD要接在STM32的PA9和PA10口,为什么是这两个口呢,看一下引脚定义表,计划用USART1进行通信,所以选择这两个引脚。TX和RX交叉连接,不要接错了。在接线图里,接A9(TX)接的就是串口模块的RXD(接受), 然后串口模块的TXD(发送)要接在STM32的PA10(RX接收)。然后,两个设备之间要把负极接在一起,进行共地,一般多个系统之间互联,都要进行共地,这样电平才能有高低的参考。最后这个串口和STlink都要插在电脑上,这样STM32和串口模块都要独立供电,所以这里通信的电源正极就不需要接了,直接3根线就行了。

初始化流程:

第一步,开启时钟,把需要用的USART和GPIO的时钟打开;
第二部,GPIO初始化,把TX配置成复用输出,RX配置成输入;
第三步,配置USART,直接使用一个结构体,就可以把这里所有参数都配置好了;
第四步,如果你只需要发送的功能,就直接开启USART,初始化就结束了,如果你需要接受的功能,可能还需要配置中断,那就在开启USART之前,再加上ITConfig和NVIC的代码就行了。
那初始化完成之后,如果要发送数据,调用一个发送函数就行了,如果要接受数据,就调用接受的函数,如果要获取发送和接受的状态,就调用获取标志位的函数,这就是USART外设的使用思路。
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);
配置同步时钟输出的,包括时钟是不是要输出,时钟的极性相位等参数,因为参数比较多,也是用结构体配置的;
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
开启USART到DMA的触发通道;
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
这两个函数,在我们发送和接收的时候会用到;写和读DR寄存器,DR寄存器内部有4个寄存器,控制发送与接收,执行细节上一节已经分析过了,写DR就是发送,读DR就是接收,至于怎么产生波形。怎么判断输入,软件不管;
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
标志位相关函数
首先引脚模式:TX引脚是USART外设控制的输出脚,所以要选用复用推挽输出;
RX引脚是USART外设数据输入脚,所以要选择输入模式,输入模式并不分什么普通输入、复用输入,一根线只能有一个输出,但可以有多个输入,所以输入脚外设和GPIO都可以同时用,一般RX配置是浮空输入或者上拉输入,因为串口波形空闲状态时高电平,所以不使用下拉输入,引脚模式不清楚的话,还是可以看一下手册,GPIO那一节有个推荐的配置表,可以参考一下;目前只需要数据发送,所以只初始化TX就行了,引脚模式这里,选择AF_PP;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
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);
这样就是把PA9配置为复用推挽输出,供USART1的TX使用,那引脚就初始化好了;
配置USART
USART_InitTypeDef USART_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; //停止位1位
USART_InitStructure.USART_WordLength=USART_WordLength_8b; //数据位8位
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE); //开启
第一个参数波特率:可以直接写个9600就行,写完之后,这个Init函数内部会自动算好9600对应的分频系数,然后写入到BRR寄存器;
第二个参数是硬件流控制:我们不使用所以选择None;
第三个参数是串口模式:我们放到这里,这里可以选择TX发送模式和RX接收模式,如果你继续要发送有需要接收,那就用或符号把TX和RX或起来,
第四个参数是校验位:
第五个参数是停止位;
第六个参数哦是8位数据;
发送一个字节
void Serial_SendByte(uint8_t Byte) //发送一个字节
{
USART_SendData(USART1,Byte);
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
main.C
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "Serial.h"
int main(void)
{
OLED_Init();
Serial_Init();
Serial_SendByte(0x66)


1万+

被折叠的 条评论
为什么被折叠?



