目录
一、实验工具
1.STM32F103C8T6最小系统板
2.USB转TTL模块
3.发光二极管若干
4.杜邦线若干
5.KEIL5和STM32CubeMX软件
二、STM32实现LED灯闪烁——基于HAL库
1、CubeMXGPIO配置如下
· 芯片型号对应选择Stm32f103c8t6
· 对应时钟和I/O口配置如下,对应GPIOA1、GPIOA5、GPIOB9
· 详细CubeMX外设时钟配置流程参考如下链接:
2、流水灯程序
· 主要程序如下
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //PA1亮
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); //PA5灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); //PB9灭
HAL_Delay(1000); //延时1000
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //PA1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); //PB9亮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); //PB9灭
HAL_Delay(1000); //延时1000
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //PA1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); //PB9灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); //PB9亮
HAL_Delay(1000); //延时1000
· 程序主要函数分析
① HAL_GPIO_WritePin()
用于设置对应管脚的高低电平,第一个参数选择那一组IO口,第二个参数选择第几个Pin口,第三个参数设置该引脚的高低电平——GPIO_PIN_SET(高电平)、GPIO_PIN_RESET(低电平)
② HAL_Delay()
延时函数——后面变量为延时时间,单位为ms
3、keil仿真逻辑分析仪波形观察
· GPIOA_1、GPIOA_5、GPIOB_9波形观察如下
· 仿真波形与实际GPIO输出的电平变换保持一致
4、编译实现
· 实现效果如下
Flash_LED
三、STM32串口通信——基于寄存器
1、硬件连接
通过USB转TTL的RX与TX引脚分别与STM32F103最小系统板的TX(PA9)和RX(PA10)引脚连接
2、串口通信程序
· 程序代码如下
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "led.h"
//----------------APB2时钟使能寄存器-----------------//
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
#define RCC_APB2RSTR *((unsigned volatile int*)0x4002100C) //外设复位寄存器
#define GPIOA_CRH *((unsigned volatile int*)0x40010804) //GPIOA配置寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出端口配置寄存器
#define USART_SR *((unsigned volatile int*)0x40013800) //串口状态寄存器
#define USART_DR *((unsigned volatile int*)0x40013804) //数据寄存器
#define USART_BRR *((unsigned volatile int*)0x40013808) //波特比率寄存器
#define USART_CR1 *((unsigned volatile int*)0x4001380C) //usart1控制寄存器
uint8_t Tx_Buf[]="hello world!"; //定义串口发送数据缓冲区
int main()
{
//系统时钟配置
Stm32_Clock_Init(9); //PLL倍频器为9设置系统时钟为72M
//延时函数初始化
delay_init(72); //延时函数初始化为频率72M的时钟
//串口初始化
uart_init(72,115200); //串口初始化位时钟为72M,baud率为115200
while(1)
{
/************串口发送实验**************************/
int i=0;
for(;i<sizeof(Tx_Buf);i++) //发送数据
{
USART_DR=Tx_Buf[i];
while((USART_SR&0x40)==0); //等待一个字母发送完毕
}
delay_ms(1000); //延时100ms
}
}
· 程序主要函数分析
① 上面的宏定义UART对应配置寄存器和GPIO配置寄存器
② Stm32_Clock_Init(9); 系统时钟初始化配置,设置对应PLL倍频系数
③ delay_init(72);延时函数初始化,设置延时函数时钟频率
④ uart_init(72,115200); 通信串口初始化函数,设置时钟频率和波特率
⑤ USART_DR UART数据寄存器,将要发送的数据放入该寄存器等待发送
⑥ USART_SR UART状态寄存器,可查看寄存器对应标志位判断数据是否已经发送完成
3、串口助手设置
打开串口助手(博主使用的是正点原子的XCOM),先选择对应COM口(可根据设备管理器查看CH430对应的COM来设置),然后配置数据接收波特率(注意一定要与你程序中串口配置的波特率一致,不然你所接收到的数据很可能是乱码或者收不到),设置完成后即可打开串口开始uart实验
4、编译实现
· 实验效果如下
USART通信
四、总结
· Stm32的学习真的不能光停留在书本和老师讲解之中,必须自身亲自多实验才可以,你才能体会的到整个开发流程,不能够只停留在老师的讲解与书本之上。
· 通过本次实验体会到了寄存器与HAL库两种不同的开发方式,只能说HAL库确实方便,但是学习不到太多东西,如果想要深入学习了解嵌入式开发必须得熟悉寄存器工作原理及开发